von Dietrich » Fr 27. Aug 2010, 22:44
Boah, das sind aber viele Bugs
Ich habe mich noch weiter mit Arrays beschäftigt:
BYTE ARRAY X=[1 2 3 4]
BYTE POINTER Y = X
Jetzt zeigt Y (genau wie @X) hinter den Array X !!! Autsch, das tut weh! Aber:
BYTE ARRAY X(0)=[1 2 3 4]
BYTE POINTER Y = X
Jetzt ist's korrekt.
Also niemals BYTE ARRAY X=[...] benutzen, sondern immer BYTE ARRAY X(0)=[...] !Die verschiedenen Array-Varianten werden wie folgt compiliert:
a) BYTE ARRAY(n)=[...]
compiliert genau den Klammerinhalt, n wird ignoriert (kann daher immer 0 sein)
b) BYTE ARRAY X(n) mit n<=256
compiliert genau n Bytes als Platzhalter für den Array. Da der mitten im Variablen-Bereich steht, stellt sich die Frage, ob der Array mit abgespeichert wird?!?
c) BYTE ARRAY X(n) mit n>256
compiliert eine Adresse, die auf einen reservierten Array im ACTION-Variablenspeicher zeigt (liegt hinter dem Programm) sowie die Länge. Die Länge scheint aber nirgends benutzt zu werden ???
d) BYTE ARRAY X
compiliert nur eine Adresse (2 Byte) genau wie BYTE POINTER X und reserviert keinen Array-Speicherplatz.
e) BYTE ARRAY X=adr
compiliert gar nichts, sondern ersetzt lediglich überall X durch Zugriff auf die Adresse adr.
f) BYTE ARRAY X(n)=adr mit n<=256
wie e)
g) BYTE ARRAY X(n)=adr mit n>256
compiliert die Adresse + Länge, es wird natürlich kein Array-Speicherplatz reserviert.
Die Anfangsadresse des compilierten ACTION-Programms steht in $491/2. Der Program Counter beim Compilieren steht in $E/F. D.h. wenn man $E/F während des Compile per SET-Direktive ändert, kann man das Programm an beliebige Stellen compilieren. Das ist aber höchstens für uninitialisierte Variablen oder das ganze Programm sinnvoll, da sonst ACTION das Programm wohl nicht speichern kann.
Weiß jemand, wo die RUN-Adresse des ACTION-Programms nach dem Compile steht?
Schade, dass solche interessanten und durchaus wichtigen Dinge nicht im Handbuch stehen. Denn eigentlich kann man nur dann vernünftig ACTION programmieren, wenn man weiß, was der Compiler eigentlich macht ...
Und noch was: In der Runtime finde ich bei fast allen PROCs folgendes Konstrukt:
PROC BLABLA()=*
Der Stern steht wohl für den Compile Program Counter (in Codeblocks wird mit * auf diesen zugegriffen). Aber wo ist der Unterschied zu PROC BLABLA() ohne Stern?