Ungültiger Speicherzugriff in einer Struktur mit String.

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
TomyB
Beiträge: 6
Registriert: 26.02.2012 18:14
Computerausstattung: Samsung NC10 Intel Atom N270 1,6Ghz, 2GB RAM, Windows XP Home
Acer Aspire x3960 i7 3.40 GHz, 4 GB DDR3, Windows 7 Home Premium

Ungültiger Speicherzugriff in einer Struktur mit String.

Beitrag von TomyB »

Windows 7 x64
PB5 Beta6

Ich hoffe mal, das es nicht nur ein Denkfehler von mir ist.
Wenn man folgenden code in der IDE mit Debugger ausführt, bekommt man (ich) einen "Ungültiger Speicherzugriff" Fehler (Schreibfehler an Adresse 4). -> Zeile 39
Dort möchte ich einen string an die erste Stelle einer Struktur schreiben. Wie gesagt es geht nicht, aber wenn ich die Stringvariable, der Struktur, an einer andere stelle in der Struktur platzier, dann läuft der code ohne Probleme.? Mich stört es im Moment nicht, aber so ist es, denke ich, nicht gedacht oder?
Achso das wichtigste. Den Speicherfehler bekomme ich wenn ich den 32bit Compiler benutze, mit dem 64bit Compiler läuft es garnicht, die IDE hängt, bis die Windowsfehlermeldung "Purebasic_Compilation1.exe reagiert nicht mehr. Wollen sie einen Fehlerbericht blablabla........" kommt.
Wie gesagt alles nur mit eingeschalteten Debugger.

das ist die Struktur die verantwortlich ist:

Code: Alles auswählen

Structure Class_MultipartFormdata
	szLastClassError.s
	InterfaceMultipartFormdata.InterfaceMultipartFormdata
	FormdataParts.FormdataParts
	blIsInProgress.b
EndStructure
und hier soweit ich gekommen bin, bis der fehler auftrat.

Code: Alles auswählen

EnableExplicit

Interface MultipartFormdata
	StartMultipartFormdata.i(szHostName.s, szUrlPart.s, szUserAgent.s, szBoundry.s)
EndInterface

Structure InterfaceMultipartFormdata
	*v_class_multipart_formdata
EndStructure

Structure FormdataParts
	szHostName.s
	szUrlPart.s
	szUserAgent.s
	szBoundry.s
	nContenLength.l
EndStructure

Structure Class_MultipartFormdata
	szLastClassError.s
	InterfaceMultipartFormdata.InterfaceMultipartFormdata
	FormdataParts.FormdataParts
	blIsInProgress.b
EndStructure

