Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Tmemorystream vs Object factory - Access violation (https://www.delphipraxis.net/209534-tmemorystream-vs-object-factory-access-violation.html)

Sequitar 17. Dez 2021 16:17

Tmemorystream vs Object factory - Access violation
 
Hallo, ich habe heute (eigentlich schon länger, aber mir ist der Zusammenhang mit (Objekten) der Klasse
Delphi-Quellcode:
Tmemorystream
erst heute aufgefallen) folgendes Problem:

Ich versuche mithilfe einer - bisher problemlos laufenden - Factory eine bestimmte generische Klasse "Tmyclass<tmemorystream>", ggf "Tmyclass<tstream>" zu erstellen. Die Variante mit "<tmemorystream>" wurde vorher ordnungsgemäß (innerhalb meiner tfactory) registriert, und wird gefunden.

Also, zum problem:
Der ablauf ist bisher folgender:
try
- erstellung tmemorystream
- befüllen obj:tmemstream..
- Versuch erstellung Tmyclass, die dann was mit obj machen sollte. //XXX
{..}
finally
- freeall..
end

An der Stelle /XXX knallt es jetzt jedes Mal bei der Erstellung des Objektes (Es sei hier angemerkt dass der Fehler sowohl als Tmyclass.create, als auch per Tfactory.makenewobject(tmyclass)auftritt). Im Speziellen bekomme ich eine EAccesviolation (read of address ...).

Heute habe ich dann - endlich - das Problem auf die Erstellng / Befüllung des memory-streams zurückführen können.
Alles, was danach kommt löst direkt eine EAccessviolation aus.

ZUM EIGENTLICHEN PROBLEMBEREICH

Eigentlich will ich doch nur (nachvollziehbare) in den stream sschreiben. Aber anscheinend schreibt der dabei an Stellen, wo er nicht dürfte:

Delphi-Quellcode:

 Str := Tmemorystream.Create; //  Str, Comp, Todecomp: Tmemorystream;
    For J := 0 To 2 Do
      For I In ['A' .. 'C'] Do
        Str.WriteBuffer(I, Charsize);
    For K In ['D' .. 'F'] Do
      Str.WriteBuffer(K, Charsize);
    For I In ['A' .. 'C'] Do
      Str.WriteBuffer(I, Charsize);
    For I In ['A' .. 'E'] Do
      Str.WriteBuffer(I, Charsize);
    // For Var I: Char In ['A' .. 'C'] Do
    // Str.Writebuffer(I, Charsize);
    Str.Position := 0;
    Index := 0;
    While Str.Position <> Str.Size Do
    Begin
      Str.ReadBuffer(Cc, Charsize);
      Oughtstreamcontent[Index] := Cc; //  Oughtstreamcontent: Array [0 .. 14] Of Char;
      Inc(Index);
    End;
Alle Variablen sind lokal definiert.

Bitte um Hlfe, was ist hier der Fall?

//ES LIEGT MMN DEFINITIV AN DER BEFÜLLUNG DES ARRAYS
Delphi-Quellcode:
  Oughtstreamcontent[Index] := Cc;
Danke

mjustin 17. Dez 2021 16:23

AW: Tmemorystream vs Object factory - Access violation
 
Welcher Wert steht in Str.Size?
(Vor Beginn der Schleife)

Sequitar 17. Dez 2021 16:31

AW: Tmemorystream vs Object factory - Access violation
 
Zitat:

Zitat von mjustin (Beitrag 1499289)
Welcher Wert steht in Str.Size?
(Vor Beginn der Schleife)

40, aber wenn ich richtig gezählt habe sollten es nur 34 sein?

Delphi-Quellcode:
    For J := 0 To 2 Do
      For I In ['A' .. 'C'] Do
        Str.WriteBuffer(I, Charsize); //+6
    For K In ['D' .. 'F'] Do
      Str.WriteBuffer(K, Charsize); //+3
    For I In ['A' .. 'C'] Do
      Str.WriteBuffer(I, Charsize); //+3
    For I In ['A' .. 'E'] Do
      Str.WriteBuffer(I, Charsize); //+5
VOR Der schleife: 0.
Vor der while-schleife: 40 (wie oben geschrieben)

Whookie 17. Dez 2021 16:32

AW: Tmemorystream vs Object factory - Access violation
 
Ich nehme mal an du meintest

Delphi-Quellcode:
Oughtstreamcontent[Index] := Cc; // Oughtstreamcontent: Array [0 .. 19] Of Char;

denn sonst wird das eng in dem Array...

3*3 + 3 + 3 + 5 = 20

Sequitar 17. Dez 2021 17:26

AW: Tmemorystream vs Object factory - Access violation
 
Oh man, manchmal sieht man den wald vor bäumen nicht.
Einfach den Testcode zu checken:wall: - und das bei so einfachen dingen, wie array-befüllung!
Danke hierfür.

Aber es ist schon sehr verwirrend, wenn dann plötzlich an ganz unerwarteter Stelle solche Dinge auftreten und du im working code keinen Fehler entdecken kannst . Jetzt kann ich mich endlich an die Korrektur der Funktionalität des Kern-Algorithmus setzen.

Dann wäre noch eine Frage
um an das ENDE eines streams anzuhängen, wo muss ich die position setzen: mystream.size oder mystream.size-1?

peterbelow 17. Dez 2021 20:08

AW: Tmemorystream vs Object factory - Access violation
 
Zitat:

Zitat von Sequitar (Beitrag 1499300)
Oh man, manchmal sieht man den wald vor bäumen nicht.
Einfach den Testcode zu checken:wall: - und das bei so einfachen dingen, wie array-befüllung!
Danke hierfür.

Aber es ist schon sehr verwirrend, wenn dann plötzlich an ganz unerwarteter Stelle solche Dinge auftreten und du im working code keinen Fehler entdecken kannst . Jetzt kann ich mich endlich an die Korrektur der Funktionalität des Kern-Algorithmus setzen.

Dann wäre noch eine Frage
um an das ENDE eines streams anzuhängen, wo muss ich die position setzen: mystream.size oder mystream.size-1?

Delphi-Quellcode:
  mystream.Seek(0, soEnd);

himitsu 17. Dez 2021 21:39

AW: Tmemorystream vs Object factory - Access violation
 
Schalte mal in den Projektoptionen die Index-Prüfung an .... du hast mehr Daten im Stream, als in das Array passt und du dann auf einen Index zugreifst, den es garnicht gibt.


Delphi-Quellcode:
['A' .. 'C']
ist immer ein TSysCharSet, also AnsiChar (leider gibt es kein WideCharSet)

somit dürfte I auch ein AnsiChar sein und die WriteBuffer ein Byte mehr schreiben, als es gibt ... auf dem Stack ist dort aber Speicher, womit es nicht knallt, aber quasi hast du dann ein jeweils Zufallsbyte im Stream.


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