Mal wieder ein Ubound($array)-Problem

  • Hey Leute,

    ich bin gerade dabei, eine Funktion zu schreiben, die mir Sonderzeichen aus einem String entfernen soll, aber die bleibt permanent irgendwo hängen.
    Hier mal der Code:

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    $sc='-ljh+hg.-'
    $newsc=_DeleteSonder($sc)

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

    Func _DeleteSonder($string)
    $string=_StringExplode($string,"")
    _ArrayDisplay($string)
    $num=Ubound($string)
    ConsoleWrite($num)
    For $i = 0 To $num
    $strisal=StringIsAlpha($string[$i])
    ConsoleWrite($i&@CRLF)
    If $strisal = 0 Then
    _ArrayDelete($string,$i)
    EndIf
    Next
    $retStr=_ArrayToString($string,"",0,Ubound($string))
    Return $retStr
    EndFunc ]

    [/autoit]

    Egal was ich für einen String nehme, der gibt mir an irgendeiner Stelle des Strings immer

    Spoiler anzeigen

    (36) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    $strisal=StringIsAlpha($string[$i])
    $strisal=StringIsAlpha(^ ERROR

    Bin seit ca 4 Stunden am coden, und seh einfach nich mehr was da falsch ist.
    Danke schonmal für Hilfe.

    Einmal editiert, zuletzt von mietzekatze (17. Juni 2011 um 17:00)

  • Das ist korrekt. Hatte das ursprünglich schon drin, aaaaber, so funktionierts auch nich:

    Spoiler anzeigen
    [autoit]

    $sc='-ljh+hg.-'
    $newsc=_DeleteSonder($sc)

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

    Func _DeleteSonder($string)
    $string=_StringExplode($string,"")
    _ArrayDisplay($string)
    $num=Ubound($string)-1
    ConsoleWrite($num)
    For $i = 0 To $num
    $strisal=StringIsAlpha($string[$i])
    ConsoleWrite($i&@CRLF)
    If $strisal = 0 Then
    _ArrayDelete($string,$i)
    EndIf
    Next
    $retStr=_ArrayToString($string,"",0,Ubound($string))
    Return $retStr
    EndFunc

    [/autoit]

    Und so auch nich:

    Spoiler anzeigen
    [autoit]

    Func _DeleteSonder($string)
    $string=_StringExplode($string,"")
    _ArrayDisplay($string)
    $num=Ubound($string)
    ConsoleWrite($num)
    For $i = 0 To $num -1
    $strisal=StringIsAlpha($string[$i])
    ConsoleWrite($i&@CRLF)
    If $strisal = 0 Then
    _ArrayDelete($string,$i)
    EndIf
    Next
    $retStr=_ArrayToString($string,"",0,Ubound($string))
    Return $retStr
    EndFunc

    [/autoit]

    :\

    Edit:

    Der String oben besteht aus 9 Zeichen. Ich lasse mir ja durch ConsoleWrite den Durchgang anzeigen, und bei dem String kommt er bspw. nur bis zur 5.

    Spoiler anzeigen

    >"D:\Program Files\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "C:\Users\Max\Desktop\Temporäre Scriptschnipsel\DeleteSonder.au3"
    1
    2
    3
    4
    5
    C:\Users\Max\Desktop\Temporäre Scriptschnipsel\DeleteSonder.au3 (36) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    $strisal=StringIsAlpha($string[$i])
    $strisal=StringIsAlpha(^ ERROR
    >Exit code: 1 Time: 2.532

  • Wenn du ein Array in einer FOR-Schleife durchläufst und dabei ein Element löschst, dann musst du das Array rückwärts durchlaufen. nsonsten stimmt der von UBound() ermittelte Wert nicht mehr und das Skript bricht ab.

    Spoiler anzeigen
    [autoit]

    #Region - Timestamp
    ;2011-06-17 16:54:00
    #EndRegion - Timestamp
    #include <String.au3>
    #include <Array.au3>

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

    $sc = '-ljh+hg.-'
    $newsc = _DeleteSonder($sc)
    MsgBox(0,0,$newsc)
    Func _DeleteSonder($string)
    $string = _StringExplode($string, "")
    _ArrayDisplay($string)
    For $i = UBound($string) - 1 To 0 Step -1
    $strisal = StringIsAlpha($string[$i])
    ConsoleWrite($i & @CRLF)
    If $strisal = 0 Then
    _ArrayDelete($string, $i)
    EndIf
    Next
    $retStr = _ArrayToString($string, "", 0, UBound($string))
    Return $retStr
    EndFunc ;==>_DeleteSonder

    [/autoit]
  • Weil du ja auch indexe rauslöscht.

    Eleganteste Lösung wäre die For schleife umzubauen
    Statt:

    [autoit]

    For $i = 0 To $num

    [/autoit]


    einfach

    [autoit]

    For $i = $num To 0 Step -1

    [/autoit]
  • ich bin gerade dabei, eine Funktion zu schreiben, die mir Sonderzeichen aus einem String entfernen soll

    Warum dann so umständlich mit Arrays hantieren?

    [autoit]

    MsgBox(0,"", _DeleteSpecialChars('!X"§$%hfh&/1$a-9-_'))

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

    Func _DeleteSpecialChars($sString)
    Return StringRegExpReplace($sString, "[^A-Za-z0-9]", "")
    EndFunc

    [/autoit]