PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Compiler Bug mit CONFIG BASE ?



Searcher
29.11.2012, 13:34
Kürzlich benötigte ich Arrays, die mit Index 0 beim ersten Element beginnen. In BASCOM beginnen Arrays standardmäßig mit Index 1. Mit CONFIG BASE kann man das auf 0 umstellen.

Irgendwie nahm ich an, daß zB im "Dim Array(2) As Byte" statement mit der Zwei das letzte zu indizierende Element gemeint sei.

Man kann Array(2) auch ansprechen und Zuweisungen machen. Darf man aber nicht!
Das Array(2) Element wird von der folgend deklarierten Variablen überschrieben!

Wenn mit 2 die Anzahl einzurichtender Elemente gemeint ist und nicht als letztes zu adressierendes Element, sollte der Compiler bei Ansprechen von Array(2) einen Fehler melden.

Ich finde, daß das in die Beschreibung zum Einrichten eines Arrays gehört und der Compiler wenigstens bei Ansprechen des ungültigen Elements mit einer Konstanten einen Fehler ausgibt. Das tut er, wenn das nächst höhere, auch ungültige, nicht existierende Element :) angesprochen wird.

Habe ich in der Demo Version 2.0.5.0 festgestellt und heute auf 2.0.7.5 umgestellt. Ist dort aber genau so. In der BASCOM Hilfe zum Kommando CONFIG BASE gibt es den Hinweis, daß das letzte Element invalid sei.

Im Simulator nachzuvollziehen mit folgendem Code:

'##### BASCOM Demo Version 2.0.5.0 #####
'##### BASCOM Demo Version 2.0.7.5 #####

$regfile = "m88def.dat"
$framesize = 32
$swstack = 32
$hwstack = 36
$crystal = 8000000

Config Base = 0 'Array Indices beginnen mit 0

Dim Array(2) As Byte 'Array mit 2 (3?) Elementen einrichten
Dim X As Byte 'Bytevariable einrichten

Array(0) = 1
Array(1) = 2
Array(2) = 3 'sollte nicht möglich sein -> Compiler Fehlermeldung
'Array(3) = 4 'Compiler reports "Index out of range[3]", OK

X = 1 'Hier wird im SRAM Speicher Array(2) überschrieben!!!

End 'end program

Falls ich da offene Türen einrenne, bitte ich schon mal um Entschuldigung :-b
Gruß
Searcher

for_ro
29.11.2012, 13:47
Hallo searcher,
ich nehme an, dass MCS den Test auf gültige Elemente nicht angepasst hat, als sie den Befehl Config Base = 0 eingeführt haben. Deswegen ist es erst das übernächste Element, welches eine Fehlermeldung auslöst, weil das vorher auch schon ungültig war.
Da man aber meistens eh mit einer Variablen als Index arbeitest und dort kein Test vom Compiler durchgeführt werden kann, habe ich es als nicht so wichtig angesehen, als ich es bemerkt habe.
Wenn du willst, kannst du es ja MCS mailen.
Das Überschreiben der nachfolgenden Speicherzellen passiert sowieso immer, wenn der Index zu groß wird. Genau so, wenn ein String länger als die reservierte Größe wird.

Searcher
29.11.2012, 15:34
Hallo for_ro,

Da man aber meistens eh mit einer Variablen als Index arbeitest und dort kein Test vom Compiler durchgeführt werden kann
stimmt und ist auch klar. Eigentlich hatte ich Probleme damit, weil mir nicht klar war, daß die Zahl beim Dimensionieren (mit DIM) des Arrays die Anzahl der Elemente angibt. Ich hatte ja im Kopf, daß das das letzte adressierbare Element wäre.
Ich denke, man sollte das in der Dokumentation bzw. Hilfe deutlicher herausstellen. Hab da jetzt nochmal rumgesucht und bis jetzt nichts Eindeutiges gefunden. War ja bis zur Einführung von CONFIG BASE auch nicht wirklich notwendig.

Mal sehen, ob und wie ich die mail an mcs abfasse.
Gruß
Searcher

Searcher
30.11.2012, 07:47
Also das ging schnell. Gestern eine mail an MCS und praktisch sofort eine Antwort: sinngemäß; die Berechnung der Grenzen bei Base = 0 wird in Version 2.0.7.7 berichtigt. Hatte noch den Vorschlag gemacht, die Doku zum Dimensionieren von Arrays eindeutiger zu verfassen - mal sehen, ob da auch etwas gemacht wird.

Gruß
Searcher