Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Warum geht das nicht? (https://www.delphipraxis.net/5460-warum-geht-das-nicht.html)

flattman 7. Jun 2003 08:39


Warum geht das nicht?
 
Hallo,
kann mir jemand sagen warum ich immer eine fehlermeldung mit zugriffsverletztung bekomme?

Code:
var memstream:TMemoryStream;
    Filestream:TFileStream;
    P:PByte;
    X:integer;
begin
try
  MemStream.Size := 1024000;
  P:= MemStream.Memory;  //hier bleibt der compiler stehen
  For X := 0 TO MemStream.Size - 1 Do
  Begin
    P^ := Random(256);
    inc(P);
  end;
  FileStream.CopyFrom(MemStream, 0);
MFG & thx
Flattman

Jens Schumann 7. Jun 2003 08:46

Hallo flattman,
bevor man Objekte verwenden kann muss man sie erzeugen.
Dein Source muss entsprechend erweitert werden.
Delphi-Quellcode:
var memstream:TMemoryStream;
    Filestream:TFileStream;
    P:PByte;
    X:integer;
begin
  // Objekte erzeugen !!!
  MemStream:=TMemoryStream.Create;
  FileStream:=TFileStream.Create(Dateiname,Optionen); // Die Optionen kannst Du in der Hilfe finden.
try
  MemStream.Size := 1024000;
  P:= MemStream.Memory;  //hier bleibt der compiler stehen
  For X := 0 TO MemStream.Size - 1 Do
  Begin
    P^ := Random(256);
    inc(P);
  end;
  FileStream.CopyFrom(MemStream, 0);
finally
  // Objekte freigeben nicht vergessen !!!
  MemStrem.Free;
  FileStream.Free
  end;
end;

Basic-Master 7. Jun 2003 10:23

hmmm warum muss man normaler weise objekte per free beenden? belagern die sonst den speicher?

Luckie 7. Jun 2003 11:14

Zitat:

Zitat von Basic-Master
hmmm warum muss man normaler weise objekte per free beenden? belagern die sonst den speicher?

Sicher. Mit der Methode Create wird eine Instanz der Klasse im Speicger erzeugt und damit Speicher belegt. Gibst du diesen nicht wieder frei, müllst du dir den Speicher deiner eigenen Anwendung voll.
eine wichtige Rolle spielt hier auch der Ressourcen-Schutzblock: try-finally.

flattman 7. Jun 2003 12:41

funktioniert leider immer noch nicht. Der Code sieht jetzt wie folgt aus:

Code:
var memstream:TMemoryStream;
    P:PByte;
    X:integer;
begin
  MemStream:=TMemoryStream.Create;
try
  MemStream.Size := 1024000;
  P:= MemStream.Memory;
  For X := 0 TO MemStream.Size - 1 Do
  Begin
    P^ := Random(256);
    inc(P);
  end;
  memo1.lines.LoadFromStream(memstream);
finally
  memstream.Free;
end;

Luckie 7. Jun 2003 12:56

Zitat:

Zitat von flattman
funktioniert leider immer noch nicht.

Ach Gottchen, wie ich doch diese ungemein genauen Fehlerbeschreibungen liebe: "Geht nicht." "Kommt ein Fehler." "Das Ergebnis ist falsch."
Wir können ja Fehlercodes wie in der API einführen:
  • 0: Alles klar, hat geholfen. Problem gelöst.
  • 1: Geht nicht.
  • 2: Es kommt was raus, was nicht rauskommen soll.
  • 3: Kommt ein Fehler.
  • x: ...

Zitat:

Der Code sieht jetzt wie folgt aus:

Code:
var memstream:TMemoryStream;
    P:PByte;
    X:integer;
begin
  MemStream:=TMemoryStream.Create;
try
  MemStream.Size := 1024000;
  P:= MemStream.Memory;
  For X := 0 TO MemStream.Size - 1 Do
  Begin
    P^ := Random(256);
    inc(P);
  end;
  memo1.lines.LoadFromStream(memstream);
finally
  memstream.Free;
end;

Überleg doch mal, was da passiert. Ich weiß zwar nicht was passieren soll, aber ich sehe, dass da nichts passiert.
Du erstellst einen MemoryStream, gut.
Du legst seine Größe fest, gut.
Du weißt P die Eigenschaft Memory von MemStream zu, wozu auch immer.
Du durchläufst eine Schleife ein paar tausend mal
Code:
for x = 0 -> ....-1
  In der Schleife weißt du P einen zufälligen Wert zu.
  Dann erhöst du diesen zufälligen Wert.
Dann lädst du deinen MemoryStream in ein Memo und was erwartest du da jetzt? An keiner Stelle schreibst du irgendwas in den Stream rein. Jedenfalls sehe ich nicht wo. Allerdings kenne ich mich auch nicht so aus mit Streams. Dieses
P := MemStream.Memory
bereitet mir etwas Kopfzerbrechen.

Christian Seehase 7. Jun 2003 13:12

Moin Flattmann,

auf die Idee die Eigenschaft Memory zu benutzen bin ich zwar auch noch nicht gekommen, aber das Problem liegt wohl eher am Random(256).
probiers mal mit Random(256)+32. Dann hast Du sichergestellt, dass nur darstellbare Zeichen in den Stream geschrieben werden, ansonsten wird, spätestens bei der ersten #00 nichts mehr im Memo angezeigt.

@Luckie:
Es ist zwar vielleicht nicht der üblichste Weg etwas in einen MemoryStream zu schreiben, ohne die Methode Write, aber Flattmanns Weg funktioniert grundsätzlich.

Luckie 7. Jun 2003 13:18

Ich weiß ja nicht, dieses Rumgefuchtel mit den Zeigern im Speicher ist mir irgendwie suspekt. Mit der methode write sehe ich doch gleich auf den ersten Blick was da passiert.

Christian Seehase 7. Jun 2003 13:26

Moin Luckie,

Zitat:

Zitat von Luckie
Ich weiß ja nicht, dieses Rumgefuchtel mit den Zeigern im Speicher ist mir irgendwie suspekt.

:mrgreen:
Woraus ich mal schliesse, das Du auch nicht unbedingt ein Freund von Assembler bist.

eddy 7. Jun 2003 22:18

Hallo flattman,

wäre nicht schlecht, wenn Du schreibst, welcher Sinn sich hinter Deinem Programm-Code verbirgt - nicht nur Luckie fragt sich: "Was hat es zu bedeuten?"

Soll das Bestandteil für Dein Festplatten-Zugriffsgeschwindigkeits-Tool sein?

mfg
eddy


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:02 Uhr.
Seite 1 von 2  1 2      

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