Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi for I := 1 to SL.Count do; oder for I := 0 to SL.Count -1 do (https://www.delphipraxis.net/41014-i-%3D-1-sl-count-do%3B-oder-i-%3D-0-sl-count-1-do.html)

Die Muhkuh 24. Feb 2005 17:14


for I := 1 to SL.Count do; oder for I := 0 to SL.Count -1 do
 
Hi,

mein Freund hat mir gerade folgenden Code gegeben:

Delphi-Quellcode:
function Anzahl : Integer;
var loc : TStringlist;
    i : Integer;
begin
  loc := TStringlist.Create;
  try
    loc.LoadFromFile('dc.loc');
    SetLength(Datei,Loc.Count);
    for i := 1 to Loc.Count do begin
     Datei[i] := TDatei.Create;
    end;

    Result := loc.Count;
  finally
    loc.Free;
  end;
end;
ich hab zu ihm gesagt, das da nen Bock drinne ist. Es müsste nämlich for I := 0 to SL.Count - 1 do heißen.

Er sagte mir dazu noch dies:
Zitat:

Count gibt die Anzahl der reihen
So und ich will soviele dateien erzeugen wie es Zeilen gibt ...

Count fängt ist bei einer Zeile = 1
Count ist bei zwei Zeilen = 2
usw...
Jede Zeile ist eine Datei.
Ich sagte ihm das es falsch ist.

Zeile 1 = Count 0;
Zeile 2 = Count 1;

Jetzt wollte ich wissen, was nun richtig?

Neutral General 24. Feb 2005 17:15

Re: for I := 1 to SL.Count do; oder for I := 0 to SL.Count -
 
Bei einer Zeile ist Count = 1 aber der INDEX der ersten Zeile ist 0 !!

PS : Der Freund bin ich :mrgreen:

Luckie 24. Feb 2005 17:16

Re: for I := 1 to SL.Count do; oder for I := 0 to SL.Count -
 
Die erste Zeile einer Stringliste hat immer den Index 0. Deshalb darf die Schleife auch nur bis Count-1 laufen.

Neutral General 24. Feb 2005 17:18

Re: for I := 1 to SL.Count do; oder for I := 0 to SL.Count -
 
@ Luckie : Du verstehst nicht genau worum es geht.
Es sollen soviele TDatei erstellt werden wie die Datei Zeilen hat.

Bei zwei Zeile ist Count = 2
also

Delphi-Quellcode:
for i:= 1 to 2 do begin

end;
Und das erzeugt 2 TDatei !!

Aenogym 24. Feb 2005 17:20

Re: for I := 1 to SL.Count do; oder for I := 0 to SL.Count -
 
NeutralGeneral liegt richtig.

Aenogym

MathiasSimmack 24. Feb 2005 17:23

Re: for I := 1 to SL.Count do; oder for I := 0 to SL.Count -
 
Ist
Delphi-Quellcode:
 SetLength(Datei,Loc.Count);
aber nicht ein dynamisches Array, das in dem Fall bei Null beginnt? :gruebel: Wenn Ja, dann kann die Schleife auch wie gehabt von Null bis Count-1 laufen.

jbg 24. Feb 2005 17:24

Re: for I := 1 to SL.Count do; oder for I := 0 to SL.Count -
 
Zitat:

Zitat von Neutral General
@ Luckie : Du verstehst nicht genau worum es geht.
Es sollen soviele TDatei erstellt werden wie die Datei Zeilen hat.

Schon mal die Null mitgezählt?


(0, 1) sind auch zwei "Dateien".

Die Muhkuh 24. Feb 2005 17:24

Re: for I := 1 to SL.Count do; oder for I := 0 to SL.Count -
 
Hi,

aber in der StringList wird dann der erste Eintrag übersprungen!

Test-Code:

Delphi-Quellcode:
var
  I: Integer;
  SL: TStringList;
begin
  SL := TStringList.Create;

  try
    SL.Add('0');
    SL.Add('1');
    SL.Add('2');

    for I := 1 to SL.Count do
    begin
      ShowMessage(SL.Strings[I]);
    end;
  finally
    SL.Free;
  end;
end;
Fazit: Es werden nur 1 und 2 angezeigt.

Da in der dc.loc Dateien stehen:

URL;MD5;Wohin

sollte ja auch die erste Datei ausgelesen werden und nicht "vergessen" werden.

Matze 24. Feb 2005 17:27

Re: for I := 1 to SL.Count do; oder for I := 0 to SL.Count -
 
Zitat:

Zitat von Neutral General
@ Luckie : Du verstehst nicht genau worum es geht.

Ich hätte genau die gleiche Antwort gegeben wie Luckie. Die Schleife muss von 0 bis Count-1 laufen, da die erste zeile den Index 0 besitzt.

ibp 24. Feb 2005 17:28

Re: for I := 1 to SL.Count do; oder for I := 0 to SL.Count -
 
Delphi-Quellcode:
var
  I: Integer;
  SL: TStringList;
begin
  SL := TStringList.Create;

  try
    SL.Add('0');
    SL.Add('1');
    SL.Add('2');

    for I := 0 to SL.Count-1 do
    begin
      ShowMessage(SL.Strings[I]);
    end;
  finally
    SL.Free;
  end;
end;
Fazit: Es werden 0, 1 und 2 angezeigt.

Luckie 24. Feb 2005 17:29

Re: for I := 1 to SL.Count do; oder for I := 0 to SL.Count -
 
Count = 5
Schleife von 0 bis Count-1:
0, 1, 2, 3, 4
Das sind bei mir fünf. Ihr müsst auch die null mitzählen!

Die Muhkuh 24. Feb 2005 17:30

Re: for I := 1 to SL.Count do; oder for I := 0 to SL.Count -
 
Hi,

@jbp

jupp!

Genau das meine ich. Es sollen ja alle (!) Einträge durchlaufen werden und nicht der erste überprungen werden und dann erst durchlaufen ;-)


Also, wer hat nun eigentlich recht?

[edit]

@Luckie mach ich ja

[/edit]

Luckie 24. Feb 2005 17:32

Re: for I := 1 to SL.Count do; oder for I := 0 to SL.Count -
 
Zitat:

Zitat von Spider
Es sollen ja alle (!) Einträge durchlaufen werden und nicht der erste überprungen werden und dann erst durchlaufen ;-)

Haben wir doch gerade erklärt: Der Erste Eintrag hat den Index 0, ergo muss man auch bei null angefangen werden zu zählen und bei Count-1 muss aufgehört werden. :roll:

Die Muhkuh 24. Feb 2005 17:33

Re: for I := 1 to SL.Count do; oder for I := 0 to SL.Count -
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von Spider
Es sollen ja alle (!) Einträge durchlaufen werden und nicht der erste überprungen werden und dann erst durchlaufen ;-)

Haben wir doch gerade erklärt: Der Erste Eintrag hat den Index 0, ergo muss man auch bei null anfangen werden zu zählen und bei Count-1 aufhören. :roll:

Das sage ich ja auch die ganze Zeit :roll: ;-)

Matze 24. Feb 2005 17:40

Re: for I := 1 to SL.Count do; oder for I := 0 to SL.Count -
 
Zitat:

Zitat von Spider
Das sage ich ja auch die ganze Zeit :roll: ;-)

Ja ach ne, sollen wir dich nun loben? :mrgreen:

ibp 24. Feb 2005 17:40

Re: for I := 1 to SL.Count do; oder for I := 0 to SL.Count -
 
Zitat:

Zitat von Spider
Jetzt wollte ich wissen, was nun richtig?

:? also doch nicht sicher!!!

Thorben77 24. Feb 2005 17:41

Re: for I := 1 to SL.Count do; oder for I := 0 to SL.Count -
 
Zitat:

Zitat von Spider
Delphi-Quellcode:
var
  I: Integer;
  SL: TStringList;
begin
  SL := TStringList.Create;

  try
    SL.Add('0');
    SL.Add('1');
    SL.Add('2');

    for I := 1 to SL.Count do
    begin
     ShowMessage(SL.Strings[I]);
    end;
  finally
    SL.Free;
  end;
end;
Fazit: Es werden nur 1 und 2 angezeigt.

Da in der dc.loc Dateien stehen:

URL;MD5;Wohin

sollte ja auch die erste Datei ausgelesen werden und nicht "vergessen" werden.

Wenn du das so machst und alle Strings angezeigt werden sollen, musst du statt

Delphi-Quellcode:
 

ShowMessage(SL.Strings[I]);
das schreiben:

Delphi-Quellcode:
ShowMessage(SL.Strings[I - 1]);
sonst fehlt der Eintrag mit der 0, weil das for... bei 1 anfägt und dadurch nicht der Eintrag mit dem Index 0 angezeigt wird...

Aber ich würds auch mit Count - 1 machen...^^

Die Muhkuh 24. Feb 2005 17:45

Re: for I := 1 to SL.Count do; oder for I := 0 to SL.Count -
 
Hi,

@der Depp,

so könnte man es auch machen. Aber so wie der Quellcode im ersten Beitrag ist, wird schlicht einfach der erste Eintrag übersprungen.

