Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Prism Stack-Überlauf in while-schleife (https://www.delphipraxis.net/117040-stack-ueberlauf-while-schleife.html)

oli_a 10. Jul 2008 12:37


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:
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;
Die arrays Ausgabe_kanal sind alle vom Typ extended.
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.

alzaimar 10. Jul 2008 12:44

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;

oli_a 10. Jul 2008 12:51

Re: Stack-Überlauf in while-schleife
 
oh stimmt, vielen Dank schonmal.

alzaimar 10. Jul 2008 12:53

Re: Stack-Überlauf in while-schleife
 
Ein Stacküberlauf kann auch dann vorkommen, wenn eine statische Variable zu groß ist. Zeig die ganze Methode .

oli_a 10. Jul 2008 13:15

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:
   
    Ausgabe_kanal_2[j] := (2/4095) * Lese_Daten[i+1];
    Ausgabe_kanal_3[j] := (2/4095) * Lese_Daten[i+2];
Die Deklaration der static array besteht ja weiterhin. Nur wenn ich mit ihnen auf diese Art und weise Verfahre, kommt der Stacküberlauf.

oli_a 11. Jul 2008 10:32

Re: Stack-Überlauf in while-schleife
 
komisch, wenn ich drei schleifen draus mach, haut's hin.

Delphi-Quellcode:
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;
er scheint sich an dem ausdruck Lese_Daten[i+1] und Lese_Daten[i+2] zu stören

alzaimar 11. Jul 2008 13:00

Re: Stack-Überlauf in while-schleife
 
Ja, weil Ausgabe_Kanal_2 und Ausgabe_Kanal_3 wegoptimiert wurden. (Du weist nur zu ...Kanal_1 zu)

Assertor 11. Jul 2008 13:06

Re: Stack-Überlauf in while-schleife
 
Delphi-Quellcode:
while i <= ende do
Und "ende" ist auch not weit genug vom i+2 entfernt?

Wäre da nicht ein
Delphi-Quellcode:
while (i+2 <= ende) do
besser?

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

alzaimar 11. Jul 2008 13:10

Re: Stack-Überlauf in while-schleife
 
Zitat:

Zitat von Assertor
Aufpassen: Sowas könnte zu einem Stacküberlauf führen ;)

:gruebel:

Medium 11. Jul 2008 13:48

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 10:31 Uhr.

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