[gelöst]Shleifen nur mit dem selben Typ verschachtelt werden

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Hartkern
Beiträge: 69
Registriert: Sa 5. Dez 2015, 20:03
OS, Lazarus, FPC: Win10 IDE 1.6
CPU-Target: 64Bit
Wohnort: Leipzig

[gelöst]Shleifen nur mit dem selben Typ verschachtelt werden

Beitrag von Hartkern »

Hallo,

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

Ist das so gewollt, oder sitzt der Fehler mal wieder vorm Bildschirm?
Zuletzt geändert von Hartkern am Fr 10. Jun 2016, 17:47, insgesamt 1-mal geändert.

wp_xyz
Beiträge: 5154
Registriert: Fr 8. Apr 2011, 09:01

Re: Dürfen Schleifen nur mit dem selben Typ verschachtelt we

Beitrag von wp_xyz »

Letzteres

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. 

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2817
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Dürfen Schleifen nur mit dem selben Typ verschachtelt we

Beitrag von m.fuchs »

Hartkern hat geschrieben:ich hab mir ein kleines Konstrukt aus Schleifen zusammengebastelt.
Da wäre es doch sehr sinnvoll gewesen, dieses Konstrukt in deine Frage einzufügen. :)
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Hartkern
Beiträge: 69
Registriert: Sa 5. Dez 2015, 20:03
OS, Lazarus, FPC: Win10 IDE 1.6
CPU-Target: 64Bit
Wohnort: Leipzig

Re: Dürfen Schleifen nur mit dem selben Typ verschachtelt we

Beitrag von Hartkern »

Mein Versuch die Jacobi Iteration umzusetzen


until expectet but for found

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;                                        

marcov
Beiträge: 1102
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Dürfen Schleifen nur mit dem selben Typ verschachtelt we

Beitrag von marcov »

Und der Fehlermeldung der Kompiler (und wo ?)

wp_xyz
Beiträge: 5154
Registriert: Fr 8. Apr 2011, 09:01

Re: Dürfen Schleifen nur mit dem selben Typ verschachtelt we

Beitrag von wp_xyz »

Wenn du jetzt alles schön einrücken würdest, könntest du auf einen Blick sehen, ob irgendwo ein begin/end oder until fehlt:

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;   
Jedes "repeat" hat ein entsprechendes "until" auf derselben Einrückungstiefe, genauso bei "begin" und "end" - das scheint der Fehler nicht zu sein.

Aber in der mit //!!!!!!!!! gekennzeichneten Zeile fehlt ein "+". Vielleicht zieht das als Folgefehler die genannte Fehlermeldung hinter sich her.

Hartkern
Beiträge: 69
Registriert: Sa 5. Dez 2015, 20:03
OS, Lazarus, FPC: Win10 IDE 1.6
CPU-Target: 64Bit
Wohnort: Leipzig

Re: Dürfen Schleifen nur mit dem selben Typ verschachtelt we

Beitrag von Hartkern »

until expected but for found

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
Edit: danke für das Plus....aber das war es nicht

wp_xyz
Beiträge: 5154
Registriert: Fr 8. Apr 2011, 09:01

Re: Dürfen Schleifen nur mit dem selben Typ verschachtelt we

Beitrag von wp_xyz »

Was muss am Ende (fast) aller Pascal-Anweisungszeilen stehen?
Zuletzt geändert von wp_xyz am Mi 27. Apr 2016, 19:19, insgesamt 1-mal geändert.

Hartkern
Beiträge: 69
Registriert: Sa 5. Dez 2015, 20:03
OS, Lazarus, FPC: Win10 IDE 1.6
CPU-Target: 64Bit
Wohnort: Leipzig

Re: Dürfen Schleifen nur mit dem selben Typ verschachtelt we

Beitrag von Hartkern »

natürlich ein semikolon :oops: :oops: :oops: omg

Antworten