Seite 1 von 3

Globales Array in Prozedur erzeugt IMA

Verfasst: 16.05.2019 09:54
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

Re: Globales Array in Prozedur erzeugt IMA

Verfasst: 16.05.2019 09:59
von RSBasic
Kurzer hat geschrieben:Das sollte der Compiler doch eigentlich bemerken, oder?
Auf jeden Fall.

Re: Globales Array in Prozedur erzeugt IMA

Verfasst: 16.05.2019 10:02
von NicTheQuick
Kling definitiv nach einem Bug.

Re: Globales Array in Prozedur erzeugt IMA

Verfasst: 16.05.2019 10:07
von Kurzer
Danke für die Einschätzung, ich habe das jetzt im englischen Forum als Bug gemeldet.

Re: Globales Array in Prozedur erzeugt IMA

Verfasst: 16.05.2019 21:59
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()

Re: Globales Array in Prozedur erzeugt IMA

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

Re: Globales Array in Prozedur erzeugt IMA

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

Re: Globales Array in Prozedur erzeugt IMA

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

Re: Globales Array in Prozedur erzeugt IMA

Verfasst: 16.05.2019 22:38
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()

Re: Globales Array in Prozedur erzeugt IMA

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