Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Typecasting Stacküberlauf <code inside> (https://www.delphipraxis.net/156269-typecasting-stackueberlauf-code-inside.html)

Cyberstorm 25. Nov 2010 16:53

Delphi-Version: 2010

Typecasting Stacküberlauf <code inside>
 
hallo. habe ich da etwas nicht verstanden? anscheinend...
wieso funktioniert button1 und bei button2 gibt es einen stacküberlauf?
müssten doch beides 4-byte im speicher sein?!


Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  a: TRGBQuad;
  b: Cardinal;
begin
  a.rgbBlue:=0;
  a.rgbGreen:=0;
  a.rgbRed:=255;
  a.rgbReserved:=0;
  b:=Cardinal(a);
  ShowMessage(IntToStr(b));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  a: TRGBQuad;
  b: array[1..640, 1..480] of Cardinal;
begin
  a.rgbBlue:=0;
  a.rgbGreen:=0;
  a.rgbRed:=255;
  a.rgbReserved:=0;
  b[1, 1]:=Cardinal(a);
  ShowMessage(IntToStr(b[1, 1]));
end;
danke + grüße

DeddyH 25. Nov 2010 17:04

AW: Typecasting Stacküberlauf <code inside>
 
Wenn Du b einmal verkleinerst, funktioniert es dann?

Uwe Raabe 25. Nov 2010 17:15

AW: Typecasting Stacküberlauf <code inside>
 
Dein b hat eine Größe von 640*480*4 = 1.228.800 Byte und wird als lokale Variable auf dem Stack angelegt. Der Default für die maximale Stackgröße ist bei Delphi (XE) 1.048.576 Byte!

Besser so:

Delphi-Quellcode:
  b: array of array of Cardinal;
begin
  SetLength(b, 640, 480);
Allerdings ist b dann 0-basiert, also statt
Delphi-Quellcode:
b[1, 1]
musst du dann
Delphi-Quellcode:
b[0, 0]
schreiben.

Cyberstorm 25. Nov 2010 17:16

AW: Typecasting Stacküberlauf <code inside>
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1064052)
Dein b hat eine Größe von 640*480*4 = 1.228.800 Byte und wird als lokale Variable auf dem Stack angelegt. Der Default für die maximale Stackgröße ist bei Delphi (XE) 1.048.576 Byte!

Besser so:

Delphi-Quellcode:
  b: array of array of Cardinal;
begin
  SetLength(b, 640, 480);
Allerdings ist b dann 0-basiert, also statt
Delphi-Quellcode:
b[1, 1]
musst du dann
Delphi-Quellcode:
b[0, 0]
schreiben.

danke, werde mal probieren, ob sich meine probleme damit in luft auflösen :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:47 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