Laden...

Zähler in einer Funktion möglich?

Erstellt von MaWo80 vor 6 Jahren Letzter Beitrag vor 6 Jahren 3.426 Views
MaWo80 Themenstarter:in
106 Beiträge seit 2006
vor 6 Jahren
Zähler in einer Funktion möglich?

Hallo,

sitze seit langer Zeit nochmal vor dem Rechner und versuche was zu programmieren.
ich habe eine Funktion die per AT Befehle nachrichten an ein Modem sendet.

In dieser Funktion möchte ich einen Zähler integrieren, der hochzählt und alle 10 Nachrichten eine Pause macht.

Kann ein Zähler in einer Funktion das überhaupt machen ?

709 Beiträge seit 2008
vor 6 Jahren

Hallo,
wenn du mehrere Sachen in der gleichen Methode sendest, dann kannst du das innerhalb der Methode realisieren.
Du kannst für den Zähler aber auch ein Feld in der Klasse benutzen. Damit wird der Zähler auch über mehrere Methodenaufrufe hinweg im Objekt gehalten.
Wichtig ist hierbei, dass du das selbe Objekt dafür verwendest.

MaWo80 Themenstarter:in
106 Beiträge seit 2006
vor 6 Jahren

Das Problem das ich habe ist, das wenn ich einen Zähler in der Funktion definiere, dann wird beim nächsten Aufruf der Funktion der Zähler immer wieder auf Null gesetzt.

D
985 Beiträge seit 2014
vor 6 Jahren

Der Zähler wird NICHT zurückgesetzt, sondern neu erzeugt (auf dem Stack)

MaWo80 Themenstarter:in
106 Beiträge seit 2006
vor 6 Jahren

kann ich den irgendwie erzwingen das der Zähler nicht neu erzeugt wird ?

D
985 Beiträge seit 2014
vor 6 Jahren

Wenn du den Compiler komplett neu schreibst und die grundlegende Vorgehensweise komplett auf den Kopf stellst, ja 😁

P
1.090 Beiträge seit 2011
vor 6 Jahren

Wenn du ihn als Membervariable der Klasse deklarierst in dem die Methode ist. Dann wird er nur beim erzeugen der Klasse neu erzeugt.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

286 Beiträge seit 2011
vor 6 Jahren

Ein Codebeispiel wie du das bisher aufgebaut hast wäre hilfreich. Weil mir erschließt sich nicht ganz, wieso du die Variable nicht außerhalb der Funktion deklarierst:


    public class Program
    {
       private static int i = 0;

        public static void Main(string[] args)
        {
            if (i>9)
             {
                DontDoStuffAndWait();
                i = 0;
             }
            else
             {
                DoStuff();
                i++;
             }
        }
    }

Edit: Korrektur,thx@Th69
Das Beispiel iente aber auch hauptsächlich der Verdeutlichung, dass der Counter nicht innerhalb der Funktion instanziiert werden sollte

2+2=5( (für extrem große Werte von 2)

4.939 Beiträge seit 2008
vor 6 Jahren

emuuu: dein Programm compiliert so nicht (weil die Membervariable nicht auch static ist).

MaWo80: ansonsten kannst du den Code so übernehmen (nur eben auf 'static' verzichten, also objektorientiert Methode und Membervariable entwickeln).

3.003 Beiträge seit 2006
vor 6 Jahren

Wie emuuu sagt: das Zählen, wie oft die Methode aufgerufen wird, gehört nicht in die deklarierende Klasse, sondern in den aufrufenden Kontext.

Kurz gesagt, MaWo80: zähl dort hoch, wo die Methode aufgerufen wird, und nicht in der Methode.

LaTino

(Und da wir in .NET und nicht in TurboPascal sind, würd' ich es per Event machen...)


class Example
{
    public void ExampleMethod()
    {
        OnExampleMethodCalled();
        DoStuff();
    }

    private void DoStuff() => Console.WriteLine("Hello, world.");
    public event EventHandler ExampleMethodCalled;
    private void OnExampleMethodCalled() => ExampleMethodCalled?.Invoke(this, EventArgs.Empty);
}

class Program
{
    public static void Main()
    {
        int counter = 0;

        var example = new Example();
        example.ExampleMethodCalled += (s, e) => counter++;

        while (counter < 10) example.ExampleMethod();
    }
}


"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)