Neues _array2Dadd Problem mit Value '|'

  • Hiho,

    habe nun ein neues Problem mit array2Dadd.

    Ich versuche verzweifelt ein 2D-Array zu erstellen, indem leider "|" - Zeichen vorkommen.

    Ich habe schon versucht die array2Dadd-Datei anzupassen und alle | dürch % ersetzt. Leider splittet er weiterhin mit |.

    Bringt mir aber auch nichts. Zwar added er dann ein paar Variablen, aber nur bis zum "|" in der Varibale.

    Kleines BSP:

    Spoiler anzeigen
    [autoit]

    #include <_Array2DAdd.au3>
    #include <Array.au3>
    Dim $avArray[1][2]
    $var1 = 'Hallo||du'
    $var2 = 'Na du'

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

    _Array2Dadd($avArray, $var1 & '|' & $var2)

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

    _ArrayDisplay($avArray)

    [/autoit]

    Im _ArrayDisplay wird garnix angezeigt. Wie löse ich das Problem?
    Im Gedankengang denke ich da an StringSplit... oder gehts auch einfacher bzw anders?


    gruß
    rouge

    Einmal editiert, zuletzt von -ROUGE- (12. Februar 2009 um 20:27)

    • Offizieller Beitrag

    Welches _Array2Dadd benutzt du überhaut ? Das von BugFix? wenn nicht poste mal die _Array2DAdd.au3.

  • Welches _Array2Dadd benutzt du überhaut ? Das von BugFix? wenn nicht poste mal die _Array2DAdd.au3.

    von BugFix natürlich :)

    Spoiler anzeigen
    [autoit]

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;
    ; Function _Array2DAdd(ByRef $avArray, $sValue='')
    ;
    ; Description Redim Array Size and add an Array element at last position
    ; Works with any occurences in 2nd Dimension
    ; Works also with 1D-Array
    ;
    ; Parameter $avArray Given Array
    ; optional $sValue Value of new Element, parts must be seperate with '|'
    ;
    ; Return Succes -1
    ; Failure 0 and set @error
    ; @error = 1 given array is not array
    ; @error = 2 given parts of Element too less/much
    ;
    ; Author BugFix ([email='bugfix@autoit.de'][/email])
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    Func _Array2DAdd(ByRef $avArray, $sValue='')
    If ( Not IsArray($avArray) ) Then
    SetError(1)
    Return 0
    EndIf
    Local $UBound2nd = UBound($avArray,2)
    If @error = 2 Then
    ReDim $avArray[UBound($avArray)+1]
    $avArray[UBound($avArray)-1] = $sValue
    Else
    Local $arValue
    ReDim $avArray[UBound($avArray)+1][$UBound2nd]
    If $sValue = '' Then
    For $i = 0 To $UBound2nd-2
    $sValue &= '|'
    Next
    EndIf
    $arValue = StringSplit($sValue, '|')
    If $arValue[0] <> $UBound2nd Then
    SetError(2)
    Return 0
    EndIf
    For $i = 0 To $UBound2nd-1
    $avArray[UBound($avArray)-1][$i] = $arValue[$i+1]
    Next
    EndIf
    Return -1
    EndFunc ;==>_Array2DAdd

    [/autoit]


    edit

    Hier mein Selbstversuch der ordentlich in die Hose gegange ist ^^

    Spoiler anzeigen
    [autoit]

    Func _Array2DAdd(ByRef $avArray, $sValue='')
    If ( Not IsArray($avArray) ) Then
    SetError(1)
    Return 0
    EndIf
    Local $UBound2nd = UBound($avArray,2)
    If @error = 2 Then
    ReDim $avArray[UBound($avArray)+1]
    $avArray[UBound($avArray)-1] = $sValue
    Else
    Local $arValue
    ReDim $avArray[UBound($avArray)+1][$UBound2nd]
    If $sValue = '' Then
    For $i = 0 To $UBound2nd-2
    $sValue &= '%'
    Next
    EndIf
    $arValue = StringSplit($sValue, '%')
    If $arValue[0] <> $UBound2nd Then
    SetError(2)
    Return 0
    EndIf
    For $i = 0 To $UBound2nd-1
    $avArray[UBound($avArray)-1][$i] = $arValue[$i+1]
    Next
    EndIf
    Return -1
    EndFunc ;==>_Array2DAdd

    [/autoit]

    4 Mal editiert, zuletzt von -ROUGE- (12. Februar 2009 um 18:53)

  • Selber gelöst, trozdem bin ich an Alternativen gern interessiert. Möchte ja auch "|" in ein Array schreiben und nicht vor und nachher StringReplace anwenden.

    Spoiler anzeigen
    [autoit]

    #include <_Array2DAdd.au3>
    #include <Array.au3>
    Dim $avArray[1][2]
    $var1 = 'Hallo||du'
    $var2 = 'Na du'
    $string = StringSplit($var1, '|', 1)
    If $string[0] > 1 Then
    $var1 = StringReplace($var1, '|', '/')
    EndIf

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

    _Array2Dadd($avArray, $var1 & '|' & $var2)

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

    _ArrayDisplay($avArray)

    [/autoit]
    • Offizieller Beitrag

    Probier mal das:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    Dim $avArray[1][2]
    $var1 = 'Hallo||du'
    $var2 = 'Na du'

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

    _Array2Dadd($avArray, $var1 & '§' & $var2,"§")
    MsgBox(0,"",$avArray[1][0])
    MsgBox(0,"",$avArray[1][1])

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

    _ArrayDisplay($avArray,"",-1,0,"§")
    ;~ _ArrayDisplay(Const ByRef $avArray[, $sTitle = "Array: ListView Display"[, $iItemLimit = -1[, $iTranspose = 0[, $sSeparator = ""[, $sReplace = "|"]]]]])
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;
    ; Function _Array2DAdd(ByRef $avArray, $sValue='')
    ;
    ; Description Redim Array Size and add an Array element at last position
    ; Works with any occurences in 2nd Dimension
    ; Works also with 1D-Array
    ;
    ; Parameter $avArray Given Array
    ; optional $sValue Value of new Element
    ; optional $sDelemiter delimiter string to mark the split
    ;
    ; Return Succes -1
    ; Failure 0 and set @error
    ; @error = 1 given array is not array
    ; @error = 2 given parts of Element too less/much
    ;
    ; Author BugFix ([email='bugfix@autoit.de'][/email])
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    Func _Array2DAdd(ByRef $avArray, $sValue='',$sDelemiter='|')
    If ( Not IsArray($avArray) ) Then
    SetError(1)
    Return 0
    EndIf
    Local $UBound2nd = UBound($avArray,2)
    If @error = 2 Then
    ReDim $avArray[UBound($avArray)+1]
    $avArray[UBound($avArray)-1] = $sValue
    Else
    Local $arValue
    ReDim $avArray[UBound($avArray)+1][$UBound2nd]
    If $sValue = '' Then
    For $i = 0 To $UBound2nd-2
    $sValue &= $sDelemiter
    Next
    EndIf
    $arValue = StringSplit($sValue,$sDelemiter)
    If $arValue[0] <> $UBound2nd Then
    SetError(2)
    Return 0
    EndIf
    For $i = 0 To $UBound2nd-1
    $avArray[UBound($avArray)-1][$i] = $arValue[$i+1]
    Next
    EndIf
    Return -1
    EndFunc ;==>_Array2DAdd

    [/autoit]


    Da _ArrayDisplay in deinem Fall nicht richtig anzeigt, habe ich mal 2 MsgBoxen eingebaut zum testen der Werte.Die Werte werden richtig gesetzt aber in _ArrayDisplay nicht korrekt angezeigt.

    Edit: Die Werte werden in _ArrayDisplay auch richtig angezeigt wenn du es so aufrufst :

    [autoit]

    _ArrayDisplay($avArray,"",-1,0,"§")

    [/autoit]

    Edit2: Habe den Code oben angepaßt, _Array2Dadd hat nun einen neuen Parameter . In diesem wird der Delimiter übergeben. Wird der 3. Parameter nicht gesetzt dann wird der Standard-Delemiter | verwendet .

  • Super Sache. Funktioniert Einwandfrei. Frage ich mich warum Bugfix das so noch nicht eingebaut hat ;)

    Dickes Lob und fettes danke!

    rouge

    /edit2

    Das is ja noch besser. Muss ich mein Script für die anderen Arrays nichtmal anpassen. Gelobt sei dieses Forum!

    • Offizieller Beitrag

    Kein Problem. Ich denke er hat es nicht eingebaut, weil | eigentlich meistens als Delemiter verwendet wird . ;)

  • Kein Problem. Ich denke er hat es nicht eingebaut, weil | eigentlich meistens als Delemiter verwendet wird . ;)

    Schon, aber nach deinem Edit2 ist das ja sogar noch sinnvoller. Ob man den Delimiter deklariert oder nicht ist nun jedem selbst überlassen.

    Aber nunja. Kein Script ist perfekt und wie heisst es so schön.

    Wenn du etwas gut machts gibts immer einen ders besser macht. In diesem Sinne! Danke sehr!

    Gelöst!

    • Offizieller Beitrag

    Hi,
    ja ist sinnvoll das variabel zu gestalten. Ich passe das auch so nach und nach überall an. Allerdings bevorzuge ich als Standard den in Opt("GUIDataSeparatorChar") hinterlegten Wert (üblicherweise ist das '|'). Wer aber diese Option im Skript mit einem anderen Wert besetzt, braucht es dann im Funktionsaufruf nicht extra tun.

    Spoiler anzeigen
    [autoit]

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;
    ; Function _Array2DAdd(ByRef $avArray, $sValue='', $Delim=Default)
    ;
    ; Description Redim Array Size and add an Array element at last position
    ; Works with any occurences in 2nd Dimension
    ; Works also with 1D-Array
    ;
    ; Parameter $avArray Given Array
    ; optional $sValue Value of new Element, parts must be seperate with Delim
    ; by Default the Opt("GUIDataSeparatorChar")
    ; Return Succes -1
    ; Failure 0 and set @error
    ; @error = 1 given array is not array
    ; @error = 2 given parts of Element too less/much
    ;
    ; Author BugFix ([email='bugfix@autoit.de'][/email])
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    Func _Array2DAdd(ByRef $avArray, $sValue='', $Delim=Default)
    If ( Not IsArray($avArray) ) Then
    SetError(1)
    Return 0
    EndIf
    If $Delim = Default Then $Delim = Opt("GUIDataSeparatorChar")
    Local $UBound2nd = UBound($avArray,2)
    If @error = 2 Then
    ReDim $avArray[UBound($avArray)+1]
    $avArray[UBound($avArray)-1] = $sValue
    Else
    Local $arValue
    ReDim $avArray[UBound($avArray)+1][$UBound2nd]
    If $sValue = '' Then
    For $i = 0 To $UBound2nd-2
    $sValue &= $Delim
    Next
    EndIf
    $arValue = StringSplit($sValue, $Delim)
    If $arValue[0] <> $UBound2nd Then
    SetError(2)
    Return 0
    EndIf
    For $i = 0 To $UBound2nd-1
    $avArray[UBound($avArray)-1][$i] = $arValue[$i+1]
    Next
    EndIf
    Return -1
    EndFunc ;==>_Array2DAdd

    [/autoit]
    • Offizieller Beitrag

    BugFix : Deine Version ist besser (universeller). Hab ich aber auch nicht anders erwartet :thumbup: