Seite 2 von 3

Re: Globales Array in Prozedur erzeugt IMA

Verfasst: 16.05.2019 22:49
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

Re: Globales Array in Prozedur erzeugt IMA

Verfasst: 17.05.2019 05:38
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?

Re: Globales Array in Prozedur erzeugt IMA

Verfasst: 17.05.2019 09:42
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.

Re: Globales Array in Prozedur erzeugt IMA

Verfasst: 17.05.2019 09:50
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. 
"

Re: Globales Array in Prozedur erzeugt IMA

Verfasst: 17.05.2019 15:26
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?

Re: Globales Array in Prozedur erzeugt IMA

Verfasst: 17.05.2019 22:54
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...

Re: Globales Array in Prozedur erzeugt IMA

Verfasst: 18.05.2019 07:05
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.

Re: Globales Array in Prozedur erzeugt IMA

Verfasst: 18.05.2019 09:09
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?

Re: Globales Array in Prozedur erzeugt IMA

Verfasst: 18.05.2019 11:26
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.

Re: Globales Array in Prozedur erzeugt IMA

Verfasst: 18.05.2019 11:28
von Sicro
How are DLLs correctly programmed? hat geschrieben:You can also declare list in procedure if needed, just not in the main code.