@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.
Globales Array in Prozedur erzeugt IMA
Re: Globales Array in Prozedur erzeugt IMA
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Re: Globales Array in Prozedur erzeugt IMA
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
DLL´s sind irgendwie ein Sonderfall...
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)
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
- 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
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"
Finde das alles sehr "schwammig"
weil einfach einfach einfach ist ... mach' ich es anders
Re: Globales Array in Prozedur erzeugt IMA
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.
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
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: Globales Array in Prozedur erzeugt IMA
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.
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
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
- 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
Gut zu wissen, danke
Hier wäre wirklich mal eine eindeutige Aussage von Fred fällig!
Hier wäre wirklich mal eine eindeutige Aussage von Fred fällig!
weil einfach einfach einfach ist ... mach' ich es anders