Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Bytes aneinanderhängen? (https://www.delphipraxis.net/127231-bytes-aneinanderhaengen.html)

Z4ppy 9. Jan 2009 15:03


Bytes aneinanderhängen?
 
Ich benötige für ein Programm ein MB 0-Bytes. Nun möchte ich das allerdings nicht von vornherein in die Source einbauen, sonst ist die EXE ja auch schon über ein MB gross ;)
Ich will dieses eine MB also zur Laufzeit erzeugen. Danach möchte ich dieses MB in einen FileStream speichern. Ich habs nun so probiert:
Delphi-Quellcode:
//t ist ein Array of Byte
SetLength(t,1048576);
for i:=0 to 1048575 do t[i]:=$0;
Danach schreib ich das so in den FileStream:
Delphi-Quellcode:
F.Write(t,1048576);
Es wird aber nichts geschrieben - warum?

(Wahrscheinlich ist es mal wieder ein ganz triviales Problem, aber ich komm einfach nicht auf die Lösung :roll:)

MfG Z4ppy

3_of_8 9. Jan 2009 15:05

Re: Bytes aneinanderhängen?
 
Delphi-Quellcode:
F.Write(t[0], 1048576);

Christian Seehase 9. Jan 2009 15:07

Re: Bytes aneinanderhängen?
 
Moin Z4ppy,

ich würde das ganz einfach mit einem String lösen:

Delphi-Quellcode:
s := StringOfChar(#00,1024*1024);

fs.Write(s[1],Length(s));

Z4ppy 9. Jan 2009 15:09

Re: Bytes aneinanderhängen?
 
War ja klar :D Danke, 3_of_8 ;)

@Christian: Danke, das wär natürlich auch ne Lösung, aber so ists natürlich eleganter :)

MfG Z4ppy

Luckie 9. Jan 2009 15:18

Re: Bytes aneinanderhängen?
 
Noch einfachher:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
  FILEPATH = 'd:\test.dat';
var
  fs: TFileStream;
begin
  fs := TFileStream.Create(FILEPATH, fmCreate);
  try
    fs.Size := 1024 * 1024;
  finally
    fs.Free;
  end;
end;

Namenloser 9. Jan 2009 15:19

Re: Bytes aneinanderhängen?
 
Delphi-Quellcode:
for i:=0 to 1048575 do t[i]:=$0;
Delphi-Quellcode:
ZeroMemory(t[0],1048575);

Sunlight7 9. Jan 2009 18:53

Re: Bytes aneinanderhängen?
 
Zitat:

Zitat von NamenLozer
Delphi-Quellcode:
ZeroMemory(t[0],1048575);

Delphi-Quellcode:
ZeroMemory(@t[0], 1048575);
Wobei bei nem Array of Byte
Delphi-Quellcode:
ZeroMemory(@t, 1048575);
auch möglich wäre und ein SizeOf anstatt einer Zahl besser wären.

Abgesehen davon fehlt sowieso das letzte Byte, 1024 * 1024 = 1048576 ;)

Namenloser 9. Jan 2009 19:41

Re: Bytes aneinanderhängen?
 
Zitat:

Zitat von Sunlight7
Zitat:

Zitat von NamenLozer
Delphi-Quellcode:
ZeroMemory(t[0],1048575);

Delphi-Quellcode:
ZeroMemory(@t[0], 1048575);
Wobei bei nem Array of Byte
Delphi-Quellcode:
ZeroMemory(@t, 1048575);
auch möglich wäre und ein SizeOf anstatt einer Zahl besser wären.

Abgesehen davon fehlt sowieso das letzte Byte, 1024 * 1024 = 1048576 ;)

Nicht SizeOf! SizeOf gibt die Größe des Pointers (4) zurück, der das Array eigentlich ist. Wenn, dann Length(t)*SizeOf(t[0]), was allerdings gefährlich ist, wenn t auch weniger als 1 Element haben kann. In dem fall müsste man den Typ dann wohl hardcoden.

alzaimar 9. Jan 2009 20:36

Re: Bytes aneinanderhängen?
 
Auf die Gefahr hin, das ich mich als Depp oute, aber wieso funktioniert das hier eigentlich nicht?
Delphi-Quellcode:
MyFileStream.Write(DynamicArray,1024*1024);
Mir ist klar, das 'DynamicArray' ein Pointer ist und nur Schrott in der Datei stünde oder vielleicht sogar eine AV käme, aber wenigstens sollte sie 1MB groß sein, wenn keine AV kommt. Aber es wird wirklich gar nichts geschrieben.
:gruebel:

Hawkeye219 9. Jan 2009 20:55

Re: Bytes aneinanderhängen?
 
Hallo alzaimar,

Zitat:

Zitat von alzaimar
Mir ist klar, das 'DynamicArray' ein Pointer ist und nur Schrott in der Datei stünde oder vielleicht sogar eine AV käme, aber wenigstens sollte sie 1MB groß sein, wenn keine AV kommt. Aber es wird wirklich gar nichts geschrieben.

Meine Vermutung: die Systemroutinen von Windows verweigern das Schreiben, weil der zu schreibende Speicherbereich der Applikation nicht vollständig gehört.

Versuche folgendes:

Delphi-Quellcode:
var
  GlobalVar : array of Integer;
  Dummy    : array [1..1024 * 1024] of Byte;

procedure TForm1.Button1Click;
var
  S : TFileStream;
begin
  Dummy[1] := 0; // damit Dummy nicht wegoptimiert wird...

  S := TFileStream.Create('C:\temp\test.stm', fmCreate);
  S.Write (GlobalVar, 1024 * 1024);
  S.Free;
end;
Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:33 Uhr.
Seite 1 von 2  1 2      

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