Spass mit Action! ARRAYs


Spass mit Action! ARRAYs

von FlorianD » Mo 16. Aug 2010, 12:36
Hallo,

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

Re: Spass mit Action! ARRAYs

von cas » Mo 16. Aug 2010, 18:19

Re: Spass mit Action! ARRAYs

von eda70 » Mi 18. Aug 2010, 09:47
FlorianD hat geschrieben:Netter Versuch, aber die Filenamen sehen dann so aus
"* FILENAME.AXT 125"
insgesamt 18 Zeichen lang, weil da ja noch die Länge zukommt!

Die Länge ist auch abhängig vom verwendeten Dos. Ich weiß nicht, was MyDos bei großen Dateien macht,
aber Bewe und alle Sparta (-derirvate) zeigen die Dateigröße in Bytes an.
Hier sollte man wohl eher großzügig sein
Code: Alles auswählen
CHAR ARRAY FNI(25),
     FN(14)
OPEN(1,"D:*.*",6,0)
DO
  INPUTSD(FNI)
  SCopyS(FN, FNI, 1,14);
  PRINTE(FN)
  UNTIL EOF(1)
OD
CLOSE(1)

Re: Spass mit Action! ARRAYs

von eda70 » Mi 18. Aug 2010, 10:04
Fall1 passt m.E. der Code nicht zum Text.
Code: Alles auswählen
CHAR ARRAY NARF(15) ; soll 15 lang sein
NARF ist 16 Zeichen lang (0...15), aber nur 15 sind nutzbar,da in NARF(0) die Stringlänge abgelegt wird.

Ich denke, der off-by-one Error resultiert häufig aus der Frage werden erster respektive letzter Wert mitgezählt und geht es bei 0 oder bei 1 los.
Genauso ist es bei for...next, do until/ while etc. selten ist das exakte Verhalten dokumentiert.
Bsp. for...next in Basic wird die Schleife min einmal ausgefüht, auch wenn die Abbruch-Bedingung schon erfüllt ist.
in Action! (meine ich gelesen zu haben) wird die Schleife gar nicht ausgeführt.

Re: Spass mit Action! ARRAYs

von cas » Mi 18. Aug 2010, 16:42
eda70 hat geschrieben:Die Länge ist auch abhängig vom verwendeten Dos. Ich weiß nicht, was MyDos bei großen Dateien macht,
aber Bewe und alle Sparta (-derirvate) zeigen die Dateigröße in Bytes an.


Meine Erfahrung nach Hängt die Anzahl der gelieferten Bytes nicht am DOS. Sowohl MyDOS, BeweDos und auch SpartaDOS liefert die Anzahl von Sektoren bei dieser CIO Funktion zurück. Zusätzlich haben diese DOS Versionen noch eigene CIO Funktionen um weitere Informationen zurückzuliefern. Das kann man mit dem TurboBASIC "dir" Befehl schnell ausprobieren.

Re: Spass mit Action! ARRAYs

von eda70 » Mi 18. Aug 2010, 21:24
Bei BeWe-Dos ist es es in der Tat so, dass die Größe mit drei Ziffern dargestellt wird. Große Files werden dann mit 999 angezeigt.
Bei MyDos ist es anders. Ziemlich tricky, sollte man die Größe des Files ermitteln wollen.
Vier Ziffern ist der Standard rechtsbündig mit führenden Nullen. Reicht das nicht, wird noch eine Ziffer nach rechts gerückt, aber nur der jeweilige Eintrag:
Code: Alles auswählen
NORMAL  TXT 0112
BIG     TXT 2457
VERYBIG TXT 12345
SMALL   TXT 0013

Sparda habe ich nicht getestet, die neueren können ja keine DOS-Diskette oder ? und vertragen sich auch nicht mit TBXL.

Re: Spass mit Action! ARRAYs

von Mathy » Mi 18. Aug 2010, 23:07
Hallo eda70

Das stimmt so nicht ganz.

Ältere Versionen von MyDOS benutzen immer 4 Ziffern. Irgendwann (ich glaube ab 4.53, kann aber auch schon 4.50 gewesen sein) hat man angefangen, wenn möglich, nur 3 Ziffern zu benutzen. Es war immer schon so, dass bei Bedarf mehr Ziffern genutzt wurden. Bis maximal 5 Ziffern. MyDOS 4.53 gab's dann in zwei Versionen, /3 und /4. 4.53/3 benutzt minimal 3 Ziffern, MyDOS 4.53/4 nutzt minimal 4 Ziffern. Spätere Versionen sind umschaltbar von DUP aus.

Tschüß

Mathy

Re: Spass mit Action! ARRAYs

von eda70 » Do 19. Aug 2010, 11:32
Danke für die Richtigstellung. Ich kenn/ nutze nur eine Version (offensichtlich 4.53/4)...
Fazit: Egal welche Version von MyDOS man muss im Zweifelsfall mit bis zu fünf Stellen für die Anzeige der Größe rechnen.