List index out of bounds

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
gillian_x
Beiträge: 30
Registriert: Sa 22. Nov 2014, 14:24

List index out of bounds

Beitrag von gillian_x »

Hallo!

Brauche mal wieder eure Hilfe! :(
Ich bin wirklich am Verzweifeln!!! :cry: :cry: :cry:
Seit Tagen suche ich diesen einen Fehler und komme auf nix! :oops:
Erhalte im unten abgebildeten Code die im Betreff genannte Fehlermeldung und ich weiß nicht woran es liegt.
Ich weiß, dass es bedeuten kann das in der Schleife ein Wert nicht gefunden wird, aber ich hab echt keine Ahnung wieso, weshalb, warum?
Ich hoffe ihr könnt mir weiterhelfen! :!:

Code: Alles auswählen

procedure TForm1.Button8Click(Sender: TObject);     //erstellen von Minutenwerten für Strom/Heizwärme/warmwasser
 
 var
 
    slstrom, slstromf, slstrome: TStringList; // Listen für die Stromwerte
    wochentag1,nz1,nz2,nz3,ssz,mmz,zz: integer;
    haustyp,year1: string;
    datum1 : TDateTime;
    ergebniss: single;
 
begin
 
      slstrom  := TStringList.Create;
      slstromf := TStringList.Create;
      slstrome := TStringList.Create;
 
      year1    := Edit2.Text;
      datum1   := StrToDate('01.01.'+year1);
      nz2      := 0;
      nz3      := 0;
      zz       := 1;
 
      if (CheckBox1.Checked = True) and (CheckBox2.Checked = False) then haustyp := 'EFH'
      else if (CheckBox1.Checked = False) and (CheckBox2.Checked = True) then haustyp := 'MFH'
      else     showmessage ('Fehler');
 
      slstrom.LoadFromFile('C:\Strombedarf.txt');    //läd den Tagesbedarf an Strom für ein Jahr
 
      // prüft um welchen Typtag es sich handelt für jeden Tag des Jahres
       for nz1 := Memo4.Lines.Count-1 downto 0 do begin
          wochentag1 := DayOfWeek(datum1);
          if rightstr(Memo4.Lines[nz3],3) = 'UWH' then  begin
             slstromf.LoadFromFile('C:\Strom'+haustyp+'UWH.txt')//EFH oder MFH
             //Berechnungen Strom Minutenwerte für ÜWH
             for ssz := 0 to 23 do begin
                 for mmz := 0 to 59 do begin
                 try
                    ergebniss:= StrToFloat(slstrom[nz3])*StrToFloat(slstromf[nz2]);
                                slstrome.Add(FloatToStr(ergebniss));
 
                 except
                                Exit;
                 end;
                                nz2:=nz2+1;
                 end;
             end;
 
             slstromf.Clear;
             end
 
 
      else if rightstr(Memo4.Lines[nz3],3) = 'UWB' then  begin
             slstromf.LoadFromFile('C:\Strom'+haustyp+'UWH.txt')//EFH oder MFH
             //Berechnungen Strom Minutenwerte für ÜWB
             for ssz := 0 to 23 do begin
                 for mmz := 0 to 59 do begin
                 try
                    ergebniss:= StrToFloat(slstrom[nz3])*StrToFloat(slstromf[nz2]);
                                slstrome.Add(FloatToStr(ergebniss));
                 except
                                Exit;
                 end;
                                nz2:=nz2+1;
                 end;
             end;
 
             slstromf.Clear;
             end
 
 
      else
             slstromf.LoadFromFile('C:\Strom'+haustyp+'WSB.txt')//EFH oder MFH
             //Berechnungen Strom Minutenwerte für WSB
             for ssz := 0 to 23 do begin
                 for mmz := 0 to 59 do begin
                 try
                    ergebniss:= StrToFloat(slstrom[nz3])*StrToFloat(slstromf[nz2]);
                                slstrome.Add(FloatToStr(ergebniss));
                 except
                                Exit;
                 end;
                                nz2:=nz2+1;
                 end;
                 slstromf.Clear;
             end;
 
 
             nz2:=0;
             datum1 := datum1 + zz;
             nz3 := nz3 + 1;
             end;
 
slstrome.SaveToFile('C:\strom.txt');
           slstrom.Free;
           slstromf.Free;
           slstrome.Free;
 
          end;
end.                                                                                     
 

gillian_x
Beiträge: 30
Registriert: Sa 22. Nov 2014, 14:24

Re: List index out of bounds

Beitrag von gillian_x »

Oh man... SORRY!!!

Ich habe den Fehler schon gefunden! :oops: :oops: :oops:

Da fehlte einfach nur ein end;

Komisch das ich das Tagelang nicht sehe und kaum schreibe ich hier rein, fällt es mir auf! :evil:

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

Re: List index out of bounds

Beitrag von wp_xyz »

gilian_x hat geschrieben:Ich weiß, dass es bedeuten kann das in der Schleife ein Wert nicht gefunden wird
Nein, "List index out of bounds" bedeutet, dass du auf eine Liste zugreifst (StringList, Memo.Lines, o.ä.), wobei der angegebene Index größer als der letzten Eintrags (List.Count-1) oder kleiner als 0 ist.

gilian_x hat geschrieben:Da fehlte einfach nur ein end;
Kann ich mir eigentlich nicht vorstellen, weil das der Compiler merken müsste (es sei denn, es fehlt auch das zugehörige "begin")
Generell ist deine Code-Formatierung "unter aller Sau". Alle Zeilen, die zum gleichen Block gehören, müssen gleich tief eingerückt sein, dann siehst du solche Fehler auf einen Blick

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: List index out of bounds

Beitrag von baumina »

Code: Alles auswählen

            for ssz := 0 to 23 do begin
                 for mmz := 0 to 59 do begin
                 try
                    ergebniss:= StrToFloat(slstrom[nz3])*StrToFloat(slstromf[nz2]);
                                slstrome.Add(FloatToStr(ergebniss));
 
                 except
                                Exit;
                 end;
                                nz2:=nz2+1;
                 end;
             end;
  

Hier greifst du ohne zu schauen ob es den Listeneintrag (sprich Count) überhaupt gibt auf slstrom[nz3] bzw. slstromf[nz2] zu. Sollte slstrom.count = 5 sein, greifst du mit slstrom[8] voll ins out of bounds.
.

Antworten