AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Tmemorystream vs Object factory - Access violation

Tmemorystream vs Object factory - Access violation

Ein Thema von Sequitar · begonnen am 17. Dez 2021 · letzter Beitrag vom 17. Dez 2021
Antwort Antwort
Sequitar

Registriert seit: 8. Jan 2016
74 Beiträge
 
Delphi 10.4 Sydney
 
#1

Tmemorystream vs Object factory - Access violation

  Alt 17. Dez 2021, 17:17
Hallo, ich habe heute (eigentlich schon länger, aber mir ist der Zusammenhang mit (Objekten) der Klasse 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
  Oughtstreamcontent[Index] := Cc; Danke

Geändert von Sequitar (17. Dez 2021 um 17:21 Uhr)
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.003 Beiträge
 
Delphi 2009 Professional
 
#2

AW: Tmemorystream vs Object factory - Access violation

  Alt 17. Dez 2021, 17:23
Welcher Wert steht in Str.Size?
(Vor Beginn der Schleife)
Michael Justin
  Mit Zitat antworten Zitat
Sequitar

Registriert seit: 8. Jan 2016
74 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Tmemorystream vs Object factory - Access violation

  Alt 17. Dez 2021, 17:31
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)

Geändert von Sequitar (17. Dez 2021 um 17:36 Uhr) Grund: Ach VOR der schleife?
  Mit Zitat antworten Zitat
Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
441 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Tmemorystream vs Object factory - Access violation

  Alt 17. Dez 2021, 17:32
Ich nehme mal an du meintest

Oughtstreamcontent[Index] := Cc; // Oughtstreamcontent: Array [0 .. 19] Of Char;
denn sonst wird das eng in dem Array...

3*3 + 3 + 3 + 5 = 20
Whookie

Software isn't released ... it is allowed to escape!

Geändert von Whookie (17. Dez 2021 um 17:35 Uhr)
  Mit Zitat antworten Zitat
Sequitar

Registriert seit: 8. Jan 2016
74 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Tmemorystream vs Object factory - Access violation

  Alt 17. Dez 2021, 18:26
Oh man, manchmal sieht man den wald vor bäumen nicht.
Einfach den Testcode zu checken - 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?

Geändert von Sequitar (17. Dez 2021 um 18:35 Uhr)
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
666 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Tmemorystream vs Object factory - Access violation

  Alt 17. Dez 2021, 21:08
Oh man, manchmal sieht man den wald vor bäumen nicht.
Einfach den Testcode zu checken - 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?
  mystream.Seek(0, soEnd);
Peter Below
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
42.982 Beiträge
 
Delphi 12 Athens
 
#7

AW: Tmemorystream vs Object factory - Access violation

  Alt 17. Dez 2021, 22:39
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.


['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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (17. Dez 2021 um 22:45 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 08:00 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