![]() |
Warum geht das nicht?
Hallo,
kann mir jemand sagen warum ich immer eine fehlermeldung mit zugriffsverletztung bekomme?
Code:
MFG & thx
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); Flattman |
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; |
hmmm warum muss man normaler weise objekte per free beenden? belagern die sonst den speicher?
|
Zitat:
eine wichtige Rolle spielt hier auch der Ressourcen-Schutzblock: try-finally. |
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; |
Zitat:
Wir können ja Fehlercodes wie in der API einführen:
Zitat:
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:
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
for x = 0 -> ....-1
In der Schleife weißt du P einen zufälligen Wert zu. Dann erhöst du diesen zufälligen Wert. P := MemStream.Memory bereitet mir etwas Kopfzerbrechen. |
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. |
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.
|
Moin Luckie,
Zitat:
Woraus ich mal schliesse, das Du auch nicht unbedingt ein Freund von Assembler bist. |
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. |
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