for .. in .. do Schleife

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 6938
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

for .. in .. do Schleife

Beitrag von Mathias »

Ich habe gerade andeckt, das es eine for .. in .. do Schleife gibt.

Kann man die Schleife auch irgendwie benutzen um eine Array zu initialisieren ?
Oder muss man dies weitehin mit for .. to .. do machen ?

Code: Alles auswählen

procedure TForm1.Button2Click(Sender: TObject);
var
  af: array[10..19] of single;
  f: single;
  i: integer;
begin
  for i := Low(af) to High(af) do begin  // gibt es dafür Ersatz ?
    af[i] := i / 10;
  end;
 
  for f in af do begin  // die neue Schleife
    Writeln(f);
  end;
end;   
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: for .. in .. do Schleife

Beitrag von Socke »

Mathias hat geschrieben:Ich habe gerade andeckt, das es eine for .. in .. do Schleife gibt.

Kann man die Schleife auch irgendwie benutzen um eine Array zu initialisieren ?
Oder muss man dies weitehin mit for .. to .. do machen ?
Im Standard kannst du nur lesen; Änderungen an den Array-Elementen werden nicht zurück in den Array geschrieben. Bei Objekten heißt das: Das Objekt kann bearbeitet werden, aber nicht durch ein anderes Objekt ausgetauscht werden.

Du könntest dir ggf. einen eigenen Array-Iterator schreiben, der dir anstatt der Array-Elemente einen Zeiger auf die Array-Elemente zurückgibt; dann kannst du das Array-Element über den Zeiger verändern.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

mischi
Beiträge: 206
Registriert: Di 10. Nov 2009, 18:49
OS, Lazarus, FPC: macOS, 10.13, lazarus 1.8.x, fpc 3.0.x
CPU-Target: 32Bit/64bit

Re: for .. in .. do Schleife

Beitrag von mischi »

Ich hab das noch nicht probiert, aber laut wiki gibt es eine array loop: http://wiki.freepascal.org/for-in_loop#Array_loop
MiSchi macht die fink-Pakete

Mathias
Beiträge: 6938
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: for .. in .. do Schleife

Beitrag von Mathias »

Wen ich den Code mit der for .. in .. do Schleife angucke, isr er schlechter als der mit der for .. to .. do Schleife.
Bei der 2. Variante muss bei jedem Durchlauf der String zuerst in s kopiert werden, bevor er ausgegeben wird.

Ich sehe somit keine Vorteil in der 2. Variante, ausser das die Schreibweise einfacher ist.

Code: Alles auswählen

procedure TForm1.Button2Click(Sender: TObject);
var
  StrArray: array[1..19] of string;
  s: string;
  i: integer;
begin
  for i := Low(StrArray) to High(StrArray) do begin
    StrArray[i] := 'Ich bin ein sehr langer String Nr:' + IntToStr(i);
  end;
 
  for i := Low(StrArray) to High(StrArray) do begin
    Writeln(StrArray[i]);
  end;
 
  for s in StrArray do begin
    Writeln(s);
  end;
end;   
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
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: for .. in .. do Schleife

Beitrag von m.fuchs »

Mathias hat geschrieben:Wen ich den Code mit der for .. in .. do Schleife angucke, isr er schlechter als der mit der for .. to .. do Schleife.
Bei der 2. Variante muss bei jedem Durchlauf der String zuerst in s kopiert werden, bevor er ausgegeben wird.
Das Kopieren eines Pointers dauert nun nicht so lange.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Mathias
Beiträge: 6938
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: for .. in .. do Schleife

Beitrag von Mathias »

Wen er nur den Pointer kopieren würde, so müssten in der 2. Schleife auch "xxx" kommen, oder täusche ich mich da ?

Code: Alles auswählen

  for s in StrArray do begin
    s:='xxx';
    Writeln(s);
  end;
 
  for s in StrArray do begin
    Writeln(s);
  end; 
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
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: for .. in .. do Schleife

Beitrag von m.fuchs »

Du täuscht dich, wenn du schreibend auf s zugreifst, wird ein neuer String erzeugt und s zeigt darauf. In deinem ursprünglichen Beispiel ging es aber um lesende Zugriffe.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Mathias
Beiträge: 6938
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: for .. in .. do Schleife

Beitrag von Mathias »

Da übergebe ich das Array-Element direkt an Writeln,

Code: Alles auswählen

 Writeln(StrArray[i]);
und hier über den Umweg s.

Code: Alles auswählen

 s := StrArray[i];
 Writeln(s);
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
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: for .. in .. do Schleife

Beitrag von m.fuchs »

Genau, und du arbeitest nur lesend auf s. In diesem Fall wird dafür nur ein Pointer gesetzt. Wenn du in s etwas hinschreibst, wird ein neuer String erzeugt.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten