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 ?
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.
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.
Der Zähler wird NICHT zurückgesetzt, sondern neu erzeugt (auf dem Stack)
Wenn du den Compiler komplett neu schreibst und die grundlegende Vorgehensweise komplett auf den Kopf stellst, ja 😁
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:
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)
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).
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)