| Autor |
Beitrag |
F4n4T!C
      
Beiträge: 25
|
Verfasst: Sa 01.12.07 14:46
hi leute...ich muss da mal wieder ein problem posten^^
also in meinem quelltext will ich von prozedur 1 auf prozedur 2 ufrufen...dass ist ja kein problem, leider springt er aber, nach der Ausführung von prozedur 2, dann wenn er fertig ist, wieder zurück in prozedur 1
prozedur 1
es wird etwas berechnet
es wird noch mehr berechnet
wenn etwas nicht erfüllt ist aufruf von prozedur 2 | springt in prozedur 2 und arbeitet die ab
sonst weiterrechnen<----| springt dann wieder hier rein soll er aber nicht^^
ende von prozedur 1
prozedur 2
rechnen
rechnen
rechnen
ende von prozedur 2-------| hier sollte das programm jetzt zu ende sein
könnt ihr mir bitte helfen?
danke im vorraus
F4n4T!C
Moderiert von Narses: Titel geändert.
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Sa 01.12.07 14:51
Du musst schon Deinen richtigen Quelltext posten, wenn man Dir helfen soll. 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 01.12.07 15:04
Beende doch das Programm in Prozedur 2.
|
|
DrRzf
      
Beiträge: 260
Win XP Prof
D7 Enterprise
|
Verfasst: Sa 01.12.07 23:35
Wenn du eine procedure (oder auch function) aufrufst, kommst du nach Abarbeitung dieser procedure immer wieder an den Aufrufepunkt zurück. das Programm läuft nach Abbarbeitung dieser immer dort weiter wo du diese aufrufst, ausgenommen ist natürlich dass du in der aufgerufenen procedure das Programm nicht beendest, oder durch einen Fehler (endlosschleife) dort drinnen hängenbleibst.
_________________ rein statistisch gesehen darf man keiner statistik trauen die man nicht selbst gefälscht hat.
|
|
F4n4T!C 
      
Beiträge: 25
|
Verfasst: So 02.12.07 01:00
würde es aber theoretisch gehen, dass ich in prozedur 2 das programm beende?
ich hatte auch schin versucht
prozedur 2
begin
end;
end.
direkt dahinter, aber hilft auch ne...gibt es einen befehl dafür, dass er dann den durchlauf des programmes beenden würde? (weil ich geh in mehrere prozeduren hinein, und die enden im endefekt nicht so richtig^^)
danke schonmal für eure hilfe...F4n4T!C
|
|
TGLDX
      
Beiträge: 22
|
Verfasst: So 02.12.07 01:08
Mit halt kannst du dein Programm beenden
Delphi-Quelltext 1: 2: 3:
| ShowMessage('Hallo'); halt; ShowMessage('Das wird nie angezeigt!'); |
|
|
DrRzf
      
Beiträge: 260
Win XP Prof
D7 Enterprise
|
Verfasst: So 02.12.07 01:34
Poste doch mal deinen Sourcecode und was willst du überhaupt machen ?
Wenn ich ein Programm beenden will schreib ich einfach
Delphi-Quelltext
aber willst du jetzt das Programm beenden ? oder kommst du nicht mehr aus einer procedure ? hängt sich das Program auf ?
_________________ rein statistisch gesehen darf man keiner statistik trauen die man nicht selbst gefälscht hat.
|
|
F4n4T!C 
      
