An Fkt. übergebenen Parameter auf 2 Bytes splitten

  • Hallo,
    ich habe folgende Funktion:

    Code
    void controlLEDs(byte shiftRegisterData_1, byte shiftRegisterData_2)
    {
      shiftOut(dataPin, clockPin, shiftRegisterData_1);  
      shiftOut(dataPin, clockPin, shiftRegisterData_2);  
    }

    Dieser werden 2 Bytes übergeben, da "shiftOut" eine Variable vom Typ Byte als 3. Parameter erwartet.
    Nun möchte ich aber die Funktion "controlLEDs" so umbauen, dass sie nur einen Parameter hat, der die 2 Bytes beinhaltet.
    Also z.B:

    Code
    controlLEDs("1100110011001100")

    Aber wie soll ich nun den übergebenen String auf 2 Bytes aufteilen, um diese an "shiftOut" weiterzugeben?

    [autoit]


    Func Ulam($n)
    Return 1
    EndFunc

    [/autoit]


    Rekursion FTW :D

    Einmal editiert, zuletzt von Nathax (17. Juni 2012 um 20:16)

  • Meinst du sowas?:

    Spoiler anzeigen
    [autoit]

    Global $s_String = "1100110011001100"

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

    $d_a = _BinToDec(StringLeft($s_String, 8))
    $d_b = _BinToDec(StringRight($s_String, 8))

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

    MsgBox(0, "", $d_a & @CRLF & $d_b)

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

    Func _BinToDec($s_BinZahl)
    Local $d_Ret = 0
    For $x = 0 To StringLen($s_BinZahl)
    If Int(StringRight(StringTrimRight($s_BinZahl, $x), 1)) Then $d_Ret += 2^$x
    Next
    Return $d_Ret
    EndFunc

    [/autoit]

    Edit: Jetzt sehe ich dass wir hier im C++ Forum sind...
    Nun du übergibst einen String welcher die Binärdarstellungen der zusammengefügten Byte-Werte enthält.
    Du musst also den String splitten (je nach dem ob du einen C++ String als Datentyp verwendest oder die C-char-Arrays musst du mal im Netz die Stringfunktionen dazu durchstöbern).
    Aus der String-Binärdarstellung musst du dann, ähnlich wie in eben gezeigter AutoIt-Funktion, deinen Byte-Wert casten.

    Einmal editiert, zuletzt von AspirinJunkie (17. Juni 2012 um 19:49)

  • dass sie nur einen Parameter hat, der die 2 Bytes beinhaltet.

    wenn es nur darum geht, dass aus 2 Parametern einer wird, dann mach doch eine Struktur:

    Code
    struct RegisterData {
      byte value1;
      byte value2;
    };
    
    
    void controlLEDs(RegisterData reg) {
      shiftOut(dataPin, clockPin, reg.value1);  
      shiftOut(dataPin, clockPin, reg.value2);  
    }

    "Je mehr Käse, desto mehr Löcher; je mehr Löcher, desto weniger Käse. Ergo: Je mehr Käse, desto weniger Käse. 8| "
    "Programmers never die: they just GOSUB without RETURN"
    "I tried to change the world but I couldn't find the source code."

  • AspirinJunkie Leider nicht. Ich möchte keine 2 dezimalen sondern binäre Variablen.

    Developer30: Es geht ja darum, dass ich der übersichtshalber einen Parameter haben möchte. Wie übergebe ich denn bei deiner Variante den Parameter?

    [autoit]


    Func Ulam($n)
    Return 1
    EndFunc

    [/autoit]


    Rekursion FTW :D

  • Ein Byte mit der Bitfolge 11001100 ist das gleiche wie ein 8-Bit unsigned Integer mit dem Wert 204.
    Die beschriebene Umwandlung in einen Integer entspricht also der Umwandlung in den Datentyp byte (solange der Integer unsigned und 8 Bit groß ist).
    Würdest du die Variable $d_a also z.B. per DllCall als byte deklarieren und an eine Funktion übergeben ist es genau das was du haben wolltest.

    Das eigentlich Umständliche hier ist allerdings von der String-Binärdarstellung in einen Integertyp zu casten.

  • Die Umwandlung vom String in einen Zahlenwert gehört in eine extra Funktion finde ich. Wenn du die Parameterzahl reduzieren willst, wäre evtl. ein 16bit-Integer geeignet:

    Code
    void controlLEDs(unsigned short data) // e.g. 0xABCD
    {
      shiftOut(dataPin, clockPin, 0xFF & (data >> 8));  // 0xAB
      shiftOut(dataPin, clockPin, 0xFF & (data));   // 0xCD
    }
  • So schlimm ist das mit zwei Parametern doch nicht.
    Wenn du aber unbedingt einen haben willst, würde ich das so machen:

    Spoiler anzeigen

    Dann hast du das Object RegisterData. Du kannst auf die beiden Bytes gemeinsam zugreifen (als 16-bit integer) oder einzeln.
    Desweitern hast du mehrere Konstruktoren, sodass du zum Erzeugen eines neuen Objektes

    Code
    RegisterData variablenname(byte_1, byte_2)


    oder

    Code
    RegisterData variablenname(16_bit_variable)


    schreiben kannst und die Bytes bei Verwendung keines Konstruktors automatisch auf 0 gesetzt werden.

  • Ok, aber deine Methode funktioniert leider nicht, progandy.
    Ich mache es wie folgt:

    Code
    controlLEDs(0000011111100000);
    
    
    void controlLEDs(unsigned short data)
    {
      shiftOut(dataPin, clockPin, 0xFF & (data >> 8));  
      shiftOut(dataPin, clockPin, 0xFF & (data));  
    }

    Was ist da falsch?

    [autoit]


    Func Ulam($n)
    Return 1
    EndFunc

    [/autoit]


    Rekursion FTW :D

  • controlLEDs(0000011111100000);

    probiers mal so:

    Code
    controlLEDs(0b0000011111100000);

    Edit:

    Du kannst integer nicht binär schreiben. Verwende Hexadezimal.

    warum soll das nicht gehen? wenn man 0x00 kann man doch genauso gut 0b0000 schreiben..?!

    "Je mehr Käse, desto mehr Löcher; je mehr Löcher, desto weniger Käse. Ergo: Je mehr Käse, desto weniger Käse. 8| "
    "Programmers never die: they just GOSUB without RETURN"
    "I tried to change the world but I couldn't find the source code."

  • Marthog Mit Hexadezimal habe ich das Problem bereits gelöst, aber ich wollte ja eine übersichtlichere Binär-Lösung, deswegen auch der Thread.

    Developer30 Ok, so gehts. Kann ich die 0b noch so in die Fkt. verlagern, dass sie nicht im Parameter auftaucht?

    [autoit]


    Func Ulam($n)
    Return 1
    EndFunc

    [/autoit]


    Rekursion FTW :D

  • Kann ich die 0b noch so in die Fkt. verlagern, dass sie nicht im Parameter auftaucht?

    nicht ohne einen String zu benutzen, was allerdings wesentlich umständlicher wäre. Übrigens muss 0b ja nicht umbedingt im Parameter auftauchen.. du kannst die Zahl direkt dezimal hinschreiben, dann taucht kein 0b auf, aber leserlich wär das dann auch nicht mehr...

    "Je mehr Käse, desto mehr Löcher; je mehr Löcher, desto weniger Käse. Ergo: Je mehr Käse, desto weniger Käse. 8| "
    "Programmers never die: they just GOSUB without RETURN"
    "I tried to change the world but I couldn't find the source code."