- SF800 Solar Speicher Tutorial    Werbung      
Ergebnis 1 bis 10 von 19

Thema: Grundsatzfragen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.690
    Ich habe eine sehr interessante Lösungsstrategie gefunden.

    https://www.arduinoforum.de/arduino-...byte-Variablen

    Mit dieser UNION-Geschichte sollte es möglich sein, eine Kette an Bytes zu laden, um dann mit verschiedenen Datentypen, an verschiedenen Stellen in dieser Byte-Kette, zugreifen zu können.

    Da tun sich viele Möglichkeiten auf, was man mit UNION und Datentypen anstellen kann.




    MfG

  2. #2
    HaWe
    Gast
    ja, mit union mache ich es teilw. auch, wenn ich einen array of bytes habe, der verschiedene Datentypen enthält, allerdings mit eigenen Funktionen, die weniger kompliziert aussehen Bild  

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.690
    Muss man mal wissen, dass es so etwas gibt.
    Damit kann man char-Arrays an Methoden als string übergeben usw.
    Mehrere Datentypen für einen Speicherbereich.

  4. #4
    HaWe
    Gast
    Damit kann man char-Arrays an Methoden als string übergeben usw.
    ja, aber gerade bei cstring musst du beachten, dass sie immer aus
    char
    und nicht aus uint8_t bestehen:

    char str1[20];
    char* str2;

    und dass char in cstrings bei AVR kein byte und auch kein uint8_t (0..255) sondern ein signed char ist (-128..+127).
    Bei ARM/ESP hingegen ist die cstring-char unsigned, also quasi "wie ein byte".
    Aber auch wenn char hier unsigned sind, kann man dennoch nicht byte oder uint8_t arrays dafür einsetzen bzw. verwenden.

    Genau darauf wollte ich oben in meinen Posts #5 und #7 hinaus.

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.690
    Muss man drauf achten, was man tut.


    Habs jetzt mal so gemacht:

    Code:
    union xyzS{
                   uint8_t  byt[6];                //XYZ-Array: 3 Werte mit 16 Bit   
                   uint16_t val[3];
    }; 
    xyzS xyzSet;
    
    Zugriff:

    Code:
    f.read(xyzSet.byt,6);
    uint16_t ACX = xyzSet.val[0];
    uint16_t ACY = xyzSet.val[1];
    uint16_t ACZ = xyzSet.val[2];
    

    Geändert von Moppi (21.05.2019 um 04:20 Uhr) Grund: Änderung

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.690

    Funktionen üerladen, C++

    Ich hatte das Problem, mit unterschiedlichen Aufrufparametern / Datentypen einer Funktion.

    Jetzt kann man eine neue Funktion erstellen, normalerweise mit neuem Namen.
    Jetzt hatte ich aber, aus weit zurückliegender Vergangenheit C++ Kurs, eine Eingebung, dass da was mit den Parametern war, insbesondere im Zusammenhang mit Methoden.

    In C geht das nicht, dass man eine Funktion gleich benennt. Aber C++ erlaubt das - habe kurz gesucht und nachgelesen.

    bool udp_send(char* string)
    {
    }


    bool udp_send(String string)
    {
    }

    C++ wählt, je nach Datentyp in den Übergabeparametern, die passende Funktion aus.



    Der eigentliche Grund dafür:

    mit ist noch unklar, wie ich in C++ einen String, Typs "String" in ein String, Typs "char" umwandle.
    Und ob das überhaupt geht.

    Müsste aber, habe was dazu gefunden: https://www.arduino.cc/reference/en/...s/tochararray/
    Allerdings wird da der gesamte String als Kopie im Speicher abgelegt. Vermutlich passiert das Kopieren zur Laufzeit.
    Das ist weniger gefällig.


    MfG
    Geändert von Moppi (21.05.2019 um 07:09 Uhr)

  7. #7
    HaWe
    Gast
    Zitat Zitat von Moppi Beitrag anzeigen
    Der eigentliche Grund dafür:

    mit ist noch unklar, wie ich in C++ einen String, Typs "String" in ein String, Typs "char" umwandle.
    Und ob das überhaupt geht.

    Müsste aber, habe was dazu gefunden: https://www.arduino.cc/reference/en/...s/tochararray/
    Allerdings wird da der gesamte String als Kopie im Speicher abgelegt. Vermutlich passiert das Kopieren zur Laufzeit.
    Das ist weniger gefällig.


    MfG


    ja, du brauchst hier immer 2 verschiedene Variablen, da beide unabhängige Datentypen sind und nichts miteinander zu tun haben:

    einen cstring von passender Größe

    char cbuf[100];

    und einen
    String mString;

    du kannst jetzt den Inhalt von String mString auf char cbuf[] kopieren:

    mString.toCharArray(cbuf, 100);

    Ist die Länge von mString kürzer als die vom cstring, wird in cstring hinter das letzte mString-Zeichen eine Null '\0' gesetzt (ich weiß allerdings jetzt grade nicht, ob der Rest ebenfalls mit '\0' aufgefüllt wird oder undefiniert bleibt).

    - - - Aktualisiert - - -

    PS,
    es gbt noch eine 2. String-Methode, die einen Pointer auf den "reinen cstring-Inhalt" von String zurückliefert:

    mString.c_str()

    Ich habe das noch nicht benutzt, aber ich verstehe das so, dass du dann (z.B. für temporäre Zwecke) keinen extra cstring Buffer brauchst, z.B. direkt zur Verwendung in anderen C Funktionen, so als wäre es bereits selber ein cstring array. Vermutlich arbeitet die Methode genau wie beim großen Bruder, der C++ std::string class:
    http://www.cplusplus.com/reference/string/string/c_str/

Ähnliche Themen

  1. Wechsel von BASCOM zu GCC/Grundsatzfragen zu GCC
    Von stekohl im Forum C - Programmierung (GCC u.a.)
    Antworten: 8
    Letzter Beitrag: 10.12.2008, 23:13
  2. Grundsatzfragen zum LCD
    Von Goblin im Forum Elektronik
    Antworten: 12
    Letzter Beitrag: 02.02.2006, 21:16
  3. Probleme mit Counter ! Grundsatzfragen
    Von Roberto im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 15.01.2006, 23:38

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

    Werbung      12V Akku bauen