Globales Array in Prozedur erzeugt IMA

Für allgemeine Fragen zur Programmierung mit PureBasic.
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Globales Array in Prozedur erzeugt IMA

Beitrag von GPI »

@mksoft
oha.
Wobei ich persönlich da von einen Bug reden würde. Entweder sammelt PB allen code außerhalb der Routinen ein und packt automatisch in die Procedure oder es sollte eine Fehlermeldung schmeißen, das bei einer DLL kein Code außerhalb sein darf.

Wobei wie gesagt, ich das Global in Proceduren komisch finde, das hat da einfach nichts zu suchen. Wobei PB auch zwischen Protected und Define unterscheidet - was auch immer der unterschied sein soll.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Globales Array in Prozedur erzeugt IMA

Beitrag von mk-soft »

Bei Modulen für DLL´s verwende ich immer diesen Aufbau...
Somit wird die Regel eingehalten das man bei DLL´s Listen, Maps und Arrays nur in Prozeduren Initialisiert werden dürfen.
Dazu gehören auch Zuweisungen von Startwerten. Habe so meine Erfahrungen gesammelt das wohl Code außerhalb von Prozeduren sonst den Stack zerschiessen. Und das nur bei DLL´s

Code: Alles auswählen

DeclareModule MyModule
  Declare DoAny(Index)
EndDeclareModule

Module MyModule
  
  Procedure InitModule()
    Global Dim MyArray(1)
    Global NewList MyList()
    MyArray(0) = 100
  EndProcedure : InitModule()
  
  Procedure DoAny(Index)
    ProcedureReturn MyArray(Index)
  EndProcedure
  
EndModule

Debug MyModule::DoAny(0)
DLL´s sind irgendwie ein Sonderfall...
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

Re: Globales Array in Prozedur erzeugt IMA

Beitrag von Imhotheb »

Also MyModule::InitModule() hätte ich jetzt in AttachProcess() gepackt ... der Aufruf von MyModule::InitModule() ist doch auch schon Code außerhalb von Proceduren, oder nicht? ... dann kann ich also auch zig andere eigene Funktionen aufrufen?

Finde das alles sehr "schwammig"
weil einfach einfach einfach ist ... mach' ich es anders
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Globales Array in Prozedur erzeugt IMA

Beitrag von mk-soft »

Nicht ganz...

InitModule() ist von Type Void und somit das gleiche wie PB intern auch seine eigenen Prozeduren aufrufen um die Libraries zu initialisiert.
Habe mich schon sehr lange damit beschäftigt.
Somit erzeugen die Macros für mein OOP BaseClass und BaseClassDispatch immer gekapselte Prozeduren, damit diese auch in DLL´s funktionieren.

Es ist schon sehr schwammig, da von Fred immer noch nicht keine eindeutige Aussage bekommen habe.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Globales Array in Prozedur erzeugt IMA

Beitrag von mk-soft »

Wie man sieht packt Purebasic alle Codes außerhalb von Prozeduren in die PB interne Prozedur PB_DLLInit
und ruft somit die eigene Prozedur InitModule (_Procedure2) auch richtig auf.
;
; PureBasic 5.71 beta 1 LTS (Windows - x64) generated code
;
; (c) 2019 Fantaisie Software
;
; The header must remain intact for Re-Assembly
;
; :DLL
; LinkedList
; Object
; SimpleList
; Array
; :System
; kernel32.lib
; :Import
;
format MS64 COFF
;
;
extrn PB_NewList
extrn PB_FreeList
extrn PB_FreeObjects
extrn PB_InitArray
extrn PB_InitList
extrn GetModuleHandleW
extrn HeapCreate
extrn HeapDestroy
extrn memset
extrn SYS_AllocateArray
public _PB_Instance
public PB_ExecutableType
public PB_OpenGLSubsystem
public _PB_MemoryBase
public PB_Instance
public PB_MemoryBase
public PB_EndFunctions
public _DLLEntryPoint@12

macro pb_public symbol
{
public _#symbol
public symbol
_#symbol:
symbol:
}

macro pb_align value { rb (value-1) - ($-_PB_DataSection + value-1) mod value }
macro pb_bssalign value { rb (value-1) - ($-_PB_BSSSection + value-1) mod value }

