Seite 1 von 1

[OOP] Read error at address %Methodenoffset%

Verfasst: 19.05.2025 18:41
von es_91
Ich bin hier mit x86 unterwegs. Sollte aber nicht daran liegen.

Hier im Forum haben ja einige tolle OOP-Kurse gegeben. Bei der Umsetzung einer Klasse tritt hier plötzlich ein Fehler auf, der sehr simpel aussieht, ich kann ihn aber nicht selbst ausfindig machen.

Normalerweise schreibe ich meine Methoden ins Interface und in die DataSection und rufe sie vom *object aus auf, doch diesmal gibt PureBasic 6.20 mir die Fehlermeldung:
read error at address: 12
... in dem Falle ist 12 der Offset (Versatz) der Methode im Interface (kommen ja erst addRef, release und queryInterface, danach meine Prozeduren)

Kennt jemand diesen Fall und weiß, was das zu bedeuten hat? Ich poste dazu hier mal mein Interface und meine DataSection, weiter unten den gesamten Quelltext:

Code: Alles auswählen

interface  window
;{
	
	addRef  (  )
	release  (  )
	queryInterface  (  *riId,  
	                   *addr  )
	
	eigeneMethode  (  )
	
;}
endInterface

Code: Alles auswählen

; alles da...
dataSection
;{
	
	vKlasse:
	
	data.  i  @  addRef  (  )
	data.  i  @  release  (  )
	data.  i  @  queryInterface  (  )
	
	data.  i  @  eigeneMethode  (  )
		
;}
endDataSection

Code: Alles auswählen

; die Registrierung - ganz normal
*object  \  vTable  =  ?  vKlasse
*object  \  objMutex  =  createMutex  (  )
*object  \  cntRef  =  #null
Entschuldigt die Klammerklaue. Der Fehler tritt erst im Aufruf über die Datenstruktur auf:

Code: Alles auswählen

*mainForm.  form::window

*mainForm  =  form::new  (  )

*mainForm  \  eigeneMethode  (  )  ;  HIER KRACHT'S

Der gesamte Quelltext:

Code: Alles auswählen



