Autor Beitrag
Hoki
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 158

Win Xp SP3
D6 Enterprise, Turbo Delphi Explorer
BeitragVerfasst: Mo 12.06.06 14:05 
sowas würde ich mit einer while schleifen lösen 8)


:wink:
Hoki Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mo 12.06.06 14:09 
user profile iconhackerTreff hat folgendes geschrieben:
sowas würde ich mit einer while schleifen lösen 8)


Kannst du das mal ein bisschen genauer beschreiben? Bin momentan ein bissel verBUGt vor Verzweifelung. :-)
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 12.06.06 14:16 
Du kannst schreibbare typisierte Konstanten benutzen. Über Compilerschalter {$J+} aktivierbar:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
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
BeitragVerfasst: Mo 12.06.06 14:16 
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mo 12.06.06 14:49 
Hab noch ein Problem, wie setze ich die Variable (hier foo) wieder auf 1 zurück?
SmileySN
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 297

WinXP, Win7
Delphi 2010 Professional
BeitragVerfasst: Mo 12.06.06 15:19 
Wäre da nicht eine Zuweisung angebracht ?
ausblenden Delphi-Quelltext
1:
Foo := 1;					
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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.

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mo 12.06.06 15:58 
ausblenden 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 {Bedingung} then
    begin
     {Anweisung}
     if i<n then begin
       setzen(i+1,n);
      end;
     {Anweisung}
    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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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!