@Matze

klar! :mrgreen:

Pseudemys Nelsoni 24. Feb 2005 17:47

Re: for I := 1 to SL.Count do; oder for I := 0 to SL.Count -
 
toll gemacht spider, applaus *g+

roderich 24. Feb 2005 17:58

Re: for I := 1 to SL.Count do; oder for I := 0 to SL.Count -
 
da in dem Code aus dem ersten Posting gar nicht auf die Items der StringList Loc zugegriffen wird, kann die Schleife eigentlich beliebig laufen, hauptsache sie läuft über genau Loc.Count Schritte.
Das Problem liegt nur in der richtigen Indizierung des dynamischen Array Datei, welches ab 0 indiziert wird.

Man könnte also genauso schreiben

Delphi-Quellcode:
    for i := 4711 to Loc.Count-4710 do begin
     Datei[i-4711] := TDatei.Create;
    end;

ich gebe aber zu, daß man die Schleife normalerweise ab 0 laufen lassen würde .......... :stupid:

Roderich

Die Muhkuh 24. Feb 2005 18:08

Re: for I := 1 to SL.Count do; oder for I := 0 to SL.Count -
 
Okok,

ich geb mich geschlagen.

Ich hab zwar schon recht,

aber es wird ja nicht mehr auf loc zugriffen :wall: sondern nur auf die Zählvariable (wie manch andere schon sagten). :wall:

Das ist mir total entfallen^^.

Ich sollte doch ma wieder mehr schlafen :-)

Neutral General 24. Feb 2005 18:22

Re: for I := 1 to SL.Count do; oder for I := 0 to SL.Count -
 
Juhuuu hier seht ihr den Sieger :mrgreen:

:party:

(Ich weis gar nicht was ihr immer mit euren Strings hattet, darum gehts ja gar nicht :mrgreen:)

bttb930 24. Feb 2005 19:04

Re: for I := 1 to SL.Count do; oder for I := 0 to SL.Count -
 
ist dieser thread jetzt reine verarsche oder habt ihr das wirklich ernst gemeint???????

ibp 24. Feb 2005 19:11

Re: for I := 1 to SL.Count do; oder for I := 0 to SL.Count -
 
Zitat:

Zitat von bttb930
ist dieser thread jetzt reine verarsche oder habt ihr das wirklich ernst gemeint???????

du hast recht...man sollte ihn zu kt verschieben!

Die Muhkuh 24. Feb 2005 19:55

Re: for I := 1 to SL.Count do; oder for I := 0 to SL.Count -
 
Zitat:

Zitat von ibp
Zitat:

Zitat von bttb930
ist dieser thread jetzt reine verarsche oder habt ihr das wirklich ernst gemeint???????

du hast recht...man sollte ihn zu kt verschieben!

Der Thread war 100% keine Verarsche!

Es war mein voller ernst. Ich hatte nur nicht gesehen, dass nicht mehr auf Loc zugriffen wurde.

atreju2oo0 24. Feb 2005 20:11

Re: for I := 1 to SL.Count do; oder for I := 0 to SL.Count -
 
Zitat:

Zitat von roderich
Man könnte also genauso schreiben

Delphi-Quellcode:
    for i := 4711 to Loc.Count-4710 do begin
     Datei[i-4711] := TDatei.Create;
    end;

Wenn dann wohl eher so:

Delphi-Quellcode:
    for i := 4711 to Loc.Count+4710 do begin
     Datei[i-4711] := TDatei.Create;
    end;
;)

jim_raynor 25. Feb 2005 07:36

Re: for I := 1 to SL.Count do; oder for I := 0 to SL.Count -
 
Dafür wird auf Datei zugegriffen und Datei ist ein Dynamsisches Array das bei 0 beginnt. Also entweder die Schleife von 0 bis Count-1 laufen lassen (was die bessere Möglichkeit ist) oder von 1 bis Count. Dann muss aber immer der Zähler um 1 verringert werden, wenn auf Datei zugegriffen wird. Hier hat keiner Recht oder Unrecht. Fakt ist, so wie im ersten Beitrag gepostet, funktioniert das Programm nicht korrekt. Und wie man es nun löst ist doch völlig egal.

jbg 25. Feb 2005 15:03

Re: for I := 1 to SL.Count do; oder for I := 0 to SL.Count -
 
Zitat:

Zitat von Spider
Aber so wie der Quellcode im ersten Beitrag ist, wird schlicht einfach der erste Eintrag übersprungen.

Und beim letzten bekommt meine EListError Exception um die Ohren gehauen, da man mit Datei[loc.Count] auf einen Index zugreift, der nicht vorhanden ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz