Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 19, 2025 20:48

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Selbstaufruf von proceduren
BeitragVerfasst: Di Aug 23, 2005 17:10 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 02, 2003 12:47
Beiträge: 300
Wohnort: Marburg
Gibt es etwas, dass ich bechten muss, wenn ich funktionen oder proceduren schreibe, die sich beabsichtigt selbst aufrufen?

Etwa, wenn ich möchte, dass ein schachprogramm fünf züge im vorraus rechnet, könnte ich entweder fünf repeat-schleifen ineinander schreiben (die fast alle dass selbe beinhalten) oder ich schreibe eine funktion mit einer schleife, die sich in der schleife selber aufruft (natürlich mit abfrage um auch wiklich nur fünf züge zu berechnen)...

Ich stelle die Frage, weil ich probleme mit den variable, die in der funktion deklariert sind, habe, die ich mir nicht erklären kann!

Das sieht in etwa so aus (stark vereinfacht!):

Code:
  1.   function CalculateNextStep(S,G,AP,PP: Byte): smallint;
  2.   var
  3.     i: Integer;
  4.     B: Smallint;
  5.   begin
  6.     CalculatePossibilitys(@Sets[S-1,G],@Sets[S],AP,PP);
  7.     if S=N then begin
  8.       if (S/2)=Trunc(S/2) then begin
  9.         result:=100;
  10.         for i := 1 to Sets[S-1,G].Possibilitys do begin
  11.           if Sets[S,i].Balance<result then begin
  12.             result:=Sets[S,i].Balance;
  13.           end;
  14.         end
  15.       end else begin
  16.         result:=-100;
  17.         for i := 1 to Sets[S-1,G].Possibilitys do begin
  18.           if Sets[S,i].Balance>result then
  19.             result:=Sets[S,i].Balance;
  20.         end
  21.       else result:=-99;
  22.       end;
  23.     end else begin
  24.       if (S/2)=Trunc(S/2) then begin
  25.         result:=100;
  26.         for i := 1 to Sets[S-1,G].Possibilitys do begin
  27.           B:=CalculateNextStep(S+1,i,PP,AP); /// selbstaufruf!!!
  28.           if (B<result) and (B<>-100) then begin
  29.             result:=B;
  30.           end;
  31.         end
  32.       end else begin
  33.         result:=-100;
  34.         for i := 1 to Sets[S-1,G].Possibilitys do begin
  35.           B:=CalculateNextStep(S+1,i,PP,AP); /// selbstaufruf!!!
  36.           if (B>result) and (B<>100) then begin
  37.             result:=B;
  38.           end;
  39.         end
  40.       end;
  41.     end;
  42.   end;

_________________
Nothing, oh sweet nothing,
today we are doing nothing at all...
http://www.geo-progs.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 23, 2005 17:16 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 13, 2004 11:00
Beiträge: 229
Wohnort: Steinhude
ausser ddass du keine entlosaufrufe produzierst gibts da ansich nich soviel zu beachten. vll. könntest du etwas spezifischer bezüglich deiner Probleme werden.


ps: nennt sich übrigens rekursion ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 23, 2005 17:51 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Falls du viele lokale Variablen und eine hohe Rekursivstiefe hast, kann es passieren, dass der Stack nicht ausreicht, aber das kann man dann in den Projektoptionen/Linkereinstellungen umstellen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 23, 2005 18:38 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 02, 2003 12:47
Beiträge: 300
Wohnort: Marburg
Dass programm ansich läuft (~1000 zeilen).
Ich erhalte allerdings ergebnisse, die ich nicht so ganz erwarte.
Dass programm spielt absulut regelkonform, aber schlecht.
Ich habe mir deshalb die variablen angeschaut, welche zur Bewertung der züge diehnen und hier tauchen zahlen auf, die ich mir nicht erklähren kann...

und mir ist dabei aufgefallen:
die Schleifenvariablen zeigen wehrte an um 98722156 obwohl die Schleife nur bis ~30 (die Obergrentze wird korrekt angezeigt) zählt?!?

kann es sein, dass delphi in bestimmten Situationen Variabkenwehrte falsch anzeigt, wenn ich dass programm anhalte?

Und danke für die antworten (jetzt weiß ich wenigstens, dass es eigentlich funktionieren müsste :-))!

_________________
Nothing, oh sweet nothing,
today we are doing nothing at all...
http://www.geo-progs.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 23, 2005 18:40 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Ja im Debugger werden Zählvariablen manchmal falsch angezeigt. Optimierung des Programms ausschalten und neu erstellen hilft da meistens.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 23, 2005 19:31 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 02, 2003 12:47
Beiträge: 300
Wohnort: Marburg
meinst du unter projekt-optionen-compiler? hilft nicht!

Aber andere variablen haben auch zahlensalat (die schachbretter in den tieferen zug ebenen :-) , aber nur sehr selten, scheinbar zufällig...)

Ich glaube ich habe da irgendwo noch nen gröberen fehler! nur witzig , dass das programm eigentlich läuft... Nur gelegentlich macht es schwachsinnige züge und hat eine völlige unfähigkeit schach matt zu setzen :shock:

Hm, werde wohl noch mal alles durchgehen und nochmal und... Binn mal gespannt auf den fehler!

_________________
Nothing, oh sweet nothing,
today we are doing nothing at all...
http://www.geo-progs.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 05, 2005 15:52 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Wenn Deine Schleife mehrzeilig ist, marke:
Code:
  1. For iLoop:=0 to 100
  2. Do Begin
  3. ...
  4. End;

, also das Do unter dem For steht, wird die Zeile mit dem For 'fehlinterpretiert', d.h. da einen Unterbrechungspunkt gesetzt, bewirkt, dass 1. erst beim ZWEITEN Schleifendurchlauf angehalten wird und dass 2. wenn du mit F8 arbeitest, die Schleifenvariable beim ersten mal nicht initialisiert wird.
Unterbrechungspunkt auf die Zeile mit dem Do behebt das Problem.

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 10 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]