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

Globales Array in Prozedur erzeugt IMA

Beitrag von Kurzer »

Moin Kollegen,

mir fiel gerade etwas auf von dem ich nicht genau weiß, ob man es als Bugreport einstellen sollte.

Wird innerhalb einer Prozedur ein Array als Global deklariert und außerhalb der Prozedur noch vor Aufruf der Prozedur auf das Array zugegriffen, dann wird dies vom Compiler nicht bemängelt. Man merkt es erst, wenn das Compilat mit einem Speicherzugriffsfehler abstürzt.

Code: Alles auswählen

EnableExplicit

Procedure Test()
	Global Dim MyArray.s(1)
	MyArray(0) = "Hello"
EndProcedure

; Test()

Debug MyArray(0)

Test()
Zum Testen einfach mal die auskommentierte Zeile 8 ein-/auskommentieren.
Das sollte der Compiler doch eigentlich bemerken, oder?

Gruß Kurzer
"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
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Globales Array in Prozedur erzeugt IMA

Beitrag von RSBasic »

Kurzer hat geschrieben:Das sollte der Compiler doch eigentlich bemerken, oder?
Auf jeden Fall.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Globales Array in Prozedur erzeugt IMA

Beitrag von NicTheQuick »

Kling definitiv nach einem Bug.
Bild
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 »

Danke für die Einschätzung, ich habe das jetzt im englischen Forum als Bug gemeldet.
"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
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Globales Array in Prozedur erzeugt IMA

Beitrag von mk-soft »

Ich weiss nicht ob es ein Bug ist...

Das Array wird erst der Speicher reserviert wenn auch DIM aufgerufen wird.
Wenn dieses erst in einer Procedure erfolgt, ist der Speicher dann erst verfügbar...

Anderer logischer Fehler...

Code: Alles auswählen

EnableExplicit

Procedure Test()
   Global Dim MyArray.s(1)
   MyArray(0) = "Hello"
EndProcedure

 Test()

Define a.s = MyArray(2)

Test()
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Globales Array in Prozedur erzeugt IMA

Beitrag von Nino »

Global innerhalb einer Prozedur zu schreiben ist m.E. schlechter Programmierstil und hat zur Folge, dass das Programm schlechter pflegbar ist.
Wenn es nach mir ginge, würde der Compiler das schon gar nicht durchgehen lassen.
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: Globales Array in Prozedur erzeugt IMA

Beitrag von #NULL »

Ich denke mk-soft hat recht, denn definiert ist das array ja, auch wenn die funktion nicht aufgerufen wird:

Code: Alles auswählen

EnableExplicit

Procedure Test()
   Global Dim MyArray.s(1)
   MyArray(0) = "Hello"
EndProcedure

Debug ArraySize(MyArray()) ; -1
;Test()
Debug ArraySize(MyArray()) ; -1 / 1
my pb stuff..
Bild..jedenfalls war das mal so.
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 »

Ich gebe Nino recht, dass das schlechter Programmierstil ist. :wink:
Und ich vermute weiterhin, dass das vom Compiler nicht gemeldet wird, weil es ein 1 Pass Compiler ist. Wobei er die verschiedenen Scopes bei Modulen ja auch einwandfrei tracen kann, hmmm.
"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
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: Globales Array in Prozedur erzeugt IMA

Beitrag von #NULL »

noch ein Beispiel..

Code: Alles auswählen

EnableExplicit

Declare test2()
Declare test3()

Procedure test()
  test2()
  Global Dim MyArray.s(1)
  test3()
EndProcedure

Procedure test2()
  Debug ArraySize(MyArray()) ; -1
EndProcedure

Procedure test3()
  Debug ArraySize(MyArray()) ;  1
EndProcedure

test()
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: Globales Array in Prozedur erzeugt IMA

Beitrag von #NULL »

Kurzer hat geschrieben:Und ich vermute weiterhin, dass das vom Compiler nicht gemeldet wird, weil es ein 1 Pass Compiler ist. Wobei er die verschiedenen Scopes bei Modulen ja auch einwandfrei tracen kann, hmmm.
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
my pb stuff..
Bild..jedenfalls war das mal so.
Antworten