Array Problem

  • Es geht um folgenes Test-Script:

    Spoiler anzeigen
    [autoit]


    $fFile = "\\server\share\order1\dummy.txt"

    [/autoit] [autoit][/autoit] [autoit]

    $4_array = StringSplit($fFile, '', 1)
    MsgBox(0,"",$4_array[0])
    MsgBox(0,"",$4_array[1]) ; = \
    MsgBox(0,"",$4_array[2]) ; = \
    MsgBox(0,"",$4_array[3]) ; = s
    MsgBox(0,"",$4_array[4]) ; = e
    MsgBox(0,"",$4_array[5]) ; = r
    MsgBox(0,"",$4_array[6]) ; = v
    MsgBox(0,"",$4_array[7]) ; = e
    MsgBox(0,"",$4_array[8]) ; = r
    MsgBox(0,"",$4_array[9]) ; = \
    MsgBox(0,"",$4_array[10]) ; = s
    MsgBox(0,"",$4_array[11]) ; = h
    MsgBox(0,"",$4_array[12]) ; = a
    MsgBox(0,"",$4_array[13]) ; = r
    MsgBox(0,"",$4_array[14]) ; = e
    MsgBox(0,"",$4_array[15]) ; = \
    MsgBox(0,"",$4_array[16]) ; = o
    MsgBox(0,"",$4_array[17]) ; = r
    MsgBox(0,"",$4_array[18]) ; = d
    MsgBox(0,"",$4_array[19]) ; = e
    MsgBox(0,"",$4_array[20]) ; = r
    MsgBox(0,"",$4_array[21]) ; = 1
    MsgBox(0,"",$4_array[22]) ; = \
    MsgBox(0,"",$4_array[23]) ; = d
    MsgBox(0,"",$4_array[24]) ; = u
    MsgBox(0,"",$4_array[25]) ; = m
    MsgBox(0,"",$4_array[26]) ; = m
    MsgBox(0,"",$4_array[27]) ; = y
    MsgBox(0,"",$4_array[28]) ; = .
    MsgBox(0,"",$4_array[29]) ; = t
    MsgBox(0,"",$4_array[30]) ; = x
    MsgBox(0,"",$4_array[31]) ; = t

    [/autoit]

    Also in dieser MsbBox "MsgBox(0,"",$4_array[0])" wird gesagt, das es 32-Arraywerte gibt. Also doch eigentlich von 0 bis 31. Richtig?
    Wieso arbeitet das Script aber denn mit 32-Arraywerte, also 0 bis 32? Da war aber noch etwas mit "-1" und da ist doch das Problem bei meinem denken, oder?

    Wie kann ich das denn bitte richtig verstehen?

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

    Einmal editiert, zuletzt von Alina (14. August 2009 um 19:32)

  • [autoit]


    #include <Array.au3>
    $fFile = "\\server\share\order1\dummy.txt"

    [/autoit][autoit][/autoit][autoit]

    $4_array = StringSplit($fFile, '', 1)

    [/autoit][autoit][/autoit][autoit]

    _ArrayDisplay($4_array)

    [/autoit]

    Reicht das als Erklärung?

    edit \ MsgBox(0,"",$4_array[0]) zeigt bei mir wie erwartet 31 ;)

    2 Mal editiert, zuletzt von nuts (14. August 2009 um 16:04)

  • Bei Arrays ist das so, dass eine bestimmte Anzahl an Elementen für den Speicher reserviert wird.
    Bei der Deklaration von $aArray[32] sind das insgesamt 32 Elemente auf die man zugreifen kann.
    Aber das Zählen beginnt nicht bei 1 sondern bei 0, demnach ist der höchste Wert auf den man
    im Array zugreifen kann:
    Anzahl der reservierten Elemente (Beispiel=32) - 1 = 31
    die Funktion Ubound kann die Anzahl der reservierten Elemente zurückgeben.
    ABER: wenn man nun auf das letzte Element zugreifen will muss man dran denken, dass man 1 abziehen muss!
    Bsp.: Ubound($aArray) - 1 = Letztes Element im Array!
    (Das erste Element ist 0, jedoch gibt stringsplit im ersten Element die Anzahl der Teilungen(=Splittungen) zurück)

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • Danke, danke !!!

    Bin nun wieder etwas schlauer.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Hi Alina !
    Unser BugFix hat das mal aufbereitet. ;)

    Viele Funktionen geben als Ergebnis ein Array zurück. Dabei wird häufig die Arrayposition [0] genutzt um die Anzahl der Arrayelemente anzugeben.
    Ein Bsp. hierfür ist StringSplit().
    Nehmen wir an, wir haben einen String mit durch '|' getrennten Werten.

    $string = 'a|b|d|f|h|i|k'

    Wir möchten jetzt jeden Wert einzeln haben:

    $arSplit = StringSplit($string, '|')

    Und das ist jetzt der Inhalt von $arSplit

    $arSplit[0] = 7
    $arSplit[1] = 'a'
    $arSplit[2] = 'b'
    $arSplit[3] = 'd'
    $arSplit[4] = 'f'
    $arSplit[5] = 'h'
    $arSplit[6] = 'i'
    $arSplit[7] = 'k'

    Quelle:
    http://www.bug-fix.info/array_tut.htm

  • Gewöhnt euch lieber gleich Ubound an egal was fürne Funktion ihr benützt denn in vielen UDFs wird die Größe des Arrays eben nicht im Index 0 mitgegeben. Warum auch?

    Man muss dann nur beachten bei welchem Index man anfängt.

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • Wird das echt "durchgezählt"? Für was deklariert man es dann? Ich dachte immer da wird nur der Wert ausm Speicher ausgelesen. Auf jeden Fall hatte ich noch nie Performance einbussen bei einem array (mein größtes bisher war [1200][43][29]) durch Ubound

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • Gute Frage, beim Speicherwert abfragen wäre das ja im Prinzip das gleiche wie $array[0] abfragen.
    Somit wäre es in der Tat unnötig $array[0] zum zählen zu verwenden. Eher sogar ein Nachteil, wenn man sich beispielsweise die Funktion _FileListToArray ansieht.
    Naja viel wird sichs eh nicht nehmen und irgendwie ist mir das zu schwere Kost für den schönen Freitagabend. :D