- Akku Tests und Balkonkraftwerk Speicher    Werbung      
Ergebnis 1 bis 10 von 24

Thema: explizite Typumwandlung

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von Siro Beitrag anzeigen

    Code:
    void uart_putc(char c)
    {
        /* ....... */
    }
    
    void uart_send(void* data, unsigned int size)
    {
       while(size--)
          uart_putc(*(char*)data++);   /* hier gibt es das Problem */
    }
    Was mir hier nicht klar ist:

    wozu ist eine Funktion gut, die Daten vom Typ "weißnichtsogenau", und das ist void, in eine andere Funktion stopft, die nur mit chars umgehen kann. Sollte data mal auf ints oder floats zeigen, kommt etweder Müll raus, oder es crasht. Und die Verwendung von void-Pointern führt nur dazu, daß einem der Compiler nicht mehr helfen kann, Fehler zu vermeiden.

    Es muß also heißen: uart_send(char* data, ... , und in Zukunft für jeden void* 5€ in die Kaffekasse (oder ersatzweise eine schriftliche Begründung von mindestens einer Seite, warum so etwas aus Gründen der Programmlogik wirklich nötig ist )!

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    zu PicNick
    Sorry, ich muss mich korrigieren, deine Zeile

    p = (int*) ((int)p + 1);

    funktioniert wirklich. Erhöht den Zeiger um 1 und nicht um 4.
    Hast Du völlig recht.


    zu Klebwax:

    wie soll man denn sonst eine universelle function schreiben ?
    ich möchte verschiedene Datentypen, Strukturen und ähnliches
    senden. Das Casten übernimmt bei mir die Funktion, ich brauche mich darum
    nicht mehr zu kümmern. Ich übergebe nur noch die Adresse und die Anzahl Bytes.

    int xx;

    struct
    char a,b,c,d;
    int e,f,g;<
    } st;


    und zudem finde ich daß:

    uart_send(&xx,sizeof(xx));
    uart_send(&st,sizeof(st));

    besser aussieht als:

    uart_send((char*)&xx,sizeof(xx));
    uart_send((char*)&st,sizeof(st));

    aber das ist sicher Geschmackssache. Funktionieren tut natürlich beides. Was die Sicherheit angeht,
    denke ich mal, nehmen sich beide Varianten nichts.
    anbei meine 5,-- Euro... Bild  

    Habt noch ein schönes Wochenende.

    Siro

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von Siro Beitrag anzeigen
    wie soll man denn sonst eine universelle function schreiben ?
    ich möchte verschiedene Datentypen, Strukturen und ähnliches
    senden. Das Casten übernimmt bei mir die Funktion, ich brauche mich darum
    nicht mehr zu kümmern. Ich übergebe nur noch die Adresse und die Anzahl Bytes.

    int xx;

    struct
    char a,b,c,d;
    int e,f,g;<
    } st;


    und zudem finde ich daß:

    uart_send(&xx,sizeof(xx));
    uart_send(&st,sizeof(st));

    besser aussieht als:

    uart_send((char*)&xx,sizeof(xx));
    uart_send((char*)&st,sizeof(st));

    aber das ist sicher Geschmackssache. Funktionieren tut natürlich beides. Was die Sicherheit angeht,
    denke ich mal, nehmen sich beide Varianten nichts.
    anbei meine 5,-- Euro... Bild  
    Ich frag jetzt mal garnicht, ob du das ernst meinst. Was du willst, geht garnicht. Man kann weder ein Int noch eine Struktur einach so über die serielle Schnittstelle versenden. Dein Compiler hat schon gewußt, warum er deinen Code nicht bearbeiten wollte, und du ihn erst mit void* und casts mundtot machen musstest.

    Die 5€ kannst du behalten. Leg noch was drauf und kauf dir ein Buch über C und lerne. Und mach dir mal Gedanken über Strukturen, gepackt und ungepackt, auf verschiedenen CPUs mit 8 bis 64 Bit Wortbreite sowie Big und Little Endian und dann lerne was über robusten portablen Code und gewöhne dir einen solchen Stil an.


    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Ich muss hier sicher keine Rechenschaft ablegen, aber zu Klebwax:
    ich möchte die Bytes so herausschicken, wie sie im Speicher stehen.
    Ob sie gepackt sind oder im Intel oder Motorola Format vorliegen ist in MEINEM Falle völlig unwichtig,
    Das ist lediglich ein Hexdump den ich zu Testzwecken herausschicke um SOFTWAREFEHLER AUFZUDECKEN.
    Deshalb finde ich deine voreilige Beurteilung unberechtigt negativ, satt kreativ...

    Dein Satz:
    Was du willst, geht garnicht. Man kann weder ein Int noch eine Struktur einach so über die serielle Schnittstelle versenden.
    ist in meinem Falle eine Falschaussage, denn es funktioniert ja einwandfrei.
    Siro

  5. #5
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Offenbar sind noch ein paar Leute ohne einen Schimmer, wie man wirklich professionelle Funktionen schreibt
    z.B


    void * memcpy ( void * destination, const void * source, size_t num );Das sind schon mal 15 €
    http://www.cplusplus.com/reference/clibrary/cstring/memcpy

    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von PicNick Beitrag anzeigen
    Offenbar sind noch ein paar Leute ohne einen Schimmer, wie man wirklich professionelle Funktionen schreibt
    z.B


    void * memcpy ( void * destination, const void * source, size_t num );Das sind schon mal 15 €
    http://www.cplusplus.com/reference/clibrary/cstring/memcpy

    Warum hast du dann nicht auch gleich das zweite Beispiel von Funktionen, für die soetwas wie ein void-Pointer überhaupt erfunden wurde, genannt: die Gruppe der Memory-Management-Funktionen. Die mehr als einseitige Begründung, wozu man so etwas braucht, findest du in der gängigen C-Literatur. Des gleichen findest du dort aber dort auch die Diskussionen, das eine richtige Programmiersprache Pointer, egal welcher Art, überhaupt nicht zulassen sollte. Offensichtlich haben Leute wie Wirth den Programmierern nicht zugetraut, vernüftig mit dem Instrument Pointer umzugehen.

    Um aber bei "professionelle Funktionen" zu bleiben, glaubst du ernsthaft, so etwas wie das beschriebene uart_send() würde einem professionellen Code Review standhalten ? Wie verhält sich die Funktion, bei verschiedenen Compileroptimierungen oder auch verschieden Compilern, wie auf CPUs mit unterschiedlichen Wortbreiten, wie auf einer CPU mit anderen Alignment-Regeln, und wie bei Big oder Little Endian Rechnern?

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zum Thema void pointer hier ein Ausschnitt von learncpp.com: (hervorhebungen von mir)
    In general, it is a good idea to avoid using void pointers unless absolutely necessary, as they effectively allow you to avoid type checking. This allows you to inadvertently do things that make no sense, and the compiler won’t complain about it.

    .....

    However, very occasionally, you may still find a reasonable use for the void pointer. Just make sure there isn’t a better (safer) way to do the same thing using other language mechanisms first!
    Statt "Just make sure" hab ich gesagt, schreib eine ausführliche Begründung oder zahl in die Kaffekasse.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

Berechtigungen

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

    Werbung      fchao-Sinus-Wechselrichter AliExpress