[OOP] Read error at address %Methodenoffset%

Anfängerfragen zum Programmieren mit PureBasic.
es_91
Beiträge: 410
Registriert: 25.01.2011 04:48

[OOP] Read error at address %Methodenoffset%

Beitrag 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  (  )
DePe
Beiträge: 194
Registriert: 26.11.2017 16:17

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

Beitrag 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
Benutzeravatar
mk-soft
Beiträge: 3844
Registriert: 24.11.2004 13:12
Wohnort: Germany

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

Beitrag von mk-soft »

Der erste Eintrag in der Structure für die Daten muss immer der Zeiger auf die *vTable sein !
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

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

Beitrag 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. :?
Benutzeravatar
mk-soft
Beiträge: 3844
Registriert: 24.11.2004 13:12
Wohnort: Germany

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

Beitrag von mk-soft »

Wie die Zeit vergeht ...
Mein Kleiner OOP Kurs mit PureBasic ist auch schon über 7 Jahre alt.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
es_91
Beiträge: 410
Registriert: 25.01.2011 04:48

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

Beitrag 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:
Lord
Beiträge: 324
Registriert: 21.01.2008 19:11

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

Beitrag 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:
Bild
es_91
Beiträge: 410
Registriert: 25.01.2011 04:48

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

Beitrag von es_91 »

ich hab das jetzt einfach vom englischen abgekupfert: hungarian notation -> straßbourgh notation
Lord
Beiträge: 324
Registriert: 21.01.2008 19:11

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

Beitrag 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.
Bild
es_91
Beiträge: 410
Registriert: 25.01.2011 04:48

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

Beitrag von es_91 »

Weil ich mir die einfach ausgedacht habe ...
Antworten