declareModule  form
;{
	
	#main  =  #null
	
	interface  window
	;{
		
		addRef  (  )
		release  (  )
		queryInterface  (  *riId,  
		                   *addr  )
		
		getId  (  )
		kill  (  )
		shout  (  centerWindow.  b  =  #false  )
		
	;}
	endInterface
	
	
	structure  sBase
	;{
		
		cntRef.  i
		objMutex.  i
		*vTable
		
		type.  b
		winId.  i
		
	;}
	endStructure
	
	
	declare  newWindow  (  type.  b  )
	
	
;}
endDeclareModule



module  form
;{
	
	;{
		
		procedure  newWindow  (  type.  b  )
		;{
			
			protected  *object.  sBase
			
			*object  =  allocateStructure  (  sBase  )
			
			if  (  *object  )
			;{
				
				*object  \  vTable  =  ?  vWindow
				*object  \  objMutex  =  createMutex  (  )
				*object  \  cntRef  =  #null
				
				*object  \  type  =  type.  b
				*object  \  winId  =  openWindow  (  #pb_any,  
				                                     0,  
				                                     0,  
				                                     320,  
				                                     200,  
				                                     #empty$,  
				                                     #pb_window_invisible  )
				
			;}
			endIf
			
			procedureReturn  (  *object  )
			
		;}
		endProcedure
		
		
		procedure  addRef  (  *this.  sBase  )
		;{
			
			with  *this
			;{
				
				lockMutex  (  \  objMutex  )
				
				\  cntRef  +  1
				
				unlockMutex  (  \  objMutex  )
				
				procedureReturn  (  \  cntRef  )
				
			;}
			endWith
			
		;}
		endProcedure
		
		
		procedure  release  (  *this.  sBase  )
		;{
			
			protected  index
			protected  cnt
			
			with  *this
			;{
				
				lockMutex  (  \  objMutex  )
				
				if  (  \  cntRef  )
				;{
					
					\  cntRef  -  1
					
				;}
				else
				;{
					
					freeMutex  (  \  objMutex  )
					
					freeStructure  (  *this  )
					
					procedureReturn
					
				;}
				endIf
				
				unlockMutex  (  \  objMutex  )
				
				procedureReturn  (  \  cntRef  )
				
			;}
			endWith
			
		;}
		endProcedure
		
		
		procedure  queryInterface  (  *this.  sBase,  
		                              *riId,  
		                              *addr  )
		;{
			
			procedureReturn  (  2147500034  )
			
		;}
		endProcedure
		
		
		procedure  getId  (  *this.  sBase  )
		;{
			
			procedureReturn  (  *this  \  winId  )
			
		;}
		endProcedure
		
		
		procedure  kill  (  *this.  sBase  )
		;- kill
		; //  finishes execution of a window
		;{
			
			closeWindow  (  *this  \  winId  )
			
		;}
		endProcedure
		
		
		procedure  shout  (  *this.  sBase,  
		                     centerWindow.  b  =  #false  )
		;- shout
		; //  displays the window
		;{
			
			hideWindow  (  *this  \  winId,  
			               #false,  
			               #pb_window_screenCentered  *  centerWindow  )
			
		;}
		endProcedure
		
	;}
	
	
	;- form module data section
	; //  data interface of form class
	;{
		
		dataSection
		;{
			
			vWindow:
			
			data.  i  @  addRef  (  )
			data.  i  @  release  (  )
			data.  i  @  queryInterface  (  )
			
			data.  i  @  getId  (  )
			data.  i  @  kill  (  )
			data.  i  @  shout  (  )
			
		;}
		endDataSection
		
	;}
	
;}
endModule


declareModule  app
;{
	
	declare  execute  (  )
	
;}
endDeclareModule



module  app
;{
	
	procedure  execute  (  )
	;{
		
		*mainForm.  form::window
		
		*mainForm  =  form::newWindow  (  form::#main  )
		
		*mainForm  \  shout  (  )
		
		
		repeat
		;{
			
			nowEvent  =  waitWindowEvent  (  )
			nowActivated  =  getActiveWindow  (  )
			nowWindow  =  eventWindow  (  )
			
			select  (  nowEvent  )
			;{
				
				case  (  #pb_event_closeWindow  )
				;{
					
					select  (  nowWindow  )
					;{
						
						case  (  *mainForm  \  getId  (  )  )
						;{
							
							*mainForm  \  kill  (  )
							
						;}
						
					;}
					endSelect
					
				;}
				
			;}
			endSelect
			
		;}
		forEver
		
	;}
	endProcedure
	
;}
endModule


app::execute  (  )


/edit: Selbst dies schlägt fehl:

Code: Alles auswählen

debug  @  *mainForm  \  shout  (  )

Re: [OOP] Read error at address %Methodenoffset%

Verfasst: 19.05.2025 20:10
von DePe
Wenn du die Reihenfolge der Felder in der Struktur änderst, gibt es keinen Fehler.

Peter

Code: Alles auswählen

	structure  sBase
	;{
		
		*vTable
		objMutex.  i
		cntRef.  i
		
		type.  b
		winId.  i
		
	;}
	endStructure

Re: [OOP] Read error at address %Methodenoffset%

Verfasst: 19.05.2025 20:33
von mk-soft
Der erste Eintrag in der Structure für die Daten muss immer der Zeiger auf die *vTable sein !

Re: [OOP] Read error at address %Methodenoffset%

Verfasst: 20.05.2025 11:19
von NicTheQuick
Erstens: mk-soft hat die Lösung bereits gesagt.
Zweitens: Gibt es einen Grund warum du so wahnsinnig viele Leerzeichen überall einbaust? Das ist ja extrem unübersichtlich. :?

Re: [OOP] Read error at address %Methodenoffset%

Verfasst: 20.05.2025 18:37
von mk-soft
Wie die Zeit vergeht ...
Mein Kleiner OOP Kurs mit PureBasic ist auch schon über 7 Jahre alt.

Re: [OOP] Read error at address %Methodenoffset%

Verfasst: 23.05.2025 17:36
von es_91
Vielen Dank für die Korrektur! Da habe ich wohl bei der alphabetischen Ordnung nicht richtig aufgepasst. :freak:

@NicTheQuick: Die "Straßburger Notation" ist das. ;-) :mrgreen:

Re: [OOP] Read error at address %Methodenoffset%

Verfasst: 24.05.2025 10:38
von Lord
es_91 hat geschrieben: 23.05.2025 17:36...
@NicTheQuick: Die "Straßburger Notation" ist das. ;-) :mrgreen:
Hm, wußte bisher noch nicht, daß man PB-Programme auch singen oder von einem Orchester spielen lassen kann. :shock:

Re: [OOP] Read error at address %Methodenoffset%

Verfasst: 25.05.2025 05:28
von es_91
ich hab das jetzt einfach vom englischen abgekupfert: hungarian notation -> straßbourgh notation

Re: [OOP] Read error at address %Methodenoffset%

Verfasst: 25.05.2025 15:04
von Lord
es_91 hat geschrieben: 25.05.2025 05:28... -> straßbourgh notation
Und wie sieht die Grundlage dazu aus? Hab' keine Referenz dazu im INet gefunden.

Re: [OOP] Read error at address %Methodenoffset%

Verfasst: 27.05.2025 20:43
von es_91
Weil ich mir die einfach ausgedacht habe ...