Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Struktur > 2Gb (https://www.delphipraxis.net/167831-struktur-2gb.html)

p80286 20. Apr 2012 13:50

Delphi-Version: 5

Struktur > 2Gb
 
Hallo zusammen,

ich habe eine "uralte" Funktion von D XE übersetzen lassen und bin mit der Meldung "Struktur >2GB" belohnt worden.
Ich könnte jetzt einfach ein paar Byte abzwacken, aber "richtig" wäre diese Lösung nicht.
Könnt Ihr mir einen (oder mehrere Tips geben wie ich das Problem "ordentlich" lösen kann?
Delphi-Quellcode:
procedure copyStr2Ara(const ins:string;pa:pointer;lange:cardinal);
type
  ta = array [0..maxint-1] of char;
var
  sizeofa:cardinal;
  tocopy :cardinal;
begin
  sizeofa:=lange*sizeof(char);
  if sizeofa>0 then begin
    tocopy:=sizeof(char)*length(ins);
    if tocopy<=sizeofa then begin
      if tocopy>0 then
        move(ins[1],ta(pa^)[0],tocopy);
      if tocopy<sizeofa then fillchar(ta(pa^)[tocopy],sizeofa-tocopy,' ');
    end
    else
      move(ins[1],ta(pa^)[0],sizeofa);
  end;
end;
(gerade ist mir aufgefallen, daß das füllen mit Blanks nicht unicode-tauglich ist, bitte ignoriert das)Gruß
k-H

mkinzler 20. Apr 2012 13:55

AW: Struktur > 2Gb
 
Nimm statt Char AnsiChar

himitsu 20. Apr 2012 14:07

AW: Struktur > 2Gb
 
Abgesehn davon, daß der Typ ta nutzlos ist.

Verwende statt
Delphi-Quellcode:
ta(pa^)[0]
einfach nur
Delphi-Quellcode:
pa^
oder
Delphi-Quellcode:
PChar(pa)^
.
(
Delphi-Quellcode:
ta = array [0..MaxInt div SizeOf(Char)-1] of char;
)

Und wenn die Größe egal ist, dann hätte auch
Delphi-Quellcode:
ta = array [0..0] of char;
ausgereicht.
Zusätzlich ist das 0..0 ein Sonderfall, den dieses Array verfügt dann über keine Bereichsprüfung (sollte Dieses in den Projektoptionen aktiviert sein).


PS: Ist Delphi-Referenz durchsuchenFillChar ANSI oder Unicode? (wobei die OH und ich es eigentlich nur mit einem Byte-Parameter kennen :oops:)

p80286 20. Apr 2012 14:41

AW: Struktur > 2Gb
 
Zitat:

Zitat von mkinzler (Beitrag 1162858)
Nimm statt Char AnsiChar

Manchmal sieht man halt das naheliegende nicht.

Zitat:

Zitat von himitsu (Beitrag 1162864)
Abgesehn davon, daß der Typ ta nutzlos ist.

Verwende statt
Delphi-Quellcode:
ta(pa^)[0]
einfach nur
Delphi-Quellcode:
pa^
oder
Delphi-Quellcode:
PChar(pa)^
.
(
Delphi-Quellcode:
ta = array [0..MaxInt div SizeOf(Char)-1] of char;
)

Und wenn die Größe egal ist, dann hätte auch
Delphi-Quellcode:
ta = array [0..0] of char;
ausgereicht.
Zusätzlich ist das 0..0 ein Sonderfall, den dieses Array verfügt dann über keine Bereichsprüfung (sollte Dieses in den Projektoptionen aktiviert sein).

ta ist ja nur ein Vehikel um den Daten hinter dem Pointer einen Namen (Struktur) zu geben.
Wenn ich das mit
Delphi-Quellcode:
Array [0..0] of..
Erreiche soll's mir recht sein. Ich finde dazu aber nichts in der OH. Kannst Du mir da einen Tip geben?

Gruß
K-H


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