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:
... in dem Falle ist 12 der Offset (Versatz) der Methode im Interface (kommen ja erst addRef, release und queryInterface, danach meine Prozeduren)read error at address: 12
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
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 ( )