Beiträge: 25
|
Verfasst: So 02.12.07 11:07
so ok dass wird ein langer text^^
also ich habe dominosteine gegeben...und soll vergleichen, ob man diese dominosteine nun zu einem kreis legen kann
dazu gibt es verscheidene möglichkeiten die zu vergleichen
gegeben:
domino stein eins:
links1 rechts1
domino stein zwei:
links2 rechts2
jetzt kann ich vergleichen:
links 1 mit rechts 1;links 1 mit rechts2;links 2 mit rechts 1; links 2 mit rechts 2
wenn es hier keine lösung gibt, springt er in prozedur 2 und vergleicht:
links 1 mit links 2; ....
wenn es da auch keine lösung gibt, soll er in prozedur 3 springen und vergleicht:
rechts1 mit rechts 2;rechts 1 mit rechts 3...und es rutscht halt immer weiter
wenn es hier keine lösung geben sollte, soll eine nachricht kommen "kann nicht gehen" aber dass programm soll nicht beendet werden, sondern der user soll die möglichkeit haben, neue eingaben zu machen
aber wenn er in prozedur 3 auf ergebnis kommt kann nicht gehen, springt er ja dann in prozedur 2, und vergleicht wieder das falsche -.-
so mein quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) ListBox1: TListBox; Button1: TButton; ListBox2: TListBox; Edit1: TEdit; Edit2: TEdit; Button2: TButton; Label1: TLabel; ListBox3: TListBox; ListBox4: TListBox; Label2: TLabel; Button3: TButton; Button4: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Edit1KeyPress(Sender: TObject; var Key: Char); procedure Button4Click(Sender: TObject); private public end;
var Form1: TForm1; n,x,k : word; a,b,c,d,e : string; feld1: array[0..2500]of integer; feld2: array[0..2500]of integer; feld3: array[0..2500]of integer; feld4: array[0..2500]of integer; i,j,z,q,w :byte; gleich: boolean; implementation {$R *.dfm} procedure vergleich1(n:integer);forward; procedure vergleich2(n:integer);forward; procedure vergleich3(n:integer);forward; procedure geht(n:integer);forward; procedure geht_nicht(n:integer);forward; procedure vergleich4(n:integer);forward; procedure vergleich5(n:integer);forward; procedure vergleich6(n:integer);forward; procedure ende(n:integer);forward;
procedure vergleich1(n:integer); begin if ((n<(j)) and ((feld1[n])=(feld2[(z)]))) then begin geht(n); end else begin if z=j then begin n:=n+1; z:=0; vergleich1(n); end; if n=j then begin n:=0; z:=0; vergleich2(n); end; z:=z+1; vergleich1(n); end; end;
procedure vergleich2(n:integer); begin if Feld1[n] = feld1[z] then begin if z=n then begin z:=z+1; vergleich2(n); end; geht(n) end else begin if n=j then begin n:=0; z:=0; vergleich3(n); end; if z=n then begin z:=z+1; vergleich2(n); end; if z=j then begin n:=n+1; z:=0; vergleich2(n) end; z:=z+1; vergleich2(n); end; end;
procedure vergleich3(n:integer); begin if Feld2[n] = feld2[z] then begin if z=n then begin z:=z+1; vergleich3(n); end; geht(n) end else begin if n=j then begin n:=0; z:=0; geht_nicht(n); end; if z=n then begin z:=z+1; vergleich3(n); end; if z=j then begin n:=n+1; z:=0; vergleich3(n) end; z:=z+1; vergleich3(n); end; end;
procedure geht(n:integer); begin feld3[q]:=Feld1[n]; feld4[w]:=feld2[n]; q:=q+1; w:=w+1; feld3[q]:=Feld1[z]; feld4[w]:=feld2[z]; q:=q+1; w:=w+1; end;
procedure geht_nicht(n:integer); begin showmessage('es gibt leider keine komplette Lösung'); ende(n); end;
procedure vergleich4(n:integer); begin
end;
procedure vergleich5(n:integer); begin
end;
procedure vergleich6(n:integer); begin
end; procedure TForm1.Button1Click(Sender: TObject); begin feld1[i]:=strtoint(edit1.text); feld2[j]:=strtoint(edit2.text); ListBox1.Items.Add(inttostr(feld1[i])); ListBox2.Items.Add(inttostr(feld2[j])); i:=i+1; j:=j+1; edit1.Text:=('0'); edit2.Text:=('0'); end;
procedure TForm1.FormCreate(Sender: TObject); begin x:=0; z:=0; n:=0; i:=0; j:=0; end;
procedure TForm1.Button2Click(Sender: TObject); begin if ((n<(j)) and ((feld1[n])=(feld2[(n+1)]))) then begin Label1.caption:=inttostr(n); gleich:=true; end else begin z:=z+1; vergleich1(n); end;
end; procedure TForm1.Button3Click(Sender: TObject); var k: integer; begin gleich:=false; listbox1.Items.Clear; listbox2.Items.Clear; for k:=0 to 2500 do begin feld1[k]:=0; feld2[k]:=0; end;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if not(Key in ['0'..'9',#8]) then Key:=#0; end; procedure TForm1.Button4Click(Sender: TObject); begin randomize; edit1.text:=inttostr(random(20)); edit2.text:=inttostr(random(20)+20); end; procedure ende(n:integer); begin end; end.
|
ok ende des langen textes...danke für eure bemühungen zur zeit (= hoffe ihr könnt mir da jetzt helfen^^
mfg F4n4T!C...und einen wunderschönen 1. advent  weihnachten is bald da (=
|
|
DrRzf
      
Beiträge: 260
Win XP Prof
D7 Enterprise
|
Verfasst: So 02.12.07 16:23
Ich vermute du hast hier eine wunderschöne Endlosschleife Programmiert. (nicht getestet)
Du rufst in der Prozedure ''vergleich1'' die procedure ''vergleich1'' auf.
ebnso rufst du von dort ''Vergleich2'' auf die wiederumm ''vergleich2'' und ''vergleich3'' aufruft.
''vergleich3'' ruft sich wiederum an 3 verschiedenen stellen selbst auf.
man kann zwar sich selbst aufrufende proceduren programmieren, aber diese enden sehr gern in endlosschleifen.
ausserdem willst du ja nicht das programm in diesen prozeduren beenden, sondern nur die schleifen verlassen.
_________________ rein statistisch gesehen darf man keiner statistik trauen die man nicht selbst gefälscht hat.
|
|
F4n4T!C 
      
Beiträge: 25
|
Verfasst: So 02.12.07 22:57
dieses die prozeduren rufen sich selbst auf, bedeutet rekursion, und so muss ich das programmieren...ich würde es auch gerne als iteration mit einer for...to repeat...until machen, aba da sagt mein meister was dagegen...also muss ich dass so machen....wäre also besser wenn ich alles in eine prozedur reinquetsche?
|
|
DrRzf
      
Beiträge: 260
Win XP Prof
D7 Enterprise
|
Verfasst: Mo 03.12.07 01:20
dammnich ^^, die rekursion wars  bin da gestern irschendwie nimma draufgekommen.
kanst mir mal dein gesamtes projekt hochladen ?
hab grad versucht das im source nachzuvollziehen aber find da kein weg durchzukommen.
auch wäre villeicht eine kleine beschreibung welche eingaben dein programm erwartet recht hilfreich.
_________________ rein statistisch gesehen darf man keiner statistik trauen die man nicht selbst gefälscht hat.
|
|
F4n4T!C 
      
Beiträge: 25
|
Verfasst: Mo 03.12.07 08:35
jaja die mieße rekursion^^ und dass soll ICH hinbekommen  naja scherz beiseite hab ja euch (=
also kurze erklärung meines programmes...
du hast ganz oben 2 edit boxen, dort kannst du jeweils deine Zahlen eingeben die verglichen werden sollen...dass ist auch schon das einzigste was du eingeben musst^^ (rechts auf dem button werden zufallszahlen so erzeugt, dass vergleich 1 nicht funktionieren kann, und er mindestens in vergleich 2 muss) ... dann denke ich ist es hilfreich wenn du dir die parameter z:integer; n:word; j:byte; überwachen lässt, damit du auch siehst if z=j then .... if n=j then
j ist immer um eine Zahl größer, als ich (der user) zahlen in das array eingebe...also...wenn ich 3 zahlen eingebe, ist j=3 (beginnt ja bei 0) ... n und z beginnen auch bei null...n ist prinzipiell die Zahl für den stein der gerade ein passendes gegenstück sucht, und z ist die zahl, für alle anderen steine (ich füge dann noch ein bild mit an)
hoffe es gibt keine allzugroßen probleme mehr...achso fällt mir noch ein^^ du solltest glaube ich dir das schrittweise anzeigen lassen (so dass du mit F7 weitermachst) sonst kommt da "stack überfüllt" oda sonen quark
Einloggen, um Attachments anzusehen!
|
|
DrRzf
      
Beiträge: 260
Win XP Prof
D7 Enterprise
|
Verfasst: Mo 03.12.07 18:13
stack überfüllt, deutet darauf hin dass er in der rekursion amokläuft.
da sich bei jedem aufruf der funktion mehr daten auf dem stack befinden, und dieser dann irgendwann überläuft.
was mir anhand des sources schon gestern aufgefalen ist, dass deine schleife anscheinend über die 2500 hinauslaufen kann, wegen fehlender abbruchbedingung.
mal sehn was der debugger heut abend sagt.
_________________ rein statistisch gesehen darf man keiner statistik trauen die man nicht selbst gefälscht hat.
|
|
F4n4T!C 
      
Beiträge: 25
|
Verfasst: Mo 03.12.07 19:16
also im moment klar kann man für die arrays mehr als 2500 zahlen angeben (im array sind die zahlen gespeichert, die verglichen werden) und dass wird irgendwann auf 65000 erweitert, aber zur zeit wollte ich das jetzt nicht^^...ja ich glaube auch dass der einfach durch diese endlosschleife viel zu viele infos liefert, und ich will ja garnicht dass er in der endlosschleife ist  ich will dass der von prozedur zu prozedur springt, und wen er bei prozedur "geht_nicht" ist, soll schluss sein, dann hat der user die möglichkeit das zu verändern
|
|
DrRzf
      
Beiträge: 260
Win XP Prof
D7 Enterprise
|
Verfasst: Mo 03.12.07 23:07
warum nimmst du dann nicht gleich ein dynamisches array ?
dann ist das array immer so lang wie es gerade gebraucht wird, und es muss später auch nicht immer von hand angepasst werden. ausserdem hättest du durch die länge des arrays immer einen leicht zu findenden wert wo ende ist ohne das ganze array durchzuwühlen wo der letzte wert steht, bzw eine hilfsvariable aktuell zu halten.
Delphi-Quelltext 1:
| MyArray : array of integer; |
wenn du darin etwas hinzufügen willst musst du erst deren länge anpassen
dann den wert an der letzten position des arrays speichern.
Delphi-Quelltext 1: 2:
| SetLength(MyArray,Length(MyArray) + 1); MyArray[x] := wert |
und abbruchbedingungen, in den einzelnen schleifen festlegen, falls dei letzte positions des array erreicht wird.
_________________ rein statistisch gesehen darf man keiner statistik trauen die man nicht selbst gefälscht hat.
|
|
F4n4T!C 
      
Beiträge: 25
|
Verfasst: Di 04.12.07 06:44
dass ist ja schonmal eine spitzen idee^^ ... werd ich mich heute abend mal ransetzen...hast du eine möglichkeit für den Ausweg aus der endlosschleife gefunden? ... was wäre wenn ich eine extra boolean variable nehme, und in jeder prozedur einfüge
Delphi-Quelltext
könnte ich den schleifen da entgehen wenn ich
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| procedure vergleich1(n:integer); begin if ((n<(j)) and ((feld1[n])=(feld2[(z)]))) then begin geht(n); end else begin if z=j then begin n:=n+1; z:=0; vergleich1(n); end; if n=j then begin n:=0; z:=0; vergleich2(n); end; z:=z+1; vergleich1(n); end; if variable=true then begin showmessage('es gibt eine Lösung') end; end; |
damit wäre die prozedur an einer stelle beendet, wo eigentlich kein wiederaufruf der schleife steht, sie müsste also in die obrige prozedur springen!? oder hab ich jetzt einen denkfehler?
|
|
zuma
      
Beiträge: 660
Erhaltene Danke: 21
Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
|
Verfasst: Di 04.12.07 09:04
Derzeit wird immer vergleich1 angesprungen, egal,
ob er in vergleich2 springt, oder nicht ...
versuchs mal mit dem einfügen eines else-zweiges.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| if n = j then begin .... end else begin z := z+1; vergleich1(n); end; |
Die Zeilen 24 bis 27 solltest du dann nicht mehr benötigen.
_________________ Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Di 04.12.07 09:12
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
F4n4T!C 
      
Beiträge: 25
|
Verfasst: Di 04.12.07 21:47
aber
Delphi-Quelltext
sollen immer dann ausgeführt werden, wenn z nicht j und n nicht j ist...also bringt e smir eig nix wenn ich da irgendwo nen else reinsetze, weil er springt ja im richtigen moment in prozedur 2...nur soll er nicht swieder zurück in prozedur 1, sondern der verzweigung folgen, bis zur prozedur "geht" oder prozedur "geht_nicht" und dann soll das programm eigentlich bei end. angelangt sein
|
|
DrRzf
      
Beiträge: 260
Win XP Prof
D7 Enterprise
|
Verfasst: Di 04.12.07 23:10
bin leider gestern nichtmehr dazu gekommen das mal durch den debugger zu schieben.
es währe villeicht auch noch möglich mit Labels und goto ans ende zu kommen.
es muss aber auch mit einer if then else if then else.....
kombination funktionieren.
goto ist in delphi zwar vorhanden (es soll ja leute geben die von der basic seite zuwandern ^^) wird aber nicht gern gesehn.
Edit:
habs mir jetzt grad mal angesehn. irgendwie steig ich noch nicht ganz durch was das programm überhaupt machen soll.
du hast 2 listboxen in die paarweise zahlen eingetragen werden.
gilt so ein paar als dominostein ? (warum vergleicht er dann L+R in der selben reihe ?)
wenn da jetzt zb die liste so gefüllt ist
1 - 2
2 - 3
3 - 1
dann könnte ich diese zu einem kreis legen 1-2|2-3|3-1 dann die 1 wieder zum ersten.
bzw wie müssen die felder gefüllt werden dass es gehen sollte ?
wenn ich
1 - 2
2 - 1
eingebe, dann kommt meldung dass es geht, fürge ich beliebige weitere hinzu bleibt es dabei dass es geht.
_________________ rein statistisch gesehen darf man keiner statistik trauen die man nicht selbst gefälscht hat.
|
|