| Autor |
Beitrag |
Hoki
Hält's aus hier
Beiträge: 8
|
Verfasst: Mo 12.06.06 13:53
Hallo!
Ich möchte in einer Prozedur, die sich nur bei bestimmten Werten von selbst wieder aufruft, eine Zählervariable einführen, welche eben diese einzelnen Aufrufe zählt. Ich weiß, das es mit globalen Variablen kein Problem ist, in die Prozedur z.B. zähler:=zähler+1; einzubauen, hat auch funktioniert, jedoch möchte ich keine globale Variable verwenden. Wenn ich nun die Variable in der Prozedur deklariere, wird der Wert leider falsch berechnet. Sobald die Prozedur durchgelaufen ist ohne sich neu aufgerufen zu haben, springt sie (backtrackt) wieder in sich zurück und setzt auch die Variable zurück, anstatt sie weiter zu zählen. Kann man diesen Zähler vielleicht in eine Funktion auslagern und wie würde das dann umzusetzen sein?
Ich weiß, es klingt ziemlich verwirrend, aber ich hoffen ihr könnt mir trotzdem helfen  .
Hoki
|
|
Clemens L.
      
Beiträge: 158
Win Xp SP3
D6 Enterprise, Turbo Delphi Explorer
|
Verfasst: Mo 12.06.06 14:05
sowas würde ich mit einer while schleifen lösen

|
|
Hoki 
Hält's aus hier
Beiträge: 8
|
Verfasst: Mo 12.06.06 14:09
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 12.06.06 14:16
Du kannst schreibbare typisierte Konstanten benutzen. Über Compilerschalter {$J+} aktivierbar:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| {$J+} procedure myProz; const foo : Integer = 1; begin ShowMessage(IntToStr(foo)); foo := foo +1; end; {$J-} |
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Fighter#1
      
Beiträge: 787
Win XP, Ubuntu 8.04
Turbo Delphi 2006, Delphi 2005 Pe, Delphi 5 Pe, Netbeans 6.1, Eclipse, Microsoft VisualC#, Dev C++, PHP, HTML, CSS
|
Verfasst: Mo 12.06.06 14:16
Delphi-Quelltext 1: 2: 3: 4: 5:
| zaheler:=0; While zaehler<100 do begin zaehler:=zaehler+1; end; |
_________________ Wer andere beherrscht ist stark,
wer sich selbst beherrscht ist mächtig. Lao Tse
|
|
Hoki 
Hält's aus hier
Beiträge: 8
|
Verfasst: Mo 12.06.06 14:28
Vielen Dank @Christian S. ....hat funktioniert.  Wäre ich auch nie drauf gekommen. Die andere Sache mit der Whileschleife versteh ich nur nicht, wird dann die Variable durch die Whileschleife nicht zurückgesetzt?
|
|
Hoki 
Hält's aus hier
Beiträge: 8
|
Verfasst: Mo 12.06.06 14:49
Hab noch ein Problem, wie setze ich die Variable (hier foo) wieder auf 1 zurück?
|
|
SmileySN
      
Beiträge: 297
WinXP, Win7
Delphi 2010 Professional
|
Verfasst: Mo 12.06.06 15:19
Wäre da nicht eine Zuweisung angebracht ?
Delphi-Quelltext
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 12.06.06 15:20
Von außen (also ausserhalb der Prozedur) kannst Du nicht drauf zugreifen. Du wirst der Prozedur also einen Parameter übergeben müssen, der angibt, ob der Paramter zurückgesetzt werden soll.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| {$J+} procedure myProz(reset : Boolean = false); const foo : Integer = 1; begin if reset then foo := 1; ShowMessage(IntToStr(foo)); foo := foo + 1; end; {$J-} |
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Hoki 
Hält's aus hier
Beiträge: 8
|
Verfasst: Mo 12.06.06 15:39
Von außen habe ich vorhin auch schon probiert, allerdings kommt dann ein falscher Wert heraus. Ich nehme an da ja die Prozedur backgetrackt wird, habe ich ja beim ersten Aufruf "reset" auf TRUE gesetzt, und wenn sich die Prozedur selbst wieder aufruft, dann soll reset auf FALSE stehen. Das Problem dabei ist, dass er ja irgendwann zum allerersten Aufruf zurückkehrt und sich den Wert vom ersten reset gemerkt hat und diesen dann wieder auf TRUE zurücksetzt. Deshalb hat ja auch die Zählvariable zu beginn nicht funktioniert. Ich kann mir das nicht anders erklären und bin auch ein wenig ratlos.
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 12.06.06 15:43
Was heisst bei Dir "backgetrackt?" Und welche Sprache soll das sein? Meinst Du einen rekursiven Aufruf? Vielleicht postest Du einfach mal Deine Prozedur hier hinein, wenn sie nicht allzu groß ist.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Hoki 
Hält's aus hier
Beiträge: 8
|
Verfasst: Mo 12.06.06 15:58
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| {$J+} procedure TForm1.setzen(i,n: integer); var j :integer; const foo : Integer = 0; begin for j:= 1 to n do begin foo:=foo+1; if then begin if i<n then begin setzen(i+1,n); end; end; end; end; |
So in etwa sieht das aus, i kommt das erste Mal mit 1 rein und wird solange abgearbeitet bis i=n ist.
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 12.06.06 17:42
musst Du foo dann nicht einfach dann wieder zurücksetzen, wenn i=1 ist?
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Hoki 
Hält's aus hier
Beiträge: 8
|
Verfasst: Di 13.06.06 12:31
Wenn i=1 kann ich foo nicht zurücksetzen, da der Wert von i innerhalb der Prozedur erhöht wird aber zwischenzeitlich eben wieder den Wert 1 annimmt. Ich habe aber eine Lösung gefunden. Da ich weiß das i nicht 0 wird bei der normalen Abarbeitung, lasse ich die Prozedur einfach mit i:=0 aufrufen und lasse dann foo zurücksetzen.
Danke für eure Hilfe!
|
|