AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Stack-Überlauf bei Prozeduraufruf

Ein Thema von DarkLord0 · begonnen am 13. Mai 2006 · letzter Beitrag vom 14. Mai 2006
Antwort Antwort
DarkLord0

Registriert seit: 31. Okt 2004
59 Beiträge
 
#1

Stack-Überlauf bei Prozeduraufruf

  Alt 13. Mai 2006, 16:03
Hiho,

Jedesmal, wenn ich mein Programm folgende Prozedur aufrufen lasse, beendet es sich ohne Fehlermeldung (als hätte man halt benutzt) bzw. mit Fehlermeldung Stack-Überlauf wenn ich es über die IDE starte.
Delphi-Quellcode:
procedure tform1.savedata(satz:data1;filename:string);
var
F: File of data1;
begin
showmessage('#1');
try
AssignFile(F,ExtractFilePath(ParamStr(0))+'1.tmp');
ReWrite(F);
Write(F,satz);
finally
CloseFile(F);
end;
end;
data1 ist ein Record der Größe ~3.16MB, kann es vielleicht an der Größe liegen?
Es wird noch nicht einmal die showmessage('#1') angezeigt, bevor die Meldung kommt bzw. das Programm weg ist.
Woran kann das liegen?
  Mit Zitat antworten Zitat
pszopp

Registriert seit: 7. Sep 2005
Ort: Alsdorf
95 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Stack-Überlauf bei Prozeduraufruf

  Alt 13. Mai 2006, 16:10
Hi,

wie ist denn der Record aufgebaut?

teste das mal:
procedure tform1.savedata(const satz:data1; filename:string); PS: den filename kannst auch aus der Parameterliste entfernen, da er nicht benutzt wird.

Gruß,
pszopp
www.pstipp.de | Tippseite zur Formel 1 und Fußball WM/EM - kostenlos und Just-For-Fun
  Mit Zitat antworten Zitat
DarkLord0

Registriert seit: 31. Okt 2004
59 Beiträge
 
#3

Re: Stack-Überlauf bei Prozeduraufruf

  Alt 13. Mai 2006, 18:51
Zitat von pszopp:
teste das mal:
procedure tform1.savedata(const satz:data1; filename:string);
Cool, danke. Das hat funktioniert! Ich frage mich nur, warum
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#4

Re: Stack-Überlauf bei Prozeduraufruf

  Alt 13. Mai 2006, 18:52
Wenn du const (bzw var) vor einen Parameternamen setzt, wird nur ein Zeiger auf diesen Parameter im Speicher in die Prozedur/Funktion übergeben (also 4 Bytes). Tust du das nicht, wird der Parameter auf den Stack geschrieben (bei dir über 3 Megabytes)... Das verursacht den Stacküberlauf.
  Mit Zitat antworten Zitat
DarkLord0

Registriert seit: 31. Okt 2004
59 Beiträge
 
#5

Re: Stack-Überlauf bei Prozeduraufruf

  Alt 14. Mai 2006, 11:31
Ich habe jetzt noch ein weiteres Problem. In meinem Record ist auch eine Objekt eines selbstdefinierten Typs enthalten (also mit eigenen properties, funktionen und prozeduren). Im Moment wird immer nur ein 4 Byte großer Pointer auf das Objekt gespeichert, das hilft mir natürlich wenig, ich möchte das ganze Object speichern lassen. Kann man in der Definition des Records irgendwie angeben, dass nicht nur eine Pointer-Variable benutzt werden soll? Wann wird überhaupt allgemein von Delphi eine Pointer-Variable benutzt und wann wird auch der Inhalt gespeichert? (kenne das bis jetzt nur bei arrays, wenn man die Größe nicht angibt).
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#6

Re: Stack-Überlauf bei Prozeduraufruf

  Alt 14. Mai 2006, 12:10
Das entscheidet der Compiler noch immer selber. Wenn du mehr als 64bit übergibst, wird normalerweise der Zeiger benutzt.

64bit wird normalerweise in einer Registerkombination als EAX:EDX übergeben. Alles was 32bit oder drunter ist, wird entweder im Register übergeben (Standard) oder - wenn du zuviele Parameter hast - auf den Stack geschoben.
  Mit Zitat antworten Zitat
pszopp

Registriert seit: 7. Sep 2005
Ort: Alsdorf
95 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Stack-Überlauf bei Prozeduraufruf

  Alt 14. Mai 2006, 12:22
Zum Speichern/Laden der Properties müsstes du das Objekt am Besten mit den Methoden
LoadFromStream und SaveToStream ausstatten.
In diesen Methoden musst du dann die Properties leider alle manuell speichern/laden.

Delphi-Quellcode:
procedure TObj.SaveToStream(aStream : TStream);
var lk : Integer;
    Anz : Integer;
begin
  Anz := Length(Data);
  aStream.Write(Anz, SizeOf(Anz));
  for lk := 0 to Anz - 1 do begin
    aStream.Write(Data[lk], SizeOf(Data[lk])); // Data ist z.B. ein Array of Integer
  end; // for lk
end;


procedure TObj.LoadFromStream(aStream : TStream);
var lk : Integer;
    Anz : Integer;
begin
  aStream.Read(Anz, SizeOf(Anz));
  SetLength(Data, Anz);
  
  for lk := 0 to Anzahl - 1 do begin
    aStream.Read(Data[lk], SizeOf(Data[lk]));
  end; // for lk
end;
(ungetestet)

Gruß,
pszopp
www.pstipp.de | Tippseite zur Formel 1 und Fußball WM/EM - kostenlos und Just-For-Fun
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:56 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