Autor Beitrag
F4n4T!C
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: 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 user profile iconNarses: Titel geändert.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 01.12.07 14:51 
Du musst schon Deinen richtigen Quelltext posten, wenn man Dir helfen soll. :zwinker:

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 01.12.07 15:04 
Beende doch das Programm in Prozedur 2.
DrRzf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260

Win XP Prof
D7 Enterprise
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



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



BeitragVerfasst: So 02.12.07 01:08 
Mit halt kannst du dein Programm beenden

ausblenden Delphi-Quelltext
1:
2:
3:
ShowMessage('Hallo');
halt;
ShowMessage('Das wird nie angezeigt!');
DrRzf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260

Win XP Prof
D7 Enterprise
BeitragVerfasst: 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

ausblenden Delphi-Quelltext
1:
Form1.Close					


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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: 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
ausblenden volle Höhe 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:
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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 // dass ist der erste versuch wie oben beschrieben
       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);//hier soll gesprungen werden, wenn es keine lösungen gibt, aber er soll nicht wieder zurückspringen
           end;
         z:=z+1;
         vergleich1(n);
       end;
end;

procedure vergleich2(n:integer);
begin
  if Feld1[n] = feld1[z] then//wie bei prozedur 2 beschrieben
    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);//wenn bei prozedur kein stein zusammen passt, springt er in prozedur 3
      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//beschrieben wie bei prozedur 3
    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);//wenn es also weder in prozedur 1 noch 2 noch 3 eine lösung gibt, dann soll er in prozedur geht_nicht springen, und nicht wieder zurückspringen, sondern dann soll gezeigt werden "es gibt keine lösung, versuchen sie es nochmal" und man kann dann wieder zahlen eingeben...so wie es jetzt ist, springt er aber in prozedur geht nicht, arbeitet die ab, und springt dann wieder zurück in prozedur 3...dass darf ne passieren ;)
      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;
       //showmessage('geht')
     end
     else
       begin
         z:=z+1;
         vergleich1(n);
       end;


//if ((n=j) and (gleich=false)) then showmessage('geht ne');
//if gleich=true then showmessage('geht');

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.




 {if  (gleich=2) then
   begin
     showmessage('geht ne');
   end;
 if gleich=1 then
   begin
     showmessage('geht');
   end;}









  {  listbox1.Items.add(edit1.Text);
   listbox2.Items.Add(edit2.text);}


 { if (listbox1.Items[n]) = (listbox2.Items[n+1]) then   //hier soll
  //überprüft werden, ob irgendeine stelle aus der listbox1 mit der
  //darauffolgenden stelle aus der listbox2 übereinstimmt
  //(also quasie stelle 1 aus listbox1 mit stelle 2 aus listbox2
     begin
       b:=ListBox1.Items[n];
//       b:=(booltostr(listbox1.ItemIndex=n));    //wenn es eine stelle gibt, sollen
//       c:=(booltostr(listbox1.ItemIndex=(n+1)));//die zahlen in listbox3 und 4
       c:=ListBox1.Items[n+1];
//       d:=(booltostr(listbox2.ItemIndex=n));    //eingetragen werden, aber es
       d:=ListBox2.Items[n];
//       e:=(booltostr(listbox2.ItemIndex=(n+1)));//erscheinen immer nur nullen
       e:=ListBox2.Items[n+1];
       listbox3.items.add(b);                   //und die nachricht, dass es eine
       listbox3.items.add(c);                   //lösung gibt, erscheint immer
       listbox4.Items.add(d);                   //was könnte der fehler sein?
       listbox4.items.add(e);                   //(bitte nicht sagen array verwenden
       label1.caption:=inttostr(n);             //da ich erstmal was eigenes versuchen wollte)
       showmessage('es gibt eine Lösung');      //danke für die hilfe ;)
     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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260

Win XP Prof
D7 Enterprise
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260

Win XP Prof
D7 Enterprise
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: Mo 03.12.07 08:35 
jaja die mieße rekursion^^ und dass soll ICH hinbekommen :D 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260

Win XP Prof
D7 Enterprise
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: 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 :D 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260

Win XP Prof
D7 Enterprise
BeitragVerfasst: 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.

ausblenden 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.

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: 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
ausblenden Delphi-Quelltext
1:
if variable=true then					


könnte ich den schleifen da entgehen wenn ich
ausblenden 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 // dass ist der erste versuch wie oben beschrieben  
       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);//hier soll gesprungen werden, wenn es keine lösungen gibt, aber er soll nicht wieder zurückspringen  
           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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Di 04.12.07 09:12 
user profile iconF4n4T!C hat folgendes geschrieben:
ausblenden 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 // dass ist der erste versuch wie oben beschrieben  
       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);//hier soll gesprungen werden, wenn es keine lösungen gibt, aber er soll nicht wieder zurückspringen  
           end;  
         z:=z+1;  //  <--
         vergleich1(n);  //  <--
       end;
     if variable=true then
       begin
         showmessage('es gibt eine Lösung')
       end;  
end;
Moment hab ich das richtig verstanden? Die von mir markierten Zeilen sollen nur dann ausgeführt werden, wenn n NICHT = j ist? dann stimmt das, was zuma die vorschlägt. Korrekt wäre:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
if n=j then  // "wenn, dann"
begin  
  n:=0;  
  z:=0;  
  vergleich2(n);
end
else // "ansonsten"
begin  
  z:=z+1;  //  <--
  vergleich1(n);  //  <--
end;

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
F4n4T!C Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: Di 04.12.07 21:47 
aber
ausblenden Delphi-Quelltext
1:
2:
z:=z+1
vergleich1(n)


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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 260

Win XP Prof
D7 Enterprise
BeitragVerfasst: 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.