2 dimensionales array

  • hi

    ich schon wieder :(

    ich moechte ein 2 dimensionales array erstellen wo ich dann die namen einer sektion aus einer ini und einen wert aus der sektion speichern will.

    dann moechte ich das array nach dem wert sortieren und den sektionsname mit dem kleinsten wert fuer weitere funktionen in einer variable speichern.


    Dim $tasks[$c][$c] funktioniert schon mal aber beim einfuegen von werten kommt:

    Array variable has incorrect number of subscripts or subscript dimension range exceeded.

    ($c ist die anzahl der sektionen)


    im moment ist mein problem also eigentlich nur dieses array aber wenn ihr zu dem rest irgendwas zu sagen habt dann bitteschoen ;P

    mfg mar bobley

  • Spoiler anzeigen

    $result = IniReadSectionNames ("targets.ini")
    $c = $result[0]
    $i = 1
    Dim $tasks[$c][$c]
    Do
    $data = IniReadSection ("targets.ini",$result[$i])
    MsgBox(0,"",$result[$i])
    $tasks[1][1]=123
    MsgBox(0,$result[$i],$tasks[0])
    $i = $i + 1
    Until $i = $c + 1


    ist nichts besonderes.. aber vll hilfts ja

    //edit: code war verhackstueckelt ;P

    2 Mal editiert, zuletzt von Mar Bobley (25. September 2006 um 22:53)

  • Hallo,
    hast du denn mehr als eine Section definiert im INI-File. Denn Arrays beginnen bei 0. Für $array[1] musst du also "dim $array[2]" definiert haben.

    [autoit]

    $result = IniReadSectionNames ("targets.ini")
    $c = $result[0]
    Dim $tasks[$c][$c]
    for $i=1 to $result[0]
    $data = IniReadSection ("targets.ini",$result[$i])
    MsgBox(0,"",$result[$i])
    $tasks[1][1]=123
    MsgBox(0,$result[$i],$tasks[0][0])
    Next

    [/autoit]


    eddy_erpel

  • hi

    ja es sind 3 sektionen. der fehler wird allerdings schon im ersten schleifendurchgang ausgegeben.

    muss ich anfangen die variable bei 0 zu fuellen oder koennen werte leer bleiben? (was natuerlich nicht unbedingt sein sollte...)

    mfg mar bobley


    [autoit]


    #include <array.au3>
    $result = IniReadSectionNames ("targets.ini")
    $c = $result[0]
    Dim $tasktimes[$c][$c]
    for $i=1 to $result[0]
    $data = IniReadSection ("targets.ini",$result[$i])
    $tasktimes[$i-1][0]=$result[$i]
    $tasktimes[$i-1][1]=$data[1][1]
    MsgBox(0,$result[$i],$tasktimes[0][0]&$tasktimes[1][0]&$tasktimes[2][0]&$tasktimes[0][1]&$tasktimes[1][1]&$tasktimes[2][1])
    Next
    _ArraySort($tasktimes,1,0,1,1,1)
    MsgBox(0,"lowest",$tasktimes[0][1])

    [/autoit]

    das funktioniert ;P ich weiss jetzt zwar nicht wo der fehler war aber so gehts... die for schleife ist natuerlich auch eleganter.

    vielen dank, mar bobley

    //edit2
    jetz hab ich allerdings ein problem beim sortieren. hab hier schon gelesen dass 2dimensiole arrays schwerer zu sortieren sein sollen aber mir faellt nichts anderes ein wie ich sonst weiss welche sektion die mit dem kleinsten wert ist.

    [autoit]


    array.au3 (551) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    $t = $array[$i]
    $t = ^ ERROR

    [/autoit]

    :(

    die funktion _arraysort ist ziemlich schlecht erklaert in der hilfe finde ich 8|

    2 Mal editiert, zuletzt von Mar Bobley (26. September 2006 um 14:00)

    • Offizieller Beitrag

    Hallo!

    So sollte es gehen:

    [autoit]

    #include <array.au3>

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

    $result = IniReadSectionNames ("targets.ini")

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

    $c = $result[0]
    ;~ $c = 5
    Dim $tasktimes[$c][2]
    for $i=1 to $result[0]
    $data = IniReadSection ("targets.ini",$result[$i])
    $tasktimes[$i-1][0]=$result[$i]
    $tasktimes[$i-1][1]=$data[1][1]
    MsgBox(0,$result[$i],$tasktimes[0][0]&$tasktimes[1][0]&$tasktimes[2][0]&$tasktimes[0][1]&$tasktimes[1][1]&$tasktimes[2][1])
    Next
    ;~ _ArraySort($tasktimes,0,0,0,2,0) ; nach $result sortieren (aufsteigend = [0][0] kleinster Wert)
    _ArraySort($tasktimes,0,0,0,2,1) ; nach $data sortieren (aufsteigend = [0][1] kleinster Wert)

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

    MsgBox(0,"lowest",$tasktimes[0][1])

    [/autoit]

    Die Tabelle sollte so mit Dim $tasktimes[$c][2] angelegt werden da du ja immer nur 2 Spalten brauchst, bei dein Dim-Anweisung werden immer soviel spalten wie Zeilen angelegt!

  • [autoit]


    #include <array.au3>
    $result = IniReadSectionNames ("targets.ini")
    $c = $result[0]
    Dim $tasktimes[$c][2]
    for $i=1 to $c
    $data = IniReadSection ("targets.ini",$result[$i])
    $tasktimes[$i-1][0]=$result[$i]
    $tasktimes[$i-1][1]=$data[4][1]
    Next
    _ArraySort($tasktimes,0,0,0,2,1)
    MsgBox(0,$tasktimes[0][0],$tasktimes[0][1])

    [/autoit]

    so funktioniert es perfekt.

    vielen dank bernd du hast das mit dem sortieren und deklarieren vom array sehr gut erklaert.

    zu deinem code:
    $c = $result[0]
    $c = 5
    macht nicht viel sinn ;P

    dass ich das array falsch deklariert habe lag an der grausigen beschreibung in der hilfedatei dort war array[8][8] als beispiel aufgefuehrt so dachte ich dass die 8 beide male die anzahl der werte im array sei.

    naja nun bin ich schlauer.

    vielen dank nochmal, mar bobley

    • Offizieller Beitrag

    Hallo!

    Das $c = 5 war noch von meinem Test da ich mir keine INI-Datei anlegen wollte aus der ich die Werte lese, sorry!

  • Hm ich hab mal ne _UniquePCCode UDF geschrieben ( s. Signatur ), die eine Zahl erstellt die den PC uniq macht. Die ändert sich nicht so lange die Person kein neues OS oder neue Hardware einbaut.

  • hehe super hab sie mir mal angeguckt und denke dass DriveGetSerial total ausreichend ist fuer meine zwecke ;P

    vielen dank ich hoffe ihr seid jetzt erstmal eine weile von mir befreit ;P

    mfg mar bobley