;
section '.code' code readable executable align 4096
;
;
_DLLEntryPoint@12:
SUB rsp,40
CMP rdx,1
JNE .SkipProcessAttach
MOV [_PB_Instance],rcx
CALL PB_DllInit
JMP .End
.SkipProcessAttach:
CMP rdx,2
JNE .SkipThreadAttach
JMP .End
.SkipThreadAttach:
CMP rdx,0
JNE .SkipProcessDetach
CALL _PB_EOP
JMP .End
.SkipProcessDetach:
CMP rdx,3
JNE .SkipThreadDetach
.SkipThreadDetach:
.End:
MOV rax,1
ADD rsp,40
RET
;
PB_DllInit:
SUB rsp,40
XOR r8,r8
MOV rdx,4096
XOR rcx,rcx
CALL HeapCreate
MOV [PB_MemoryBase],rax
CALL PB_InitArray
CALL PB_InitList

; DeclareModule MyModule
; Declare DoAny(Index)
; EndDeclareModule
;
; Module MyModule
;
CALL _Procedure2
;
;
; EndModule
;
;
ADD rsp,40
RET
_PB_EOP:
SUB rsp,40
CALL PB_EndFunctions
MOV rcx,[PB_MemoryBase]
CALL HeapDestroy
ADD rsp,40
RET
PB_EndFunctions:
SUB rsp,40
CALL PB_FreeObjects
ADD rsp,40
RET
;
; Procedure InitModule()
_Procedure2:
PUSH rbp
PUSH r15
PS2=64
SUB rsp,40
; Global Dim MyArray(1)
SUB rsp,24
MOV rdx,2
LEA rax,[mymodule.a_MyArray]
PUSH rax
XOR r9,r9
MOV r8,21
MOV rcx,8
SUB rsp,32
CALL SYS_AllocateArray
ADD rsp,64
MOV qword [mymodule.a_MyArray],rax
; Global NewList MyList()
PUSH qword [mymodule.t_MyList]
POP rcx
CALL PB_FreeList
MOV r9,21
XOR r8,r8
LEA rdx,[mymodule.t_MyList]
MOV rcx,8
CALL PB_NewList
; MyArray(0) = 100
MOV rbp,qword [mymodule.a_MyArray]
MOV qword [rbp+0],100
; EndProcedure : InitModule()
_EndProcedureZero3:
XOR rax,rax
_EndProcedure3:
ADD rsp,40
POP r15
POP rbp
RET
;
section '.data' data readable writeable
;
_PB_DataSection:
PB_OpenGLSubsystem: db 0
pb_public PB_DEBUGGER_LineNumber
dd -1
pb_public PB_DEBUGGER_IncludedFiles
dd 0
pb_public PB_DEBUGGER_FileName
db 0
pb_public PB_Compiler_Unicode
dd 1
pb_public PB_Compiler_Thread
dd 0
pb_public PB_Compiler_Purifier
dd 0
pb_public PB_Compiler_Debugger
dd 0
pb_public PB_Compiler_DPIAware
dd 0
PB_ExecutableType: dd 0
pb_align 8
pb_align 8
pb_align 8
s_s:
dq 0
dq -1
pb_align 8
;
section '.bss' readable writeable
_PB_BSSSection:
pb_bssalign 8
;
I_BSSStart:
_PB_MemoryBase:
PB_MemoryBase: rq 1
_PB_Instance:
PB_Instance: rq 1
PB_ExitCode: rq 1
;
pb_bssalign 8
PB_DataPointer rq 1
pb_bssalign 8
pb_bssalign 8
pb_bssalign 8
pb_bssalign 8
mymodule.a_MyArray:
rq 1
rq 1
mymodule.t_MyList rq 2
I_BSSEnd:
section '.data' data readable writeable
SYS_EndDataSection:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

Re: Globales Array in Prozedur erzeugt IMA

Beitrag von Imhotheb »

Gut zu wissen, danke :allright:

Hier wäre wirklich mal eine eindeutige Aussage von Fred fällig!
weil einfach einfach einfach ist ... mach' ich es anders
Antworten