[BUG] Prototypes

Fragen und Bugreports zur PureBasic 4.0-Beta.
Hellhound66
Beiträge: 476
Registriert: 23.03.2005 23:19

[BUG] Prototypes

Beitrag von Hellhound66 »

Code: Alles auswählen

;XIncludeFile "SYSTEM.PB"


Prototype _SHOW(*SELF)
Prototype.l _HANDLE_EVENT(*SELF)
Prototype.l _DONE(*SELF)

Structure _OBJECT
  *_NEXT._OBJECT
  *_PREVIOUS._OBJECT
  *OWNER._OBJECT
  *CHILD._OBJECT

  SHOW._SHOW
  HANDLE_EVENT._HANDLE_EVENT
  DONE._DONE
  
  ID.l
  TYPE.l
  flags.l
EndStructure


#TYPE_OBJECT              = 1000

Procedure.l FindType(*BASE._OBJECT, STYPE)
  While *BASE <> #Null
    If *BASE\CHILD
      *value = FindType(*BASE\CHILD,STYPE)
      If *value
        ProcedureReturn *value
      EndIf
    EndIf
    If *BASE\TYPE = STYPE
      ProcedureReturn *BASE
    EndIf
    *BASE = *BASE\_NEXT
  Wend
;  Error("Es wurde ein Objekt des Typs "+Str(STYPE)+"innerhalb innerhalb eines Objekttyps "+Str(*BASE\TYPE)+"gesucht, aber nicht gefunden",#errWARNING)
  ProcedureReturn #Null
EndProcedure

Procedure SetFlag(*SELF._OBJECT,flags.l)
  *SELF\flags|flags
EndProcedure

Procedure ClearFlag(*SELF._OBJECT,flags.l)
  *SELF\flags&(~flags)
EndProcedure


Procedure.l _obj_HANDLE_EVENT(*SELF._OBJECT)
  If *SELF\CHILD
    *CHILD._OBJECT = *SELF\CHILD
    While *CHILD
      If *CHILD\HANDLE_EVENT(*CHILD)
        ProcedureReturn #True
      EndIf
      *CHILD = *CHILD\_NEXT
    Wend
  EndIf
  ProcedureReturn #False
EndProcedure

Procedure _obj_SHOW(*SELF._OBJECT)
  *BASE._OBJECT = *SELF\CHILD
  While *BASE <> #Null
    *BASE\SHOW(*BASE)
    *BASE = *BASE\_NEXT
  Wend
EndProcedure

Procedure.l _obj_DONE(*SELF._OBJECT)
  *BASE._OBJECT = *SELF\CHILD
  While *BASE
;    mFree(*BASE\DONE(*BASE))
    *BASE = *BASE\_NEXT
  Wend
  ProcedureReturn *SELF
EndProcedure

Procedure.l CreateObject(SIZE.l)
  *_SELF._OBJECT = AllocateMemory(SIZE)
  ;  *_SELF._OBJECT = mAlloc(SIZE)
  *_SELF\HANDLE_EVENT = @_obj_HANDLE_EVENT()
  *_SELF\SHOW = @_obj_SHOW()
  *_SELF\DONE = @_obj_DONE()
  *_SELF\OWNER = #Null
  *_SELF\CHILD = #Null
  *_SELF\_NEXT = #Null
  *_SELF\_PREVIOUS = #Null
  *_SELF\flags = 0
  *_SELF\ID = _ID
  _ID + 1
  *_SELF\TYPE = #TYPE_OBJECT
  ProcedureReturn *_SELF
EndProcedure

Dieser Code liefert bei mir einen wirren ASM-Fehler. Ohne Prototypes und mit klassischen CallFunctionFast()-Aufrufen funktioniert alles bestens.

Schade, muss ich mit dem Konvertieren meiner Objekte noch ein bissel warten.

/edit: Fehler lautet wie folgt:

PureBasic.asm[297]:
MP12
PureBasic.asm[167] Mp12[19];
And Dword [EBP+20],DWord [EBP+20]
Error: Invalid operand
Optimismus ist ein Mangel an Information.
Hellhound66
Beiträge: 476
Registriert: 23.03.2005 23:19

Beitrag von Hellhound66 »

Hallodri hat folgendes herausgefunden:

Code: Alles auswählen

Procedure.l _obj_HANDLE_EVENT(*SELF._OBJECT)
  Protected dim a.l(0)
  If *SELF\CHILD
    *CHILD._OBJECT = *SELF\CHILD
    While *CHILD
      a(0) = *CHILD\HANDLE_EVENT(*CHILD)
      If a(0)
        ProcedureReturn #True
      EndIf
      *CHILD = *CHILD\_NEXT
    Wend
  EndIf
  ProcedureReturn #False
EndProcedure 
Damit funktionierts. Bloss warum?
Optimismus ist ein Mangel an Information.
Gesperrt