ich hab mir ein kleines Konstrukt aus Schleifen zusammengebastelt. Dabei musste ich feststellen, das ich innerhalb einer Repeat Schleife keine For Schleifen einbauen kann?




Ist das so gewollt, oder sitzt der Fehler mal wieder vorm Bildschirm?
Code: Alles auswählen
program Project1;
var
i,j,k: Integer;
begin
i := 0;
repeat
WriteLn('repeat: i = ', i);
for j:=0 to 2 do
WriteLn('for: j = ', j);
k := 0;
while k < 2 do begin
WriteLn('while: k = ', k);
inc(k);
end;
inc(i);
until i = 3;
end.
Da wäre es doch sehr sinnvoll gewesen, dieses Konstrukt in deine Frage einzufügen.Hartkern hat geschrieben:ich hab mir ein kleines Konstrukt aus Schleifen zusammengebastelt.
Code: Alles auswählen
procedure TForm1.jacobi(WerteMatrix: TDet);
(* 0 = 1/d_0, b_0, +-x2_0, +-x3_0
1 = 1/d_1, b_1, +-x1_1, +-x3_1
2 = 1/d_2, b_2, +-x1_2, +-x2_2,
......
1d_0 = x1_0
*)
Var
i,j,z : integer;
aSolve_neu, aSolve_alt : array of real;
atmp : array of real;
Iteration: integer;
summe : real;
sum : integer;
aProbe : array of integer;
Probe : Boolean;
freq: Int64;
startTime: Int64;
endTime: Int64;
begin
Memo1.clear;
Setlength(asolve_neu, AnzN);
Setlength(asolve_alt,AnzN);
Setlength(atmp,AnzN-1);
Setlength(aProbe,AnzN);
//startwerte für x1...xn auf Null setzen
for i:=0 to High(aSolve_alt) do
begin
aSolve_alt[i]:=0;
end;
//Iteration starten, Timer starten
QueryPerformanceFrequency(freq);
QueryPerformanceCounter(startTime);
Iteration:=0;
Repeat
j:=-1;
Repeat //Ab hier wird einmal alle X1..Xn Werte berechnet
inc(j)
for I:=0 to High(atmp) do
begin
atmp[i]:=Wertematrix[i+2];
end;
Summe := 0;
for i := Low(atmp) to High(atmp) do
begin
Summe := Summe + atmp[i];
end;
Solve_neu[j]:=Wertematrix[j,0]*(Wertematrix[j,1]+Summe*aSolve_alt[j]);
until J=AnzN-1;
//Prüfen wie weit die Werte aus Solve_alt von Solve_neu voneinander abweichen
z:=-1;
Repeat
inc(z);
IF SameValue(aSolve_Neu[z],aSolve_alt[z],eps) = true then aProbe[z]:= 0 else aProbe[z]:= 1;
until z:=AnzN-1;
Summe := 0;
for i := Low(aProbe) to High(aProbe) do
begin
Sum := Sum + aProbe[i];
end;
If Sum = 0 then Probe:=true else Probe:=false;
//Ausgabe der iterierten Solve_Neu Werte
for z:=0 to High(aSolve_Neu) do
begin
memo1.lines.add('X'+IntToStr(z+1)+' 'FloattoStr(aSolve_neu[z]);
end;
inc(Iterationen);
memo1.lines.add('Anzahl der Iterationen ' + IntToStr(Iterationen));
asolve_alt:=asolve_neu;
Until Probe = true;
//Timer stoppen
QueryPerformanceCounter(endTime);
//Ausgeben der gefundenen x1, x2....xn, benötigte Zeit ausgeben
Memo1.clear;
memo1.lines.add('Iteration beendet, Lösungen gefunden!!!');
for z:=0 to High(aSolve_Neu) do
begin
memo1.lines.add('X'+IntToStr(z+1)+' 'FloattoStr(aSolve_neu[z]));
end;
memo1.lines.add('Benötigte Anzahl der Iterationen ' + IntToStr(Iterationen));
memo1.lines.add('beötigte Zeit: ' + IntToStr((endTime - startTime) * 1000 div freq) + 'ms');
end;
Code: Alles auswählen
procedure TForm1.jacobi(WerteMatrix: TDet);
(* 0 = 1/d_0, b_0, +-x2_0, +-x3_0
1 = 1/d_1, b_1, +-x1_1, +-x3_1
2 = 1/d_2, b_2, +-x1_2, +-x2_2,
......
1d_0 = x1_0
*)
Var
i,j,z : integer;
aSolve_neu, aSolve_alt : array of real;
atmp : array of real;
Iteration: integer;
summe : real;
sum : integer;
aProbe : array of integer;
Probe : Boolean;
freq: Int64;
startTime: Int64;
endTime: Int64;
begin
Memo1.clear;
Setlength(asolve_neu, AnzN);
Setlength(asolve_alt,AnzN);
Setlength(atmp,AnzN-1);
Setlength(aProbe,AnzN);
//startwerte für x1...xn auf Null setzen
for i:=0 to High(aSolve_alt) do
begin
aSolve_alt[i]:=0;
end;
//Iteration starten, Timer starten
QueryPerformanceFrequency(freq);
QueryPerformanceCounter(startTime);
Iteration:=0;
Repeat
j:=-1;
Repeat //Ab hier wird einmal alle X1..Xn Werte berechnet
inc(j)
for I:=0 to High(atmp) do
begin
atmp[i]:=Wertematrix[i+2];
end;
Summe := 0;
for i := Low(atmp) to High(atmp) do
begin
Summe := Summe + atmp[i];
end;
Solve_neu[j]:=Wertematrix[j,0]*(Wertematrix[j,1]+Summe*aSolve_alt[j]);
until J=AnzN-1;
//Prüfen wie weit die Werte aus Solve_alt von Solve_neu voneinander abweichen
z:=-1;
Repeat
inc(z);
IF SameValue(aSolve_Neu[z],aSolve_alt[z],eps) = true then aProbe[z]:= 0 else aProbe[z]:= 1;
until z:=AnzN-1;
Summe := 0;
for i := Low(aProbe) to High(aProbe) do
begin
Sum := Sum + aProbe[i];
end;
If Sum = 0 then Probe:=true else Probe:=false;
//Ausgabe der iterierten Solve_Neu Werte
for z:=0 to High(aSolve_Neu) do
begin
memo1.lines.add('X'+IntToStr(z+1)+' 'FloattoStr(aSolve_neu[z]); // !!!!!!!!!!!
end;
inc(Iterationen);
memo1.lines.add('Anzahl der Iterationen ' + IntToStr(Iterationen));
asolve_alt:=asolve_neu;
Until Probe = true;
//Timer stoppen
QueryPerformanceCounter(endTime);
//Ausgeben der gefundenen x1, x2....xn, benötigte Zeit ausgeben
Memo1.clear;
memo1.lines.add('Iteration beendet, Lösungen gefunden!!!');
for z:=0 to High(aSolve_Neu) do
begin
memo1.lines.add('X'+IntToStr(z+1)+' 'FloattoStr(aSolve_neu[z]));
end;
memo1.lines.add('Benötigte Anzahl der Iterationen ' + IntToStr(Iterationen));
memo1.lines.add('beötigte Zeit: ' + IntToStr((endTime - startTime) * 1000 div freq) + 'ms');
end;
Code: Alles auswählen
QueryPerformanceCounter(startTime);
Iteration:=0;
Repeat
j:=-1;
Repeat //Ab hier wird einmal alle X1..Xn Werte berechnet
inc(j)
for I:=0 to High(atmp) do//<<<<<<<<<------------------------------------------------------an dieser Zeile meckert er
begin