Schleifenproblem

  • Moin Moin.

    Ich habe ein Schleifenproblem.

    Folgendes Script arbeitet die Schleife 37 mal durch, danch bricht sie ab.

    Spoiler anzeigen
    [autoit]


    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_UseUpx=n
    #AutoIt3Wrapper_UseAnsi=y
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include<Array.au3>
    #include<String.au3>

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

    $test = FileRead("eingang.txt"); "1A2B3C4D5E6"
    $1_len = StringLen($test)
    ;MsgBox(0, "Stringlänge:", $1_len) ; diese Zeile nur zum testen

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

    $pass = FileRead("passwort.txt"); "94736"
    $2_len = StringLen($pass)
    ;MsgBox(0, "Stringlänge Passwort:", $2_len) ; diese Zeile nur zum testen

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

    $zwischensumme = Ceiling($1_len / $2_len)
    ;MsgBox(0, "Stringlänge Zwischenlänge:", $zwischensumme) ; diese Zeile nur zum testen

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

    $anwenderpass = _StringRepeat($pass,$zwischensumme)
    ;MsgBox(0, "Stringlänge Anwendung:", $anwenderpass) ; diese Zeile nur zum testen

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

    For $i = 1 to $1_len Step +1
    $v_s = StringMid($test, $i, 1)
    ;MsgBox(0, "aus Test:", $v_s) ; diese Zeile nur zum testen
    $v_w = StringMid($anwenderpass, $i, 1) ; diese Zeile nur zum testen
    ;MsgBox(0, "aus Passwort:", $v_w)

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

    ; Array: senkrecht / waagerecht
    ; alle 37 Zeichen werden in 37 Zeilen dargestellt, wobei das erste Zeichen immer an das Ende rutscht.
    Local $avArray[38][38]
    Local $avTemp[38] = [" ","0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","."]
    For $x = 0 To 37
    $y = 37-$x
    For $z = 0 To 37
    $y += 1
    If $y>37 Then $y=0
    $avArray[$x][$y] = $avTemp[$z]
    Next
    Next
    ;

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

    ; senkrecht
    $s_Index = _ArraySearch($avArray, $v_s, 0, 0, 0, 1)

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

    ; waagerecht
    $w_Index = _ArraySearch($avArray, $v_w, 0, 0, 0, 1)

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

    ;MsgBox(0,"Array-Zahlen","Array-Zahlen: " & $s_Index & " - " & $w_Index & @CRLF & "Mathe Zahlen: " & $s_Index +1 & " - " & $w_Index +1) ; diese Zeile nur zum testen

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

    ;MsgBox(0,"Schnittmenge", $avArray[($s_Index)][($w_Index)]) ; diese Zeile nur zum testen
    FileOpen("codiert.txt",1)
    sleep(50)
    FileWrite("codiert.txt", $avArray[($s_Index)][($w_Index)])
    sleep(50)
    FileClose("codiert.txt")
    sleep(50)
    Next
    Exit

    [/autoit]

    Die Schleife soll so so oft durchlaufen wie Buchstaben / Zahlen / Zeichen in der Datei eingang.txt stehen.

    Wo und was ist das Problem?

    Edit: Problem war u. a. am Zeilenende der Umbruch und fehlende Zeichen im Array. Müssen nämlich 85 sein. ;)

    Lieben Gruß,
    Alina

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

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

    Einmal editiert, zuletzt von Alina (24. Mai 2009 um 17:58)

  • Ich versteh nicht ganz wo das problem liegt.
    Die äußere Schleife läuft doch genauso oft wie Buchstaben in eingang.txt stehen.
    Die inneren Schleifen laufen doch wegen For x=0 to 37 natürlich 37 mal.

    • Offizieller Beitrag

    Hallo,

    kann es sein das Du ein Zeilenumbruch in deinen Dateien hast?!

    Probiers mal so:

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_UseUpx=n
    #AutoIt3Wrapper_UseAnsi=y
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include<Array.au3>
    #include<String.au3>

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

    $test = FileRead("eingang.txt"); "1A2B3C4D5E6"
    If StringRight($test,2) = @CRLF Then $test = StringTrimRight($test, 2)
    $1_len = StringLen($test)
    ;MsgBox(0, "Stringlänge:", $1_len) ; diese Zeile nur zum testen

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

    $pass = FileRead("passwort.txt"); "94736"
    If StringRight($pass,2) = @CRLF Then $pass = StringTrimRight($pass, 2)
    $2_len = StringLen($pass)
    ;MsgBox(0, "Stringlänge Passwort:", $2_len) ; diese Zeile nur zum testen

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

    $zwischensumme = Ceiling($1_len / $2_len)
    ;~ MsgBox(0, "Stringlänge Zwischenlänge:", $zwischensumme) ; diese Zeile nur zum testen

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

    $anwenderpass = _StringRepeat($pass,$zwischensumme)
    ;~ MsgBox(0, "Stringlänge Anwendung:", $anwenderpass) ; diese Zeile nur zum testen

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

    For $i = 1 to $1_len Step +1
    $v_s = StringMid($test, $i, 1)
    ;~ MsgBox(0, "aus Test:", $v_s) ; diese Zeile nur zum testen
    $v_w = StringMid($anwenderpass, $i, 1) ; diese Zeile nur zum testen
    ;MsgBox(0, "aus Passwort:", $v_w)

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

    ; Array: senkrecht / waagerecht
    ; alle 37 Zeichen werden in 37 Zeilen dargestellt, wobei das erste Zeichen immer an das Ende rutscht.
    Local $avArray[38][38]
    Local $avTemp[38] = [" ","0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","."]
    For $x = 0 To 37
    $y = 37-$x
    For $z = 0 To 37
    $y += 1
    If $y>37 Then $y=0
    $avArray[$x][$y] = $avTemp[$z]
    Next
    Next

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

    ; senkrecht
    $s_Index = _ArraySearch($avArray, $v_s, 0, 0, 0, 1)
    ;~ ConsoleWrite("$w_Index: " & $s_Index & @CRLF) ; diese Zeile nur zum testen
    ; waagerecht
    $w_Index = _ArraySearch($avArray, $v_w, 0, 0, 0, 1)
    ;~ ConsoleWrite("$w_Index: " & $w_Index & @CRLF) ; diese Zeile nur zum testen
    ;MsgBox(0,"Array-Zahlen","Array-Zahlen: " & $s_Index & " - " & $w_Index & @CRLF & "Mathe Zahlen: " & $s_Index +1 & " - " & $w_Index +1) ; diese Zeile nur zum testen

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

    ;MsgBox(0,"Schnittmenge", $avArray[($s_Index)][($w_Index)]) ; diese Zeile nur zum testen
    FileOpen("codiert.txt",1)
    sleep(50)
    FileWrite("codiert.txt", $avArray[($s_Index)][($w_Index)])
    sleep(50)
    FileClose("codiert.txt")
    sleep(50)
    Next
    Exit

    [/autoit]
  • Zum Entfernen würde ich StringReplace benutzen

    $test = StringReplace ( $test, @CRLF, "" )
    $test = StringReplace ( $test, @CR, "" )
    $test = StringReplace ( $test, @LF, "" )

    Kannst auch mal
    $test = StringStripCR($test) versuchen

    • Offizieller Beitrag

    StringStripCR entfernt aber kein @CRLF

  • Es muß noch einen weiteren Fehler geben, denn nur der Zeilenumbruch war nicht der Grund.

    Habe jetzt mal folgendes gemacht und die oben beiden stehenden Beiträge von @bern670 und Bitboy mit aufgenommen.

    Spoiler anzeigen
    [autoit]


    #include<Array.au3>
    #include<String.au3>

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

    $test = FileRead("eingang.txt"); "1A2B3C4D5E6"
    If StringRight($test,2) = @CRLF OR StringRight($test,2) = @CR OR StringRight($test,2) = @LF Then $test = StringTrimRight($test, 2)
    $1_len = StringLen($test)
    ;MsgBox(0, "Stringlänge:", $1_len) ; diese Zeile nur zum testen

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

    $pass = FileRead("passwort.txt"); "94736"
    If StringRight($pass,2) = @CRLF OR StringRight($pass,2) = @CR OR StringRight($pass,2) = @LF Then $pass = StringTrimRight($pass, 2)
    $2_len = StringLen($pass)
    ;MsgBox(0, "Stringlänge Passwort:", $2_len) ; diese Zeile nur zum testen

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

    $zwischensumme = Ceiling($1_len / $2_len)
    ;~ MsgBox(0, "Stringlänge Zwischenlänge:", $zwischensumme) ; diese Zeile nur zum testen

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

    $anwenderpass = _StringRepeat($pass,$zwischensumme)
    ;~ MsgBox(0, "Stringlänge Anwendung:", $anwenderpass) ; diese Zeile nur zum testen

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

    For $i = 1 to $1_len Step +1
    $v_s = StringMid($test, $i, 1)
    ;~ MsgBox(0, "aus Test:", $v_s) ; diese Zeile nur zum testen
    $v_w = StringMid($anwenderpass, $i, 1) ; diese Zeile nur zum testen
    ;MsgBox(0, "aus Passwort:", $v_w)

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

    ; Array: senkrecht / waagerecht
    ; alle 37 Zeichen werden in 37 Zeilen dargestellt, wobei das erste Zeichen immer an das Ende rutscht.
    Local $avArray[38][38]
    Local $avTemp[38] = [" ","0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","."]
    For $x = 0 To 37
    $y = 37-$x
    For $z = 0 To 37
    $y += 1
    If $y>37 Then $y=0
    $avArray[$x][$y] = $avTemp[$z]
    Next
    Next

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

    ; senkrecht
    $s_Index = _ArraySearch($avArray, $v_s, 0, 0, 0, 1)
    ;~ ConsoleWrite("$w_Index: " & $s_Index & @CRLF) ; diese Zeile nur zum testen
    ; waagerecht
    $w_Index = _ArraySearch($avArray, $v_w, 0, 0, 0, 1)
    ;~ ConsoleWrite("$w_Index: " & $w_Index & @CRLF) ; diese Zeile nur zum testen
    ;MsgBox(0,"Array-Zahlen","Array-Zahlen: " & $s_Index & " - " & $w_Index & @CRLF & "Mathe Zahlen: " & $s_Index +1 & " - " & $w_Index +1) ; diese Zeile nur zum testen

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

    ;MsgBox(0,"Schnittmenge", $avArray[($s_Index)][($w_Index)]) ; diese Zeile nur zum testen
    FileOpen("codiert.txt",1)
    sleep(50)
    FileWrite("codiert.txt", $avArray[($s_Index)][($w_Index)])
    sleep(50)
    FileClose("codiert.txt")
    sleep(50)
    Next
    Exit

    [/autoit]

    Das ist nun die Fehlermeldung:
    gug.au3 (55) : ==> Array variable subscript badly formatted.:
    FileWrite("codiert.txt", $avArray[($s_Index)][($w_Index)])
    FileWrite("codiert.txt", $avArray[^ ERROR

    Lieben Gruß,
    Alina

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

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

  • Probier mal so:

    Spoiler anzeigen
    [autoit]

    #include<Array.au3>
    #include<String.au3>

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

    $test = FileRead("eingang.txt"); "1A2B3C4D5E6"
    If StringRight($test,2) = @CRLF OR StringRight($test,2) = @CR OR StringRight($test,2) = @LF Then $test = StringTrimRight($test, 2)
    $1_len = StringLen($test)
    ;MsgBox(0, "Stringlänge:", $1_len) ; diese Zeile nur zum testen

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

    $pass = FileRead("passwort.txt"); "94736"
    If StringRight($pass,2) = @CRLF OR StringRight($pass,2) = @CR OR StringRight($pass,2) = @LF Then $pass = StringTrimRight($pass, 2)
    $2_len = StringLen($pass)
    ;MsgBox(0, "Stringlänge Passwort:", $2_len) ; diese Zeile nur zum testen

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

    $zwischensumme = Ceiling($1_len / $2_len)
    ;~ MsgBox(0, "Stringlänge Zwischenlänge:", $zwischensumme) ; diese Zeile nur zum testen

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

    $anwenderpass = _StringRepeat($pass,$zwischensumme)
    ;~ MsgBox(0, "Stringlänge Anwendung:", $anwenderpass) ; diese Zeile nur zum testen

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

    For $i = 1 to $1_len Step +1
    $v_s = StringMid($test, $i, 1)
    ;~ MsgBox(0, "aus Test:", $v_s) ; diese Zeile nur zum testen
    $v_w = StringMid($anwenderpass, $i, 1) ; diese Zeile nur zum testen
    ;MsgBox(0, "aus Passwort:", $v_w)

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

    ; Array: senkrecht / waagerecht
    ; alle 37 Zeichen werden in 37 Zeilen dargestellt, wobei das erste Zeichen immer an das Ende rutscht.
    Local $avArray[38][38]
    Local $avTemp[38] = [" ","0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","."]
    For $x = 0 To 37
    $y = 37-$x
    For $z = 0 To 37
    $y += 1
    If $y>37 Then $y=0
    $avArray[$x][$y] = $avTemp[$z]
    Next
    Next

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

    ; senkrecht
    $s_Index = _ArraySearch($avArray, $v_s, 0, 0, 0, 1)
    ;~ ConsoleWrite("$w_Index: " & $s_Index & @CRLF) ; diese Zeile nur zum testen
    ; waagerecht
    $w_Index = _ArraySearch($avArray, $v_w, 0, 0, 0, 1)
    ;~ ConsoleWrite("$w_Index: " & $w_Index & @CRLF) ; diese Zeile nur zum testen
    ;MsgBox(0,"Array-Zahlen","Array-Zahlen: " & $s_Index & " - " & $w_Index & @CRLF & "Mathe Zahlen: " & $s_Index +1 & " - " & $w_Index +1) ; diese Zeile nur zum testen

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

    ;MsgBox(0,"Schnittmenge", $avArray[$s_Index][$w_Index]) ; diese Zeile nur zum testen
    FileOpen("codiert.txt",1)
    sleep(50)
    FileWrite("codiert.txt", $avArray[$s_Index][$w_Index])
    sleep(50)
    FileClose("codiert.txt")
    sleep(50)
    Next
    Exit

    [/autoit]


    Bin alledings gerad an einem PC ohne AutoIt, kanns nicht testen :S

    mfg. Jam00

    • Offizieller Beitrag

    Hallo,

    bei mir bricht's nicht ab, dein $avArray brauchst Du aber nicht jedesmal neu zu machen das kann ruhig ausserhalb der Schleife beschrieben werden.

    In der codiert.txt steht bei mir "BFAFABFAFABFAFABFAFABFAFABFAFABFAFABFAFABFAFAM9L9LGBFAFAM9L9LGBFAFAM9L9LGBFAFAM9L9LG"


    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_UseUpx=n
    #AutoIt3Wrapper_UseAnsi=y
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include<Array.au3>
    #include<String.au3>

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

    $test = FileRead("eingang.txt"); "1A2B3C4D5E6"
    $test = StringReplace(StringReplace($test, @LF, ""), @CR, "")
    $1_len = StringLen($test)
    ;MsgBox(0, "Stringlänge:", $1_len) ; diese Zeile nur zum testen

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

    $pass = FileRead("passwort.txt"); "94736"
    $pass = StringReplace(StringReplace($pass, @LF, ""), @CR, "")
    $2_len = StringLen($pass)
    ;MsgBox(0, "Stringlänge Passwort:", $2_len) ; diese Zeile nur zum testen

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

    $zwischensumme = Ceiling($1_len / $2_len)
    MsgBox(0, "Stringlänge Zwischenlänge:", $zwischensumme) ; diese Zeile nur zum testen

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

    $anwenderpass = _StringRepeat($pass,$zwischensumme)
    ;~ MsgBox(0, "Stringlänge Anwendung:", $anwenderpass) ; diese Zeile nur zum testen

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

    ; Array: senkrecht / waagerecht
    ; alle 37 Zeichen werden in 37 Zeilen dargestellt, wobei das erste Zeichen immer an das Ende rutscht.
    Local $avArray[38][38]
    Local $avTemp[38] = [" ","0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","."]
    For $x = 0 To 37
    $y = 37-$x
    For $z = 0 To 37
    $y += 1
    If $y>37 Then $y=0
    $avArray[$x][$y] = $avTemp[$z]
    Next
    Next

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

    For $i = 1 to $1_len Step +1
    $v_s = StringMid($test, $i, 1)
    ;~ MsgBox(0, "aus Test:", $v_s) ; diese Zeile nur zum testen
    $v_w = StringMid($anwenderpass, $i, 1) ; diese Zeile nur zum testen
    ;MsgBox(0, "aus Passwort:", $v_w)

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

    ; senkrecht
    $s_Index = _ArraySearch($avArray, $v_s, 0, 0, 0, 1)
    ;~ ConsoleWrite("$w_Index: " & $s_Index & @CRLF) ; diese Zeile nur zum testen
    ; waagerecht
    $w_Index = _ArraySearch($avArray, $v_w, 0, 0, 0, 1)
    ;~ ConsoleWrite("$w_Index: " & $w_Index & @CRLF) ; diese Zeile nur zum testen
    ;MsgBox(0,"Array-Zahlen","Array-Zahlen: " & $s_Index & " - " & $w_Index & @CRLF & "Mathe Zahlen: " & $s_Index +1 & " - " & $w_Index +1) ; diese Zeile nur zum testen

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

    ;MsgBox(0,"Schnittmenge", $avArray[($s_Index)][($w_Index)]) ; diese Zeile nur zum testen
    FileOpen("codiert.txt",1)
    sleep(50)
    FileWrite("codiert.txt", $avArray[($s_Index)][($w_Index)])
    sleep(50)
    FileClose("codiert.txt")
    sleep(50)
    Next
    Exit

    [/autoit]

    Edit: lass dir mal den Wert von $s_index ausgeben!

  • Probier mal so.
    Wenn ich den Code von Bernd richtig verstehe würden Zeichenumbrüche nur entfernt wenn sie am Ende der Zeile stehen, da du aber die Textdatei nicht zeilenweise einliest bleibt die Funktion ohne Wirkung.

    Spoiler anzeigen
    [autoit]

    $test = FileRead("eingang.txt"); "1A2B3C4D5E6"
    $test = StringReplace ( $test, @CRLF, "" )
    $test = StringReplace ( $test, @CR, "" )
    $test = StringReplace ( $test, @LF, "" )
    .
    .

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

    $pass = FileRead("passwort.txt"); "94736"
    $pass = StringReplace ( $pass, @CRLF, "" )
    $pass = StringReplace ( $pass, @CR, "" )
    $pass = StringReplace ( $pass, @LF, "" )

    [/autoit]
    • Offizieller Beitrag

    Wenn Du meine letzten Beitrag gelesen hättest, hättest Du auch gesehen das ich da StringTrim durch StringReplace ersetzt habe. ;)

  • Bernd das schaut gut aus. Habe jetzt 79 Buchstaben / Zeichen eingefügt und un macht er auch größere Texte.
    Mal schauen wo er denn auf hört.

    Danke und ich melde mich.

    Lieben Gruß,
    Alina

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

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr