Spass mit Action! ARRAYs
von FlorianD » Mo 16. Aug 2010, 12:36Hallo,
nachdem es mir nun zum wiederholten Male passiert ist, hier die Warnung an alle Action! Programmierer:
Aufpassen bei ARRAYs und Überschreitungen der maximalen Länge!
Fall 1: "einer zuwenig bei Strings"
ich will einen String der 15 Zeichen lang sein soll.
FALSCH, denn es wird gezählt 0, 1, 2, ..., 14, das sind 15 Elemente. Element 0 ist aber die Länge des Strings, also bleiben nur 14 übrig.
Gebe ich jetzt was in den String ein (per INPUT oder Zuweisung), das 15 Elemente lang ist, zerschieße ich das Byte, was auf den String folgt. Und das kann z.B. die nächste BYTE Definition sein, in obigem Fall ENDE. Da ist dann irgendwas drin, aber nicht mehr das was man erwartet.
Fall 2: "Dateinamen und INPUT"
ist mir auch schon passiert. Ein Dateiname sieht z.B. so aus: "* FILENAME.EXT", das sind dann 14 Zeichen. Also mache ich:
dann will ich ein Directory lesen...also
Netter Versuch, aber die Filenamen sehen dann so aus
"* FILENAME.AXT 125"
insgesamt 18 Zeichen lang, weil da ja noch die Länge zukommt!
Und die 3 Bytes zuviel werden einfach eingelesen! ... und zerstören einem dann das Programm.
Erkennt man daran, dass de erste Aufruf von DIR klappt und der 2. Aufruf dann einen Absturz ergibt, je nachdem, was nach der ARRAY Definition kommt und was dann zerstört wird.
Trotzdem, Action! ist toll,schnell und gut zu lernen!
Viele Grüße,
Florian
nachdem es mir nun zum wiederholten Male passiert ist, hier die Warnung an alle Action! Programmierer:
Aufpassen bei ARRAYs und Überschreitungen der maximalen Länge!
Fall 1: "einer zuwenig bei Strings"
ich will einen String der 15 Zeichen lang sein soll.
- Code: Alles auswählen
CHAR ARRAY NARF(15) ; soll 15 lang sein
BYTE ENDE
FALSCH, denn es wird gezählt 0, 1, 2, ..., 14, das sind 15 Elemente. Element 0 ist aber die Länge des Strings, also bleiben nur 14 übrig.
Gebe ich jetzt was in den String ein (per INPUT oder Zuweisung), das 15 Elemente lang ist, zerschieße ich das Byte, was auf den String folgt. Und das kann z.B. die nächste BYTE Definition sein, in obigem Fall ENDE. Da ist dann irgendwas drin, aber nicht mehr das was man erwartet.
Fall 2: "Dateinamen und INPUT"
ist mir auch schon passiert. Ein Dateiname sieht z.B. so aus: "* FILENAME.EXT", das sind dann 14 Zeichen. Also mache ich:
- Code: Alles auswählen
CHAR ARRAY FN(14)
dann will ich ein Directory lesen...also
- Code: Alles auswählen
OPEN(1,"D:*.*",6,0)
DO
INPUTSD(FN)
PRINTE(FN)
UNTIL EOF(1)
OD
CLOSE(1)
Netter Versuch, aber die Filenamen sehen dann so aus
"* FILENAME.AXT 125"
insgesamt 18 Zeichen lang, weil da ja noch die Länge zukommt!
Und die 3 Bytes zuviel werden einfach eingelesen! ... und zerstören einem dann das Programm.
Erkennt man daran, dass de erste Aufruf von DIR klappt und der 2. Aufruf dann einen Absturz ergibt, je nachdem, was nach der ARRAY Definition kommt und was dann zerstört wird.
Trotzdem, Action! ist toll,schnell und gut zu lernen!
Viele Grüße,
Florian