1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. BugFix

Beiträge von BugFix

  • Buchstaben mit Pixelauswertung

    • BugFix
    • 16. Juli 2010 um 22:23

    ..und damit das nicht ausartet machen wir lieber gleich dicht.

  • Excel Autospeichern

    • BugFix
    • 16. Juli 2010 um 21:39

    Hänge einfach in das Makro ein:
    ActiveWorkbook.Save
    Falls das im Zusammenhang mit Open nicht geht, einfach ein anderes Makro mit diesem Befehl erstellen und dieses mit Open aufrufen.

  • Excel, ende der Tabelle abschneiden

    • BugFix
    • 16. Juli 2010 um 20:19

    So geht es:

    [autoit]

    $oExcel = ObjGet('', 'Excel.Application')
    $firstCol = 'A' ; Startspalte
    $lastCol = 'AM' ; Endspalte
    $firstRow = 8 ; erste Datenzeile
    $lastRow = 40 ; letzte Datenzeile

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

    With $oExcel.ActiveWorkbook.Sheets(1)
    For $i = $firstRow To $lastRow
    If Mod($i, 2) Then ; ungerade Zeile
    .Range($firstCol & $i & ':' & $lastCol & $i).Interior.Color = 0xCCFFCC
    Else
    .Range($firstCol & $i & ':' & $lastCol & $i).Interior.Color = 0xCCFFFF
    EndIf
    Next
    EndWith

    [/autoit]
  • Excel, ende der Tabelle abschneiden

    • BugFix
    • 16. Juli 2010 um 19:56

    Du kannst jede Zelle einzeln färben, ich mach ein Bsp.

  • Excel, ende der Tabelle abschneiden

    • BugFix
    • 16. Juli 2010 um 19:20

    Probier mal zum Druckbereich setzen:

    [autoit]

    Local $sFilePath = 'Deine XLS'
    Local $oExcel = ObjCreate("Excel.Application")
    Local $oBook = $oExcel.WorkBooks.Open($sFilePath, Default, False)
    Local $oSheet = $oBook.Worksheets.Item(1) ; oder anderes Tabellenblatt, auch "Tabelle Name" möglich
    $oSheet.Range("C10:K30").Select
    $oExcel.ActiveSheet.PageSetup.PrintArea = "$C$10:$K$30" ; Druckbereich

    [/autoit]


    Na die Funktionen zum Wandeln sind doch eindeutig. Du gibst die Spalte als String (z.B. 'AS') ein bekommst dafür die Spalte als Zahlwert zurück und umgekehrt.

  • Excel, ende der Tabelle abschneiden

    • BugFix
    • 16. Juli 2010 um 19:07

    Du mußt den Druckbereich festlegen, dann stört es nicht, wenn die farbige Markierung über die Tabelle hinausgeht.
    Ich schau mal ob ich ein Bsp. finde.

  • EasyScreen & Crocoframe Programme zum Aufnehmen von Videos und zum Screenshots machen!!

    • BugFix
    • 16. Juli 2010 um 18:53

    Ich erwarte, dass bei vorgestellten Skripten mindestens eine Beschreibung des Skriptes hier veröffentlicht wird! Eine Überschrift ist da wenig aussagekräftig. Und es ist doch nicht zuviel verlangt hier ein paar Zeilen zu hinterlassen. :S

  • BitAnd Problem - ich verstehs nicht..

    • BugFix
    • 16. Juli 2010 um 15:52

    Dein Status ist in der Variable $temp und du fragst die Variable $status ab. ;)

  • Just 4 Fun: BrainFuck-Text-Interpreter (BF2Ascii und Ascii2BF)

    • BugFix
    • 16. Juli 2010 um 14:58

    Ja die Version 2 war auch nur ein Zwischenschritt. In der aktuellen Version gibt es damit keine Probleme.

  • While - WEnd Problem

    • BugFix
    • 16. Juli 2010 um 13:03

    Es ist selten sinnvoll eine GUI innerhalb einer Funktion, Schleife zu erstellen. Besser am Skriptanfang erstellen und bei Bedarf einblenden [ GuiSetState(@SW_SHOW, $hWnd) ].

  • Just 4 Fun: BrainFuck-Text-Interpreter (BF2Ascii und Ascii2BF)

    • BugFix
    • 16. Juli 2010 um 12:25

    Neue Version in Post #1.
    Kleinen Bug gefixt.
    ASCII-to-BF effektiver.

  • Just 4 Fun: BrainFuck-Text-Interpreter (BF2Ascii und Ascii2BF)

    • BugFix
    • 15. Juli 2010 um 20:48

    Neue Version in Post #1. Nun kann in beide Richtungen (BF_to_ASCII und ASCII_to_BF) gebrainfuckt werden. :D

  • Just 4 Fun: BrainFuck-Text-Interpreter (BF2Ascii und Ascii2BF)

    • BugFix
    • 15. Juli 2010 um 13:33

    Verschachtelte Schleifen nehme ich mir später vor. ;)
    Ich würde die Schleifen als Do-Until betrachten, da die Abbruchbedingung klar ist (Wert unter Pointer=0) und dieser Pointer erst nach Ausführung von Operationen erreicht wird - also fußgesteuert. Es erfolgt immer ein Eintritt in die Schleife, was ja bei While-End nicht der Fall wäre.
    Ich bastel gerade an Text-2-BF. Aber geschachtelte Schleifen verkneife ich mir da im Moment noch. :rolleyes:

  • Just 4 Fun: BrainFuck-Text-Interpreter (BF2Ascii und Ascii2BF)

    • BugFix
    • 15. Juli 2010 um 12:41
    Zitat von progandy

    Kann das sein, dass dein Interpreter einen Bug hat? Das funktioniert bei mir nicht:


    Ja, war eine Fehlinterpretation von mir. Ich hatte die Beschreibung so verstanden, dass bei erstmaliger Verwendung von ">" der vorher wertlose Pointer auf das erste (Index 0) Element zeigt. Diese Abfrage habe ich jetzt entfernt und dann funktioniert es auch mit deinem Bsp.

  • Just 4 Fun: BrainFuck-Text-Interpreter (BF2Ascii und Ascii2BF)

    • BugFix
    • 14. Juli 2010 um 21:47
    Zitat von EliteMattthias

    Kannste das mal andersrum machen ?


    Das ist nicht ganz so simpel, denn das möchte ich dann schon in optimierter Form ausgeben. Und die Optimierung ist ein wirklich harter Brocken.
    Also wird das wohl noch etwas dauern. ^^

  • Just 4 Fun: BrainFuck-Text-Interpreter (BF2Ascii und Ascii2BF)

    • BugFix
    • 14. Juli 2010 um 20:43

    Hi,
    einige von euch werden wohl auch durch L3viathans Rätsel, wie ich, erstmalig mit der Programmiersprache Brainfuck Kontakt gehabt haben.
    Ich finde diese recht originell, wenn auch nicht unbedingt sehr sinnvoll, wird dem Namen gerecht. Wenn man das Prinzip verstanden hat, ist die Sprache nicht mal schwer, nur extrem unübersichtlich. Ich habe mal einen BF-Text-Interpreter geschrieben, der in BF-Code dargestellten Text in eine lesbare Ausgabe verwandelt.
    Der erste String ist optimiert erstellt (relativ adressiert), der zweite ist ohne jede Optimierung. Ein deutlicher Unterschied.
    Viel Spaß damit. :)

    Edit:
    Kleiner Nachtrag noch. Der Interpreter arbeitet nicht mit geschachtelten Schleifen. Diese sollten aber selbst bei super-optimierten Texten nicht auftreten.

    Edit 2:
    Einen Bug gefixt (Pointerinitialisierung).

    Edit 3: NEU
    Erweitert um die Funktion _AsciiToBFcode(). Hiermit läßt sich normaler Text in BrainFuck-Code ausgeben.
    Es gibt unendlich viele Möglichkeiten von BF-Code, der letztlich denselben Ascii-String ausgibt.
    Ich habe mir folgendes Verfahren entwickelt:
    - Ermitteln der Ascii-Werte für jedes Zeichen
    - Runden der Ascii-Werte auf glatte Zehner
    - für jeden unterschiedlichen glatten Zehnerwert wird eine Zelle belegt und mit diesem Wert befüllt
    jetzt wird Zeichen für Zeichen durchgegangen:
    - Pointer auf Zelle mit zugehörigem gerundeten Zehnerwert
    - je nach Differenz zum tatsächlichem Ascii-Wert in/dekrementieren
    - Zeichenausgabe
    - Zelle auf den vorigen Wert zurücksetzen
    Sicher kann man noch weiter optimieren, aber für den Anfang finde ich es schon recht gut gelungen. :rolleyes:

    Edit 4:
    Ich habe die Ascii-to-BF Funktion noch 2-mal verbessert. Bei langen Texten nun eine Verkürzung des Codes um 50-70 % im Vergleich zur ersten Variante.
    Ich setzte jetzt in den Referenzzellen den Wert nach Nutzung nicht zurück, sondern speichere den zuletzt genutzten Wert. Wird die Referenzzelle wieder genutzt bildet sich der Wert zum In/Dekrementieren aus Differenz Ascci-Wert und letztem in der Zelle genutzten Wert. Das ist doch wesentlich effektiver als in den alten Varianten.
    Ich habe alle 3 Versionen im Skript belassen, da könnt ihr ja vergleichen.
    Einen Bug habe ich auch noch gefixt in der Interpreter-Hilfsfunktion. Waren mehrere gleiche Zeichen am Stringende, trat ein Indexfehler auf.

    BF-Text-Interpreter
    [autoit]

    #cs
    Der C-Sourcecode eines in Brainfuck geschriebenen Programms hat nur eine minimallänge von 1055 Bytes - also rund 1KB. Brainfuck arbeitet (standardmäßig) auf einem 30000 Bytes großen Array und einem Pointer, der irgendwo in das Array zeigt. Der Pointer kann vor- und zurückgesetzt werden, die Werte unter dem Counter können hoch- und runtergezählt, eingelesen und ausgegeben werden. Außerdem gibt es ein sehr hübsches Schleifenkonstrukt.

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

    Befehle

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

    Brainfuck kommt mit sage und schreibe 8 Befehlen aus. Daher kommt auch die Bezeichnung "minimalistische" Programmiersprache da die Sprache über ein Minimum an Befehlen - in diesem Fall 8 - verfügt.

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

    Befehl C Equivalent Beschreibung
    > ++ptr; Setzt den Pointer um 1 weiter
    < --ptr; Setzt den Pointer um 1 zurück
    + ++*ptr; Den Wert des Elements im Array um 1 erhöhen
    - --*ptr; Den Wert des Elements im Array um 1 verringern
    [ while(*ptr){ Starte einer Schleife - Abbruchbedingung ist, das der Wert des Elements im Array unter dem Pointer 0 beträgt
    ] } Ende einer Schleife
    . putchar(*ptr); ASCII-Code des Wertes unter dem Pointer ausgeben
    , *ptr=getchar(); Zeichen einlesen und im Array unter dem Pointer speichern

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

    Jedes Array und jedes Element eines Arrays wird, mit dem ersten Setzen des Pointers auf dieses Element mit 0 initialisiert. Der Pointer selbst steht zu Beginn ebenfalls immer auf 0.
    #ce
    #include-once
    #include <Array.au3>
    #include <String.au3>

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

    Local $sBF_1 = '>++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.'
    Local $sBF_2 = '>++++++++++[>+>+++>+++++>+++++++>++++++++++>+++++++++++>++++++++++++<<<<<<<-]>>>>-----.>>>---.-.<+.<<++++++++.>>>.<<<<<++.>>>>--.<+..>>.-.<<<<<.>>-------.>>+++++.<----.>---------.+++++.<<++++.>>>++.<<++.>---.<<<----.<<+++.---.'
    ConsoleWrite('$sBF_1 & $sBF_2:' & @CRLF)
    ConsoleWrite(_BFtextInterpreter($sBF_1) & _BFtextInterpreter($sBF_2) & @CRLF)

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

    $BFcode = _AsciiToBFcode( _
    'Befehl C Equivalent Beschreibung' & @CRLF & _
    '> ++ptr; Setzt den Pointer um 1 weiter' & @CRLF & _
    '< --ptr; Setzt den Pointer um 1 zurück' & @CRLF & _
    '+ ++*ptr; Den Wert des Elements im Array um 1 erhöhen' & @CRLF & _
    '- --*ptr; Den Wert des Elements im Array um 1 verringern' & @CRLF & _
    '[ while(*ptr){ Starte einer Schleife - Abbruchbedingung ist, das der Wert des Elements im Array unter dem Pointer 0 beträgt' & @CRLF & _
    '] } Ende einer Schleife' & @CRLF & _
    '. putchar(*ptr); ASCII-Code des Wertes unter dem Pointer ausgeben' & @CRLF & _
    ', *ptr=getchar(); Zeichen einlesen und im Array unter dem Pointer speichern' & @CRLF )
    ConsoleWrite('BF-Beschreibung als BF-Code:' & @CRLF & $BFcode & @crlf)
    ConsoleWrite('und zurück:' & @crlf & _BFtextInterpreter($BFcode) & @CRLF)
    ConsoleWrite('ASCII-to-BF in 3 Versionen:' & @CRLF)
    ConsoleWrite(_AsciiToBFcode_1('Hello World!') & @CRLF)
    ConsoleWrite(_AsciiToBFcode_2('Hello World!') & @CRLF)
    ConsoleWrite(_AsciiToBFcode('Hello World!') & @CRLF) ; aktuelle Version

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

    Func _BFtextInterpreter($sBFcode)
    Local $aCode = StringSplit(StringStripWS($sBFcode, 8), '', 2)
    Local $sOut = '', $index = 0, $count, $iLoop = -1
    Local $a[30000], $pt = 0
    Do
    If $index < UBound($aCode) -1 Then
    $count = __CountEvenNeighbour($aCode, $index)
    Else
    $count = 0
    EndIf
    Switch $aCode[$index]
    Case '>'
    $pt += 1 + $count
    $index += 1 + $count
    Case '<'
    $pt -= (1 + $count)
    $index += 1 + $count
    Case '+'
    $a[$pt] += 1 + $count
    $index += 1 + $count
    Case '-'
    $a[$pt] -= 1 + $count
    $index += 1 + $count
    Case '['
    $iLoop = $index +1
    $index += 1 + $count
    Case ']'
    If $a[$pt] = 0 Then
    $iLoop = -1
    $index += 1 + $count
    Else
    $index = $iLoop
    EndIf
    Case '.'
    $sOut &= Chr($a[$pt])
    $index += 1
    Case ',' ; erwartet Input von Standardeingabe
    ;~ $a[$pt] = Asc('Input')
    ;~ $index += 1
    EndSwitch
    Until $index = UBound($aCode)
    Return $sOut
    EndFunc ;==>_BFtextInterpreter

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

    Func __CountEvenNeighbour(ByRef $aCode, $iStart)
    Local $counter = 0
    While $aCode[$iStart +$counter +1] == $aCode[$iStart]
    $counter += 1
    If $iStart +$counter +1 = UBound($aCode) Then ExitLoop
    WEnd
    Return $counter
    EndFunc ;==>__CountEvenNeighbour

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

    Func _AsciiToBFcode($sString) ; Version 3
    Local $aString = StringSplit($sString, '', 2)
    Local $aWork[UBound($aString)][3], $aRounded[1][2]
    ; === ASCII-Werte ermitteln und die zugehörigen gerundeten Zehner-ASCII-Werte
    For $i = 0 To UBound($aString) -1
    $aWork[$i][0] = Asc($aString[$i]) ; ASCII-Wert des Zeichens
    $aWork[$i][1] = Round($aWork[$i][0] /10) *10 ; auf Zehnerwert auf/abgerundeter ASCII-Wert
    $aWork[$i][2] = $i ; Position im Ausgangsstring
    Next
    ; === nach ASCII-Werten aufsteigend sortieren
    _ArraySort($aWork)
    ; === gerundete Zehner-ASCII-Werte zusammenfassen
    $aRounded[0][0] = $aWork[0][1] ; gerundeter Zehner-ASCII-Wert
    $aRounded[0][1] = $aWork[0][1] ; momentan genutzter Wert
    For $i = 0 To UBound($aWork) -1
    If $i < UBound($aWork) -1 Then
    If $aWork[$i][1] <> $aWork[$i+1][1] Then
    ReDim $aRounded[UBound($aRounded)+1][2]
    $aRounded[UBound($aRounded)-1][0] = $aWork[$i+1][1]
    $aRounded[UBound($aRounded)-1][1] = $aWork[$i+1][1]
    EndIf
    EndIf
    Next
    ; === wieder nach Reihenfolge Zeichen sortieren
    _ArraySort($aWork, 0, 0,0,2)
    ; === je eine Zelle auf einen einmal vorkommenden gerundeten Zehner-ASCII-Wert setzen
    Local $sBF = '>++++++++++[' ; Faktor 10 vor der Schleife erstellen
    For $i = 0 To UBound($aRounded) -1
    $sBF &= '>' & _StringRepeat('+', $aRounded[$i][0]/10) ; Faktor für Zehner-Multiplikation
    Next
    $sBF &= _StringRepeat('<', UBound($aRounded)) & '-]' ; zurück auf Schleifenzähler und dekrementieren
    $sBF &= '>' ; Pointer auf erste Wertezelle
    Local $index, $index_last = 0, $step = 0, $diff = 0, $nextStep
    For $i = 0 To UBound($aString) -1 ; durch Eingabestring iterieren
    $index = _ArraySearch($aRounded, $aWork[$i][1])
    $diff = $index - $index_last
    $index_last = $index
    Select
    Case $diff < 0
    $nextStep = _StringRepeat('<', Abs($diff))
    Case 0
    $nextStep = ''
    Case Else
    $nextStep = _StringRepeat('>', $diff)
    EndSelect
    $sBF &= $nextStep
    $diff = $aWork[$i][0] - $aRounded[$index][1] ; Differenz zw. tatsächlichem Wert und zuletzt genutztem Wert
    ; === Zelle unter Pointer um $diff in/dekrementieren, Zeichen ausgeben
    Select
    Case $diff < 0
    $nextStep = _StringRepeat('-', Abs($diff))
    Case 0
    $nextStep = ''
    Case Else
    $nextStep = _StringRepeat('+', $diff)
    EndSelect
    $aRounded[$index][1] += $diff ; zuletzt genutzten Wert in Zelle aktualisieren
    $sBF &= $nextStep & '.'
    Next
    Return $sBF
    EndFunc ;==>_AsciiToBFcode

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

    Func _AsciiToBFcode_2($sString) ; Version 2
    Local $aString = StringSplit($sString, '', 2)
    Local $aWork[UBound($aString)][3], $aRounded[1][2]
    ; === ASCII-Werte ermitteln und die zugehörigen gerundeten Zehner-ASCII-Werte
    For $i = 0 To UBound($aString) -1
    $aWork[$i][0] = Asc($aString[$i]) ; ASCII-Wert des Zeichens
    $aWork[$i][1] = Round($aWork[$i][0] /10) *10 ; auf Zehnerwert auf/abgerundeter ASCII-Wert
    $aWork[$i][2] = $i ; Position im Ausgangsstring
    Next
    ; === nach ASCII-Werten aufsteigend sortieren
    _ArraySort($aWork)
    ; === gerundete Zehner-ASCII-Werte zusammenfassen
    $aRounded[0][0] = $aWork[0][1]
    $aRounded[0][1] = 1
    For $i = 0 To UBound($aWork) -1
    If $i < UBound($aWork) -1 Then
    If $aWork[$i][1] <> $aWork[$i+1][1] Then
    ReDim $aRounded[UBound($aRounded)+1][2]
    $aRounded[UBound($aRounded)-1][0] = $aWork[$i+1][1]
    $aRounded[UBound($aRounded)-1][1] = 1
    Else
    $aRounded[UBound($aRounded)-1][1] += 1
    EndIf
    EndIf
    Next
    ; === wieder nach Reihenfolge Zeichen sortieren
    _ArraySort($aWork, 0, 0,0,2)
    ; === je eine Zelle auf einen einmal vorkommenden gerundeten Zehner-ASCII-Wert setzen
    Local $sBF = '>++++++++++[' ; Faktor 10 vor der Schleife erstellen
    For $i = 0 To UBound($aRounded) -1
    $sBF &= '>' & _StringRepeat('+', $aRounded[$i][0]/10) ; Faktor für Zehner-Multiplikation
    Next
    $sBF &= _StringRepeat('<', UBound($aRounded)) & '-]' ; zurück auf Schleifenzähler und dekrementieren
    $sBF &= '>' ; Pointer auf erste Wertezelle
    Local $index, $index_last = 0, $step = 0, $diff = 0, $nextStep, $backStep, $lastback, $nextIsSame = False
    For $i = 0 To UBound($aString) -1 ; durch Eingabestring iterieren
    $index = _ArraySearch($aRounded, $aWork[$i][1])
    $diff = $index - $index_last
    $index_last = $index
    Select
    Case $diff < 0
    $nextStep = _StringRepeat('<', Abs($diff))
    Case 0
    $nextStep = ''
    Case Else
    $nextStep = _StringRepeat('>', $diff)
    EndSelect
    $sBF &= $nextStep
    $diff = $aWork[$i][0] - $aWork[$i][1] ; Differenz zw. tatsächlichem Wert und Round-Wert
    ; === Zelle unter Pointer um $diff in/dekrementieren, Zeichen ausgeben, Wert zurücksetzen
    ; === nur wenn Folgezeichen <> aktuellem Zeichen
    If Not $nextIsSame Then
    Select
    Case $diff < 0
    $nextStep = _StringRepeat('-', Abs($diff))
    $backStep = _StringRepeat('+', Abs($diff))
    Case 0
    $nextStep = ''
    Case Else
    $nextStep = _StringRepeat('+', $diff)
    $backStep = _StringRepeat('-', $diff)
    EndSelect
    $lastback = $backStep
    EndIf
    $aRounded[$index][1] -= 1
    ; === wenn Zelle letztmalig verwendet wurde, Wert in Zelle nicht mehr zurücksetzen
    If $aRounded[$index][1] = 0 Then $backStep = ''
    ; === wenn Folgezeichen identisch, dann Wert auch nicht zurücksetzen
    If ($i < UBound($aString) -2) And ($aString[$i] == $aString[$i+1]) Then
    $nextIsSame = True
    $lastback = $backStep
    $backStep = ''
    ElseIf ($i < UBound($aString) -2) And ($aString[$i] <> $aString[$i+1]) Then
    $nextIsSame = False
    $backStep = $lastback
    EndIf
    $sBF &= $nextStep & '.' & $backStep
    Next
    Return $sBF
    EndFunc ;==>_AsciiToBFcode

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

    Func _AsciiToBFcode_1($sString) ; Version 1
    Local $aString = StringSplit($sString, '', 2)
    Local $aWork[UBound($aString)][3], $sUniqueRounded
    ; === ASCII-Werte ermitteln und die zugehörigen gerundeten Zehner-ASCII-Werte
    For $i = 0 To UBound($aString) -1
    $aWork[$i][0] = Asc($aString[$i]) ; ASCII-Wert des Zeichens
    $aWork[$i][1] = Round($aWork[$i][0] /10) *10 ; auf Zehnerwert auf/abgerundeter ASCII-Wert
    $aWork[$i][2] = $i ; Position im Ausgangsstring
    Next
    ; === nach ASCII-Werten aufsteigend sortieren
    _ArraySort($aWork)
    ; === gerundete Zehner-ASCII-Werte zusammenfassen
    $sUniqueRounded = $aWork[UBound($aWork)-1][1]
    For $i = UBound($aWork) -1 To 0 Step -1
    If $i > 0 Then
    If $aWork[$i][1] <> $aWork[$i-1][1] Then $sUniqueRounded = $aWork[$i-1][1] & ',' & $sUniqueRounded
    EndIf
    Next
    ; === wieder nach Reihenfolge Zeichen sortieren
    _ArraySort($aWork, 0, 0,0,2)
    Local $aUnique = StringSplit($sUniqueRounded, ',', 2) ; Array mit gerundeten Zehner-ASCII-Werten
    ; === je eine Zelle auf einen einmal vorkommenden gerundeten Zehner-ASCII-Wert setzen
    Local $sBF = '>++++++++++[' ; Faktor 10 vor der Schleife erstellen
    For $i = 0 To UBound($aUnique) -1
    $sBF &= '>' & _StringRepeat('+', $aUnique[$i]/10) ; Faktor für Zehner-Multiplikation
    Next
    $sBF &= _StringRepeat('<', UBound($aUnique)) & '-]' ; zurück auf Schleifenzähler und dekrementieren
    $sBF &= '>' ; Pointer auf erste Wertezelle
    Local $index, $index_last = 0, $step = 0, $diff = 0, $nextStep, $backStep
    For $i = 0 To UBound($aString) -1
    $index = _ArraySearch($aUnique, $aWork[$i][1])
    $diff = $index - $index_last
    $index_last = $index
    Select
    Case $diff < 0
    $nextStep = _StringRepeat('<', Abs($diff))
    Case 0
    $nextStep = ''
    Case Else
    $nextStep = _StringRepeat('>', $diff)
    EndSelect
    $sBF &= $nextStep
    $diff = $aWork[$i][0] - $aWork[$i][1] ; Differenz zw. tatsächlichem Wert und Round-Wert
    ; === Zelle unter Pointer um $diff in/dekrementieren, Zeichen ausgeben, Wert zurücksetzen
    Select
    Case $diff < 0
    $nextStep = _StringRepeat('-', Abs($diff))
    $backStep = _StringRepeat('+', Abs($diff))
    Case 0
    $nextStep = ''
    Case Else
    $nextStep = _StringRepeat('+', $diff)
    $backStep = _StringRepeat('-', $diff)
    EndSelect
    If $i = UBound($aString) -1 Then $backStep = ''
    $sBF &= $nextStep & '.' & $backStep
    Next
    Return $sBF
    EndFunc ;==>_AsciiToBFcode

    [/autoit]

    Dateien

    BrainFuck.au3 13,25 kB – 466 Downloads
  • Automatischen Nachrichten Beantworter

    • BugFix
    • 14. Juli 2010 um 17:36

    Nun zum automatischen Abgeben einer Statusnachricht sehe ich keine Konflikte zu unseren Forumsregeln auf die ich aber trotzdem verweise.

    Schau dir in der Hilfe mal "MouseClick" an. Texte an offene Fenster lassen sich mit "Send" übermitteln. ;)

  • ISO-Creator

    • BugFix
    • 14. Juli 2010 um 13:10

    Die Datei darfst frei verwendet werden, sie ist OpenSource und unterliegt der GNU General Public License (GPL).
    Es ist aber geschickter auf das Original zu verlinken im Paket "cdrtools", Download Seite.

  • Globale Variablen - besser vermeiden

    • BugFix
    • 14. Juli 2010 um 11:15

    Ich denke, die meisten deklarieren Variablen, wenn sie nicht innerhalb einer Funktion sind, als Global.
    Nun habe ich von Valik (EN-Forum) einen interessanten Beitrag zu diesem Thema gefunden, den ihr euch mal zu Gemüte führen solltet.
    Ich habe eine Übersetzung gemacht und hoffe, dass ich das Wesentliche getroffen habe. Falls ihr fehlerhafte Inhalte findet - bitte melden. (Besonders bei den umgangssprachlichen Einlagen hab ich mich etwas schwer getan). Einen Text 1:1 übersetzen ist, wie ihr von der Hilfe-Übersetzung wisst, nicht so easy und es ist besser, wenn nochmal wer querliest.
    Im Text ist ein Link enthalten, dessen Inhalt ich aber nicht extra übersetzt habe.

    [Valik] Why Global variables are bad

    Übersetzung

    Globale Variablen können zu unerwarteten Ergebnissen führen, s. hier. Ich war dabei ein Problem mit AutoIt und Aut2Exe zu fixen, welches beinhaltete, zwei getrennte (und fast identische) Listen von Funktionsnamen zu unterstützen. Habt ihr euch jemals gefragt, warum wir manchmal ein Release ausgeben würden (wie 3.3.5.0), welches nicht eine Funktion kompilieren konnte, aber es konnte laufen? Das ist, weil wir vergaßen, die Aut2Exe zu aktualisieren. Die von mir gezeigte Lösung, löste ein zusätzliches Problem. Es stellte sich heraus, dass in Reihenfolge der Benutzung der Array-Initialisierungs Syntax eine temporäre Lokale Variable erstellt und anschließend in eine 'heap-allocated' Variable kopiert wurde. Ein unangenehmer Leistungserfolg (fast 400 Element-Array mit 16 - 24 Bytes pro Element (32 Bit, 64-Bit-Größen)), der notwendig war, weil jede andere Weise, solch eine massive Struktur zu schaffen, geradezu grotesk sein würde. Ich schrieb den Code um, um statische Klassenmitglieder und die Tatsache auszunutzen, dass sie noch mit der Array-Initialisierungsprogramm-Syntax deklariert werden können. Die Klasse wurde entworfen, um beerbbar zu sein und erforderte nahezu Null Veränderungen zum vorhandenen Code um einfach magisch die vorherige Liste (geschützte Mitglieder mit identischen Namen) zu ersetzen. Alles sah gut aus (und es war gut), bis ich es ausführte. Das Problem war, es stürzte ab. Sehr seltsam. Es stellte sich heraus, dass die globale Klasse die von der neuen Klasse erbte, erstellt wurde und versuchte die Funktionsliste zu verwenden, bevor diese Liste initialisiert wurde. In einer Anwendung, die globale Variablen nicht missbraucht, würde das nie geschehen. Das statische Mitglied würde initialisiert, bevor main() jemals aufgerufen wird, und alles wäre gut. Statische und globale Variablen werden in der Reihenfolge initialisiert in der auf sie getroffen wird. Ich hatte also eine 50-50 Chance, um Glück zu haben, aber ich hatte es nicht. So musste ich die Klasse umschreiben und verwandelte sie in einen Pseudocontainer, um von lokalen statischen Variablen Gebrauch machen zu können. Ich verbrachte viel Zeit, diese Klasse umzuschreiben. Erwähnte ich, dass sie Templates und Makros (zusammen) verwendet? Ja, es ist ein Durcheinander. Der Compiler meckert und du bekommst keine genaue Idee, worin der Fehler besteht, weil er sich über ein hinter einem Makro verborgenes Template-Problem beklagt. Ich schweife ab...

    Diese Geschichte schließt auch Aut2Exe ein. Offensichtlich wurde meine Klasse entworfen, um in Aut2Exe ebenso verwendet zu werden, eine einzelne Liste statt zwei Listen zur Verfügung zu stellen. Ich nahm die passenden Änderungen mit Aut2Exe vor, baute sie ein und versuchte es auszuführen. Und es stürzte ab. Dieses Mal betraf es nicht nur meinen Code. Nein, es stellt sich heraus, dass Aut2Exe genau das gleiche Problem hatte, bevor ich jemals darauf stieß. Seit Jahren hat Aut2Exe nur durch eine reine Chance gearbeitet. Ich hatte erwähnt, dass die Chance bei 50-50 liegt? Gut, Aut2Exe hat damit seit Jahren gelebt. Ich habe keine Idee, warum es sich plötzlich dafür entschied zu crashen, als ich an Teilen ohne Beziehung zum Code arbeitete. Es verwirrt mich, warum es entschied, heute Abend war die Nacht, in der es in der Hölle speisen wollte. Aber lieber heute Nacht, wenn das Problem noch frisch ist, als später, wenn ich es wieder vergessen hab.

    Das war nicht das erste Mal, dass das beides geschehen ist. Ich habe ziemlich viele globale Variablen von den verschiedenen Tools im Laufe der Jahre entfernt. Ich brauchte ungefähr 25 Minuten, um den Crash nachzuvollziehen, als er heute Abend erstmalig geschah. Es brauchte nur 25 Sekunden bis zum nächsten mal. Ich habe viel Erfahrung mit dem Debugger, der Sprache und mit dem Bug insbesondere, so verschwendete ich nicht Tage mit dem Versuch, es ausfindig zu machen. Ihr könnt nicht dieses Glück haben, wie auch immer. Dies ist ein sehr übler und raffinierter Fehler. Er kann leicht verhindert werden, indem man so wenig wie möglich Globale Variablen verwendet. Klassen definieren, die andere abhängige Objekte richtig als Parameter akzeptieren und Referenzen/Pointer dazu speichern führt zu viel weniger Kopfschmerzen als den bequemen Weg zu nehmen und gemeinsam nutzbare Objekte als Globale Variable zu verwenden. Nehmt euch Zeit, es von Anfang an richtig zu tun, und ihr werdet nicht Stunden verbringen, um bei einem seltsamen Crash einen Fehler zu beseitigen, der aus dem Nirgendwo erscheint, wenn ihr Veränderungen vornehmt, die ohne Beziehung zum Code sind.


    Die Quintessenz ist also: Vermeidet/Minimiert Globale Variablen. Hier mal Beispiele, wie man es machen kann:

    Spoiler anzeigen
    [autoit]


    ;===============================================================================
    ; EDIT: Punkt 1 gestrichen, wie die Diskussion ergeben hat, war dies schlicht unsinnig.
    ;===============================================================================

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

    ;============== 2. Vermeidung Globaler Variablen
    #cs
    Warum soll ich überhaupt Globale Variablen verwenden? Hier wird meist die Antwort kommen:
    'Damit ich den Inhalt in verschiedenen Funktionen nutzen/verändern kann.'
    Aber das läßt sich auch anders lösen:
    #ce

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

    Local $myVar = 0

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

    _PlusEins($myVar)
    ConsoleWrite('$myVar: ' & $myVar & @CRLF)

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

    ; im Funktionskopf muß nicht der identische Variablenname stehen, erleichtert aber das Lesen
    ; die Variable wird der Funktion 'ByRef' übergeben ==> sie kann somit von der Funktion verändert werden
    ; ohne 'ByRef' erfolgt die Übergabe immer 'ByVar', d.h. eine Kopie der Quellvariable wird erzeugt
    Func _PlusEins(ByRef $myVar)
    $myVar += 1 ; kein Return erforderlich, da die Variable in ihrer Quelle geändert wird
    EndFunc

    [/autoit]


    Sicher kann man sagen: 'Ist mir noch nie passiert, solch Trouble.' Nun halte ich eine 50-50 Chance zum Crash durchaus für eine Größe, die man nicht unter den Tisch kehren sollte. Und es ist wirklich kein großes Problem, sein Programmierverhalten anzupassen und somit diesem Stolperstein von vornherein aus dem Weg zu gehen.


    Edit:
    Danke für die geführte Diskussion :thumbup: - hat mir auch einige Punkte etwas näher gebracht und auch die Erkenntnis, dass mein Gedanke, mittels Enumeration von Indexvariablen ein Array zu addressieren, hierfür schlicht blödsinnig ist. :huh:

    Allen Lesern dieses Posts möchte ich naheliegen, das Schlußwort von AspirinJunkie unbedingt zu lesen.

  • Profifrage: _SendMessage/ControlSend verursachen systemlags

    • BugFix
    • 13. Juli 2010 um 20:45

    Warum verwendest du bei wParamType und lParamType statt wParam und lParam int und long ?

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™