Seite 1 von 1

Rückgabewert von ArraySize()

Verfasst: 19.08.2015 15:41
von Andesdaf
bin ich eigentlich der einzige, der findet, dass der Rückgabewert von ArraySize() immer um eins zu niedrig ist?

Code: Alles auswählen

Dim xArray.s(2)

xArray(0) = "abc"
xArray(1) = "def"
xArray(2) = "ghi"

Debug ArraySize(xArray())
Für mich erscheint es nur logisch, wenn ArraySize() hier 3 und nicht 2 zurückgeben würde, denn es sind ja
drei Elemente im Array. Und in der Hilfe zu Dim steht: Wenn Sie ein neues Array definieren, beachten Sie bitte, dass es ein Element mehr haben wird, als Sie als Parameter angegeben haben [...]

Mir scheint, als wäre ArraySize() die einzige Funktion mit so einer Extrawurst, ListSize() und CountGadgetItems() geben auch die
tatsächliche Anzahl an Elementen zurück, und nicht immer eins weniger, nur weil die Zählung mit null beginnt. Das ist nervig, weil
ich instinktiv in For-To-Schleifen immer eins von ArraySize abziehe, wie ich es auch von allen anderem Zählfunktionen gewohnt bin...

Das musste ich jetzt mal loswerden, nachdem ich heute schon wieder ne Stunde gebraucht habe, um ein Fehlverhalten genau auf diesen
Umstand zurückzuführen. :D

Re: Rückgabewert von ArraySize()

Verfasst: 19.08.2015 16:50
von STARGÅTE
Andesdaf hat geschrieben:Für mich erscheint es nur logisch, wenn ArraySize() hier 3 und nicht 2 zurückgeben würde, denn es sind jadrei Elemente im Array.
Da würde ich erst zustimmen, aber es soll halt zu DIM passen, wo du halt n Art größe angibst, aber eins mehr hast.
Wobei es ja schon nervig ist, wie du sagt, gerade auch, wenn man Speicher reservieren will und dann bei ArraySize() eins addieren muss.

Vllt sollte man dann aber auch mal das DIM verändern, sodass Dim xArray.s(2) dann wirklich nur 2 Elemente also 0 und 1 erzeugt. Das bringt zudem den Vorteil, dass man Arrays komplett "leeren" kann mit Dim 0.
Aber ich vermute so ein Tiefer eingriff (sowohl bei Dim als auch bei ArraySize()) würde vielen nicht gefallen, weil sie ihre Codes durchwühlen müssten um alles anzupassen.

Re: Rückgabewert von ArraySize()

Verfasst: 19.08.2015 16:53
von ProgOldie
Naja, im Zweifelsfall gilt nicht die Übersetzung des Namens, sondern das, was in der Hilfe steht:
Gibt die Größe des Arrays zurück, wie diese mit Dim oder ReDim angegeben wurde.

Re: Rückgabewert von ArraySize()

Verfasst: 19.08.2015 16:58
von RSBasic
Das mit der Anzahl wusste ich auch nicht.
STARGÅTE hat geschrieben:Aber ich vermute so ein Tiefer eingriff (sowohl bei Dim als auch bei ArraySize()) würde vielen nicht gefallen, weil sie ihre Codes durchwühlen müssten um alles anzupassen.
Was ist, wenn viele das nicht wissen? Dann bedeutet das, dass alle geschriebenen Anwendungen automatisch einen Bug enthält und der letzte Array-Eintrag wird in der Schleife nie berücksichtigt, weil man die Anzahl-Variable nicht um eins erhöht hat. (vorausgesetzt der Zähler fängt bei 1 an)

Re: Rückgabewert von ArraySize()

Verfasst: 19.08.2015 17:16
von STARGÅTE
Kann ich nicht beurteilen.

Aber ich habe schon immer meine Schleifen wie folgt definiert:

Code: Alles auswählen

; Array
For I = ArraySize() To 0 Step -1
; List
For I = ListSize() To 1 Step -1
(ich arbeite meist rückwärts, damit ArraySize nur einmal aufgerufen wird.)
RSBasic hat geschrieben:Was ist, wenn viele das nicht wissen? Dann bedeutet das, dass alle geschriebenen Anwendungen automatisch einen Bug enthält und der letzte Array-Eintrag wird in der Schleife nie berücksichtigt, weil man die Anzahl-Variable nicht um eins erhöht hat. (vorausgesetzt der Zähler fängt bei 1 an)
Sowas würde ich aber auf die selbe Stufe stellen wie, dass PokeS() immer ein Zeichen mehr schreibt und man daher beim Erstellen von Speicherpuffern auch immer +1 bzw +2 rechnen muss.

Re: Rückgabewert von ArraySize()

Verfasst: 19.08.2015 17:36
von 7x7
STARGÅTE hat geschrieben:Aber ich habe schon immer meine Schleifen wie folgt definiert:

Code: Alles auswählen

; Array
For I = ArraySize() To 0 Step -1
; List
For I = ListSize() To 1 Step -1
(ich arbeite meist rückwärts, damit ArraySize nur einmal aufgerufen wird.)
Das ist korrekt und wissen wahrscheinlich nicht viele, dass der Parameter nach "to" bei "Next" jedesmal neu berechnet wird.

Komplexe Ausdrücke wie z.B:

Code: Alles auswählen

FOR a= 1 TO Array(x1,y1,z1)*Array(x2,y2,y3)
sollte man aus Performance-Gründen daher tunlichst vermeiden und eher eine extra Variable verwenden:

Code: Alles auswählen

n=Array(x1,y1,z1)*Array(x2,y2,y3)
FOR a=1 TO n
Schön STARGATE, dass du das mal angesprochen hast (wenn auch nur eher beiläufig)!