Globales Array in Prozedur erzeugt IMA

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Kurzer
Beiträge: 1614
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Globales Array in Prozedur erzeugt IMA

Beitrag von Kurzer »

#NULL hat geschrieben:Ob die Funktion aufgerufen wird, kann von der Laufzeit abhängen, bzw kann der Compiler nicht wissen.

Code: Alles auswählen

If Random(1) : test() : EndIf
Da haste auch wieder wahr. :D
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2023: 56 Jahre.
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 »

Ich selbst benutze Global in Proceduren nur in Zusammenhang mit Listen/Strukturen/etc. und AttachProcess/-Thread.

Da das so oder so ähnlich in der Hilfe steht, ist es vielleicht so gewollt?
weil einfach einfach einfach ist ... mach' ich es anders
Benutzeravatar
Kurzer
Beiträge: 1614
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Globales Array in Prozedur erzeugt IMA

Beitrag von Kurzer »

Imhotheb hat geschrieben:Da das so oder so ähnlich in der Hilfe steht, ist es vielleicht so gewollt?
Das habe ich auch erst gedacht, aber dem ist eigentlich gerade nicht so.
Die PB-Hilfe zu List hat geschrieben:Die neuen verknüpften Listen sind immer lokal. Dies bedeutet, dass die Global oder Shared Befehle benutzt werden müssen, wenn eine im Haupt-Quellcode deklarierte Liste in Prozeduren verwendet werden soll.
Wie gesagt, ich habe bislang auch nicht weiter drüber nachgedacht und mein Hirn hat nach dem Lesen des Teils "...dass die Global oder Shared Befehle benutzt werden müssen" offenbar abgeschaltet, weil ja "klar war", dass Share nur innerhalb von Prozeduren benutzt werden kann und somit das Global da "wohl auch" benutzt werden kann, wenn es in der Hilfe in einem Atemzug erwähnt wird. Typischer Fall von Freud'scher Verleser/Versteher. :lol:

Denn auch die Beispiele in der PB-Hilfe deklarieren das Objekt nie innerhalb einer Prozedur, soweit ich das gesehen habe.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2023: 56 Jahre.
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 »

Ich meinte diesen Bereich aus der Hilfe:

"
Hinweise zur Erstellung von DLL's:

- Die Deklaration von Arrays, Listen bzw. Maps mittels Dim, NewList bzw. NewMap muss stets innerhalb der Prozedur AttachProcess erfolgen. 
"
weil einfach einfach einfach ist ... mach' ich es anders
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Globales Array in Prozedur erzeugt IMA

Beitrag von GPI »

um ehrlich zu sein, ich bin überrascht, das Global in Proceduren überhaupt erlaubt ist.
So von Sinn her sollte das Steuerwort eine Fehlermeldung verursachen.

edit: Und ist das Handbuch an der Stelle nicht veraltet?
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 »

Imhotheb hat geschrieben:Ich meinte diesen Bereich aus der Hilfe:

"
Hinweise zur Erstellung von DLL's:

- Die Deklaration von Arrays, Listen bzw. Maps mittels Dim, NewList bzw. NewMap muss stets innerhalb der Prozedur AttachProcess erfolgen. 
"
Bei Verwendung vom Modulen bei DLL´s sollte man im Module Bereich eine Procedure InitModul() : Global, etc : EndProcedure : InitModule() programmieren.
Verhält sich dann wie AttachProcess ohne die Übergäbe von hInstance.
Wenn man es nicht so macht führt dieses zu Stack-Korruption...
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Globales Array in Prozedur erzeugt IMA

Beitrag von GPI »

ist das sicher? Weil bei einer DLL wird automatisch sämtlicher Code außerhalb von Proceduren eingesammelt und in die Attach-Procedure gesteckt.
Deshalb meinte ich ja, dass das Handbuch veraltet ist.
in der englischen Hilfe steht:
- The declaration of arrays, lists or map with Dim, NewList or NewMap must always be done inside the procedure AttachProcess.
- Don't write program code outside procedures. The only exception is the declaration of variables or structures.
- DirectX initialization routines must not be written in the AttachProcess procedure.
DIM, NEWLIST und NEWMAP sind auch außerhalb der AttachProcess definitiv erlaubt, in jeder Procedure! Die Zeile klingt danach, als wäre sie noch für die uralte Version geschrieben worden, wo die Arrays, Listen und Maps immer global waren. Das ist ja schon lange nicht mehr der Fall.
Genauso die Zeile mit Code außerhalb der Proceduren - wie gesagt, die werden eigentlich eingesammelt und bei AttachProcess ausgeführt. Ob es noch zu Stackfehlern kommt, weis ich nicht. Wenn ja, sollte man das angehen. Wenn nicht, muss der Compiler eigentlich eine Fehlermeldung schmeißen, wenn man das macht.

Wie gesagt, wirkt so, als wäre das Handbuch schlicht hier veraltet. Und imo sollte das Steuerwort Global innerhalb einer Procedure auch eine Fehlermeldung werfen.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
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 »

Weil bei einer DLL wird automatisch sämtlicher Code außerhalb von Proceduren eingesammelt und in die Attach-Procedure gesteckt.
Ist das gesichert?

Also ich habe das so verstanden, das wenn ich Globale Listen, Maps, etc. brauche, dann muss/soll ich laut Hilfe diese in einer Procedure deklarieren, welche ist dabei egal. Logischerweise ist es dann meistens AttachProccess() oder halt eine selbst definierte Init().

Also lieber außerhalb deklarieren und ein undokumentiertes Feature benutzen?
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 »

Der Code wird nicht in der AttachProcess gesammelt, sondern außerhalb aufgerufen.

Bei mein Module OOP-BaseClassDispatch (DLL) habe ich hier die Erfahrung gesammelt und die verschiedenen Compiler-Versionen den ASM-Code von PB analysiert.

Wegen des undokumentiertes Feature hatte ich schon eine lange Diskussion und habe auch versucht eine offizielle Antwort zu bekommen.
Leider mal wieder ohne erfolgt.

Deswegen haben auch meine Module, die auch in DLL´s verwendet werden, immer eine Init Procedure.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Globales Array in Prozedur erzeugt IMA

Beitrag von Sicro »

How are DLLs correctly programmed? hat geschrieben:You can also declare list in procedure if needed, just not in the main code.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Antworten