Procedure.i StartMultipartFormdata(*This.Class_MultipartFormdata, szHostName.s = #NULL$, szUrlPart.s = #NULL$, szUserAgent.s = "PB5", szBoundry.s = "xYzZY")
	
	Protected szcHostName.s{#MAX_PATH}, szWorkString.s
	Protected n.i
	
	If (*This\blIsInProgress = #True)
		*This\szLastClassError = "allready in progress"
		ProcedureReturn 0
	EndIf
	
	If (szHostName = #NULL$)
		n = gethostname_(@szcHostName, #MAX_PATH)
		If (n = #SOCKET_ERROR)
			*This\szLastClassError = "error getting hostname"
			*This\FormdataParts\szHostName = "localhost"
		Else
			*This\FormdataParts\szHostName = szHostName
		EndIf
	EndIf
	
	If (szUrlPart = #NULL$)
		*This\szLastClassError = "error url"
		ProcedureReturn 0
	Else
		If (FindString(szUrlPart, "http://"))
			*This\FormdataParts\szUrlPart = "/" + GetFilePart(szUrlPart)
		ElseIf (FindString(szUrlPart, "www."))
			*This\FormdataParts\szUrlPart = "/" + GetFilePart(szUrlPart)
		Else
			*This\szLastClassError = "error getting url part"
			ProcedureReturn 0
		EndIf
	EndIf
	
	If (szUserAgent = #NULL$)
		*This\FormdataParts\szUserAgent = "Multipartform"
	Else
		*This\FormdataParts\szUserAgent = szUserAgent
	EndIf
	
	If (szBoundry = #NULL$)
		*This\FormdataParts\szBoundry = "xoXox"
	Else
		*This\FormdataParts\szBoundry = szBoundry
	EndIf
	
	ProcedureReturn 1
	
EndProcedure

Procedure.i _Initialize_Class_MultipartFormdata(*This.Class_MultipartFormdata)
	ProcedureReturn *This\InterfaceMultipartFormdata
EndProcedure

Procedure.i CreateObject_MultipartFormdata()
	
	Protected *This.Class_MultipartFormdata
	
	*This = AllocateMemory(SizeOf(Class_MultipartFormdata))
	If (*This = 0): Debug "error allocating memory for class Class_MultipartFormdata"
		ProcedureReturn 0
	EndIf
	InitializeStructure(*This, Class_MultipartFormdata)
	*This\InterfaceMultipartFormdata\v_class_multipart_formdata = ?_v_class_multipart_formdata
	
	ProcedureReturn _Initialize_Class_MultipartFormdata(*This)
	
EndProcedure

Procedure.i _Destroy_Class_MultipartFormdata(*This.Class_MultipartFormdata)
	ProcedureReturn *This
EndProcedure

Procedure.i FreeObject_MultipartFormdata(*This.Class_MultipartFormdata)
	
	_Destroy_Class_MultipartFormdata(*This)
	ClearStructure(*This, Class_MultipartFormdata)
	FreeMemory(*This)
	
	ProcedureReturn 0
	
EndProcedure

DataSection
	_v_class_multipart_formdata:
	Data.i @StartMultipartFormdata()
EndDataSection

Define *Class.MultipartFormdata = CreateObject_MultipartFormdata()
If *Class
	Debug *Class\StartMultipartFormdata("", "http://www.google.de", "", "")
EndIf
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Ungültiger Speicherzugriff in einer Struktur mit String

Beitrag von Danilo »

Der vTable-Pointer muss immer an erster Stelle eines Interfaces stehen.

Du gibst den richtigen Pointer durch "ProcedureReturn _Initialize_Class_MultipartFormdata(*This)"
in _Initialize_Class_MultipartFormdata() zurück.
Aber nun wird dieser Interface-Pointer automatisch (unsichtbar) bei dem Aufruf
"*Class\StartMultipartFormdata("", "http://www.google.de", "", "")" als erstes
Argument übergeben.

Das Problem ist also, die Interface Procedure:
"Procedure.i StartMultipartFormdata(*This.Class_MultipartFormdata, ..."
bekommt nicht den Zeiger auf die Strukture, sondern +4 oder +8 (64bit), da
der Interface-Pointer übergeben wird.

Mach mal:

Code: Alles auswählen

Procedure.i StartMultipartFormdata(*This.Class_MultipartFormdata, szHostName.s = #NULL$, szUrlPart.s = #NULL$, szUserAgent.s = "PB5", szBoundry.s = "xYzZY")

   *This - SizeOf(Integer)
    ; ...
...dann ist es richtig.

Du kannst es auch etwas vereinfachen, wenn Du gleich *vTable als ersten
Eintrag machst. Statt:

Code: Alles auswählen

*This\InterfaceMultipartFormdata\v_class_multipart_formdata = ?_v_class_multipart_formdata
schreibst Du dann:

Code: Alles auswählen

*This\vTable = ?_v_class_multipart_formdata

Code: Alles auswählen

EnableExplicit

Interface MultipartFormdata
   StartMultipartFormdata.i(szHostName.s, szUrlPart.s, szUserAgent.s, szBoundry.s)
EndInterface

Structure FormdataParts
   szHostName.s
   szUrlPart.s
   szUserAgent.s
   szBoundry.s
   nContenLength.l
EndStructure

Structure Class_MultipartFormdata
   *vTable
   szLastClassError.s
   FormdataParts.FormdataParts
   blIsInProgress.b
EndStructure

Procedure.i StartMultipartFormdata(*This.Class_MultipartFormdata, szHostName.s = #NULL$, szUrlPart.s = #NULL$, szUserAgent.s = "PB5", szBoundry.s = "xYzZY")
   
   Protected szcHostName.s{#MAX_PATH}, szWorkString.s
   Protected n.i
   
   If (*This\blIsInProgress = #True)
      *This\szLastClassError = "allready in progress"
      ProcedureReturn 0
   EndIf
   
   If (szHostName = #NULL$)
      n = gethostname_(@szcHostName, #MAX_PATH)
      If (n = #SOCKET_ERROR)
         *This\szLastClassError = "error getting hostname"
         *This\FormdataParts\szHostName = "localhost"
      Else
         *This\FormdataParts\szHostName = szHostName
      EndIf
   EndIf
   
   If (szUrlPart = #NULL$)
      *This\szLastClassError = "error url"
      ProcedureReturn 0
   Else
      If (FindString(szUrlPart, "http://"))
         *This\FormdataParts\szUrlPart = "/" + GetFilePart(szUrlPart)
      ElseIf (FindString(szUrlPart, "www."))
         *This\FormdataParts\szUrlPart = "/" + GetFilePart(szUrlPart)
      Else
         *This\szLastClassError = "error getting url part"
         ProcedureReturn 0
      EndIf
   EndIf
   
   If (szUserAgent = #NULL$)
      *This\FormdataParts\szUserAgent = "Multipartform"
   Else
      *This\FormdataParts\szUserAgent = szUserAgent
   EndIf
   
   If (szBoundry = #NULL$)
      *This\FormdataParts\szBoundry = "xoXox"
   Else
      *This\FormdataParts\szBoundry = szBoundry
   EndIf
   
   ProcedureReturn 1
   
EndProcedure

Procedure.i _Initialize_Class_MultipartFormdata(*This.Class_MultipartFormdata)
   ProcedureReturn *This
EndProcedure

Procedure.i CreateObject_MultipartFormdata()
   
   Protected *This.Class_MultipartFormdata
   
   *This = AllocateMemory(SizeOf(Class_MultipartFormdata))
   If (*This = 0): Debug "error allocating memory for class Class_MultipartFormdata"
      ProcedureReturn 0
   EndIf
   InitializeStructure(*This, Class_MultipartFormdata)
   *This\vTable = ?_v_class_multipart_formdata
   
   ProcedureReturn _Initialize_Class_MultipartFormdata(*This)
   
EndProcedure

Procedure.i _Destroy_Class_MultipartFormdata(*This.Class_MultipartFormdata)
   ProcedureReturn *This
EndProcedure

Procedure.i FreeObject_MultipartFormdata(*This.Class_MultipartFormdata)
   
   _Destroy_Class_MultipartFormdata(*This)
   ClearStructure(*This, Class_MultipartFormdata)
   FreeMemory(*This)
   
   ProcedureReturn 0
   
EndProcedure

DataSection
   _v_class_multipart_formdata:
   Data.i @StartMultipartFormdata()
EndDataSection

Define *Class.MultipartFormdata = CreateObject_MultipartFormdata()
If *Class
   Debug *Class\StartMultipartFormdata("", "http://www.google.de", "", "")
EndIf
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
TomyB
Beiträge: 6
Registriert: 26.02.2012 18:14
Computerausstattung: Samsung NC10 Intel Atom N270 1,6Ghz, 2GB RAM, Windows XP Home
Acer Aspire x3960 i7 3.40 GHz, 4 GB DDR3, Windows 7 Home Premium

AW: Ungültiger Speicherzugriff in einer Struktur mit String

Beitrag von TomyB »

Alles klar danke für die information ich werde deine ratschläge befolgen.
Also doch ein denkfehler von mir.
Bitte dieses thema verschieben.
Anfänger, da gehört es, denke ich mal, hin.


Edit
Ich wollte die struktur doch nur etwas struktuieren :*)
TomyB
Beiträge: 6
Registriert: 26.02.2012 18:14
Computerausstattung: Samsung NC10 Intel Atom N270 1,6Ghz, 2GB RAM, Windows XP Home
Acer Aspire x3960 i7 3.40 GHz, 4 GB DDR3, Windows 7 Home Premium

Re: Ungültiger Speicherzugriff in einer Struktur mit String

Beitrag von TomyB »

Sorry, das ich hier nochmal erscheine.

Es klappt alles so wie du gesagt hast.
Doch eines hat mich noch gestört.

Sollte unter 64bit der Debugger nicht zumindest das gleiche ausspucken wie unter 32bit?
Bei mir bleibt er wie gesagt hängen und dann kommt von Windows diese oben genannte standard Fehlermeldung. (und die PB IDE meldet das der Debugger geschlossen wurde)
Habe es eben nochmal zu Hause mit PB4.6 Win7 probiert.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Ungültiger Speicherzugriff in einer Struktur mit String

Beitrag von Danilo »

Mein letzter Code gibt hier auch "1" aus mit PB 4.61 /x64 und Win7.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten