AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Warum geht das nicht?

Ein Thema von flattman · begonnen am 7. Jun 2003 · letzter Beitrag vom 8. Jun 2003
Antwort Antwort
Seite 1 von 2  1 2      
flattman

Registriert seit: 2. Nov 2002
Ort: Oldenburg (Oldenburg)
39 Beiträge
 
Delphi 2009 Professional
 
#1

Warum geht das nicht?

  Alt 7. Jun 2003, 08:39
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
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#2
  Alt 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;
  Mit Zitat antworten Zitat
Basic-Master

Registriert seit: 9. Mär 2003
Ort: Brilon
395 Beiträge
 
Delphi 2007 Enterprise
 
#3
  Alt 7. Jun 2003, 10:23
hmmm warum muss man normaler weise objekte per free beenden? belagern die sonst den speicher?
Christian
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4
  Alt 7. Jun 2003, 11:14
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
flattman

Registriert seit: 2. Nov 2002
Ort: Oldenburg (Oldenburg)
39 Beiträge
 
Delphi 2009 Professional
 
#5
  Alt 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;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6
  Alt 7. Jun 2003, 12:56
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#7
  Alt 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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8
  Alt 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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#9
  Alt 7. Jun 2003, 13:26
Moin Luckie,

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

Woraus ich mal schliesse, das Du auch nicht unbedingt ein Freund von Assembler bist.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von eddy
eddy

Registriert seit: 3. Jan 2003
Ort: Sachsen
573 Beiträge
 
Delphi 5 Professional
 
#10
  Alt 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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:54 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