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.
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.