Dim Array

  • Hallo Zusammen,

    bin hier ziemlich neu!

    Weiss auch nicht ob ich meine Frage richtig stelle?

    Habe ein Array-Problem! Wahrscheinlich ist es völlig simpel, leider komme ich aber nicht weiter!
    Ich möchte den Artikeln die Mengen zuweisen und später noch addieren! Ich glaube nicht, dass ich das Array $Artikel 9stellig dim muss! Habe in den Toutorials und im Handbuch nichts gefunden.

    Kann ich Hilfe erwarten?


    Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    $Artikel[$PZN[$i]] = $MG[$i]
    ^ ERROR

    #include
    #include

    Dim $Artikel[10], $Pzn[7] = [9999999, 1234, 88888888, 4321, 9999999, 1234, 4321] , $Mg[7] = [1, 0, 3, 2, 0, 5, 2]

    For $i=1 to 7

    $Artikel[$Pzn[$i]] = $Mg[$i]

    Next

    _ArrayDisplay($Artikel)

    Exit

    Einmal editiert, zuletzt von GtaSpider (25. Februar 2014 um 18:36)

  • Arrays sind in AutoIt 0-basiert. Das erste Element hat also den Index 0 und nicht 1.
    Folglich ist das letzte Element eines als Array[7] definiertes Array am Index [6] zu finden (und nicht 7).

    Ganz skurril wird es allerdings in deinem Skript.
    Du hast ein Array $Artikel mit 10 Elementen.
    Das beschreibst du in der For-Schleife.
    Allerdings nutzt du als Index die Werte aus $Pzn.
    Das bedeutet du versuchst z.B. in dein 10-Element-Array das 1234te Element zu beschreiben...

    Willst du vielleicht folgendes erreichen?:

    Spoiler anzeigen
    [autoit]


    #include "Array.au3"

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

    Global $Pzn[7] = [9999999, 1234, 88888888, 4321, 9999999, 1234, 4321]
    Global $Mg[7] = [1, 0, 3, 2, 0, 5, 2]
    Global $Artikel[UBound($Pzn)][2]

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

    For $i = 0 To UBound($Pzn) - 1
    $Artikel[$i][0] = $Pzn[$i]
    $Artikel[$i][1] = $Mg[$i]
    Next

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

    _ArrayDisplay($Artikel)

    [/autoit]

    P.S.: Für Key-Value-Datenstrukturen eignet sich das Scripting.Dictionary besser als ein Array. Einfach mal im Forum danach suchen.

  • Hallo Danke für die schnelle Antwort!

    Ich möchte die Zuordnung der $Pzn vereinfachen, indem ich immer die richtige $Mg[$i] der entsprechenden $Pzn[$i] zuordne, die ich später addieren will. In deiner Anweisung weiss ich nicht welche $Pzn zu welcher $Mg gehört. Ist das korrekt?

  • Prinzipiell stehen zusammengehörige $Pzn und $Mg (was auch immer das sein mag) im resultierenden $Artikel-Array in einer Zeile.
    Die Zuordnung ist darüber also gegeben.
    Eine eindeutige Zuordnung ist mit deinem Beispiel aber ohnehin nicht möglich, da jeweils gleichen Werten unterschiedliche zugeordnet werden. (z.b. 9999999 taucht bei $Pzn mehrmals auf mit jeweils unterschiedlichem gegenüberliegendem Wert in $Mg).

  • Richtig! Die $Pzn Nummern könne doppelt und dreifach vorkommen! Ich möchte ja schlussendlich die einzelnen $Mg Werte zu den gleichen $Pzn Nummer addieren. Das kann ich aber nicht aus der Reihenfolge des Array erkennen, ausser ich analysiere die $PZN Nummern ob sie identisch sind. Das wollte ich eigenlich umgehen!

  • Nun ist es soweit dass du dich klarer ausdrücken musst.

    Was sind das für Werte, was soll wann mit was addiert werden?
    Welche Werte gehören wie zusammen?

    Laut deinem bisherigen Skript bin ich davon ausgegangen, da $Pzn und $Mg die selbe Größe haben, dass zusammengehörige Werte aus $Mg und $Pzn den gleichen Index haben.

    Sehe ich das jetzt richtig, dass $Pzn die Klasse darstellt und $Mg die jeweiligen Werte, und du für alle Klassen die Klassensumme bilden willst?

    Wenn ja benötigst du erstmal eine Liste, aller möglichen Klassen. Das geht z.b. mit ArrayUnique.
    Diese Liste gehst du dann durch und addierst aus $Mg die Werte falls bei $Pzn die Klasse den aktuellen Klassennamen besitzt.

  • Ich habe das mit den Klassen noch nicht richtig verstanden!

    Was Du das schreibst hört sich gut an. Es ist in der Tat so, das die $Pzn eindeutig ist aber öfter vorkommen kann aber unterschiedliche Werte ($Mg) besitzt, die ich dann addieren wollte.

  • Ok, auch wenn ich weiß, dass es didaktisch nicht sehr toll ist aber es ist spät für mich heute.
    Daher - wolltest du sowas?:

    Spoiler anzeigen
    [autoit]

    #include "Array.au3"

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

    Global $Pzn[7] = [9999999, 1234, 88888888, 4321, 9999999, 1234, 4321]
    Global $Mg[7] = [1, 0, 3, 2, 0, 5, 2]

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

    Global $a_Klassen = _ArrayUnique($Pzn, 1, Default, Default, 0) ; alle vorkommenden Klassen ermitteln (=doppelte Werte eliminieren)
    Global $a_Summen[UBound($a_Klassen)][2] ; Ergebnisarray mit zwei Spalten und der entsprechenden Zeilenanzahl erzeugen

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

    For $i = 0 To UBound($a_Klassen) -1 ; Alle Klassen durchgehen
    $d_Class = $a_Klassen[$i] ; Aktuelle Klasse in temporäre Variable schreiben
    $a_Summen[$i][0] = $d_Class ; Name der aktuellen Klasse in Ergebnisliste schreiben

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

    For $j = 0 To UBound($Pzn) - 1 ; Nun alle Pzn durchgehen und zugeordnete Mg-Wert addieren wenn Pzn der aktuellen Klasse entspricht
    If $Pzn[$j] = $d_Class Then $a_Summen[$i][1] += $Mg[$j]
    Next
    Next

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

    _ArrayDisplay($a_Summen) ; Ergebnis anzeigen

    [/autoit]