![]() |
Stack-Überlauf in while-schleife
Hallo,
ich habe grad angefangen mit Delphi. Folgendes Problem kann ich leider nicht lösen. Ich bekomme bei Ausführung folgedner whil-schleife einen stack-überlauf-fehler.
Delphi-Quellcode:
Die arrays Ausgabe_kanal sind alle vom Typ extended.
i:=0;
while i <= ende do begin Ausgabe_kanal_1[i] := (2/4095) * Lese_Daten[i]; //Dezimalzahl in Volt Ausgabe_kanal_2[i] := (2/4095) * Lese_Daten[i+1]; Ausgabe_kanal_3[i] := (2/4095) * Lese_Daten[i+2]; Inc(i,3); end; Das array Lese_Daten word. ende ist ein integer-wert Aufgabe der Schleife: Ich habe ein array und möchte es in drei arrays aufteilen. der erste wert ins erste array, der zweite ins zweite, der dritte ins dritte und der vierte wieder ins erste array, usw. und sie dabei halt umrechnen. |
Re: Stack-Überlauf in while-schleife
Den Stacküberlauf kann ich Dir nicht erklären, aber Du hast trotzdem einen Fehler drin. Der Index 'i' ist für die rechte Seite zuständig und wird immer um 3 erhöht, das passt aber nicht für die linke Seite.
Delphi-Quellcode:
i:=0;
j:=0; // NEU while i <= ende do begin Ausgabe_kanal_1[j] := (2/4095) * Lese_Daten[i ]; //Dezimalzahl in Volt Ausgabe_kanal_2[j] := (2/4095) * Lese_Daten[i+1]; Ausgabe_kanal_3[j] := (2/4095) * Lese_Daten[i+2]; Inc(i,3); Inc(j); // NEU end; |
Re: Stack-Überlauf in while-schleife
oh stimmt, vielen Dank schonmal.
|
Re: Stack-Überlauf in while-schleife
Ein Stacküberlauf kann auch dann vorkommen, wenn eine statische Variable zu groß ist. Zeig die ganze Methode .
|
Re: Stack-Überlauf in while-schleife
Das hab ich auch schon gelesen.
So wie ich's verstanden habe, kommt das zu stande, wenn ich zu viele zugroße Variablen statische deklariere. Mein Programm zeigt keinen Fehler, sobald ich diese beiden Zeilen herausnehme.
Delphi-Quellcode:
Die Deklaration der static array besteht ja weiterhin. Nur wenn ich mit ihnen auf diese Art und weise Verfahre, kommt der Stacküberlauf.Ausgabe_kanal_2[j] := (2/4095) * Lese_Daten[i+1]; Ausgabe_kanal_3[j] := (2/4095) * Lese_Daten[i+2]; |
Re: Stack-Überlauf in while-schleife
komisch, wenn ich drei schleifen draus mach, haut's hin.
Delphi-Quellcode:
er scheint sich an dem ausdruck Lese_Daten[i+1] und Lese_Daten[i+2] zu stören
i:=0;
j:=0; while i <= Anzahl_lesewerte do begin Ausgabe_kanal_1[j] := (2/4095) * Lese_Daten[i]; //Dezimalzahl in Volt Inc(i,3); Inc(j); end; i:=1; j:=1; while i <= Anzahl_lesewerte do begin Ausgabe_kanal_1[j] := (2/4095) * Lese_Daten[i]; //Dezimalzahl in Volt Inc(i,3); Inc(j); end; i:=2; j:=2; while i <= Anzahl_lesewerte do begin Ausgabe_kanal_1[j] := (2/4095) * Lese_Daten[i]; //Dezimalzahl in Volt Inc(i,3); Inc(j); end; |
Re: Stack-Überlauf in while-schleife
Ja, weil Ausgabe_Kanal_2 und Ausgabe_Kanal_3 wegoptimiert wurden. (Du weist nur zu ...Kanal_1 zu)
|
Re: Stack-Überlauf in while-schleife
Delphi-Quellcode:
Und "ende" ist auch not weit genug vom i+2 entfernt?
while i <= ende do
Wäre da nicht ein
Delphi-Quellcode:
besser?
while (i+2 <= ende) do
Sonst greifst Du im Zweifelsfall auf einen Bereich zu, den es im Array nicht gibt... Aufpassen: Sowas könnte zu einem Stacküberlauf führen ;) Gruß Assertor |
Re: Stack-Überlauf in while-schleife
Zitat:
|
Re: Stack-Überlauf in while-schleife
Mach doch einfach aus den statischen Arrays dynamische. Damit werden die Jungs auf den Heap geworfen, und dein Stack hat wieder Luft zum atmen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09: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-2025 by Thomas Breitkreuz