www.mikrocontroller.net

Forum: Compiler & IDEs Typenkonvertierung


Autor: Klaus Me (meinzinet)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo wer kann mir helfen:

Ich möchte eine Funktion aufrufen die einen Parameter mit dem Typ frmt_t 
erwartet, aber übergeben möchte ich den Typ uint8_t (ein Byte)

Beide typen sind genau 1 Byte groß nur eben unterschiedliche Typen
Wie kann ich sowas bewerkstelligen?

also ZB

typedef struct
{
  uint8_t comma   : 2;
  uint8_t rundung : 2;
  uint8_t sign    : 3;
  uint8_t rest    : 1;
} frmt_t;

void var2str(frmt_t varx)
{
  if(varx.comma == 1) ......usw

}

void aufruf(const char *pgmstrg)
{
  uint8_t frmt= pgm_read_byte(pgmstrg
  var2strg(*(frmt_t *)&frmt); // der Aufruf funktioniert
  var2strg(0x10);  // Hier jedoch  error: conversion to non-scalar type 
requested
}

Autor: Michael K. (kichi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du es schonmal mit einer zusätzlichen Union versucht? Also ein Char 
und dein Struct innerhalb der Union...

Autor: Luther Blissett (luther-blissett)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Konversionen zwischen skalaren und nicht-skalaren sind ein 
Wartungs-Risiko, weil der skalar eine binär-Repränsentation des 
nicht-skalaren darstellen muss und diese Verknüpfung ziemlich locker in 
einem cast drinsteckt. Wenn du aber trotzdem willst, kannst du diese 
Makros benutzten (gcc-spezifisch):
#define static_assert(X) {char __p__[(X)-1];}
#define reinterpret(T,V) ({union{T a; typeof(V) b;} __x__; static_assert(sizeof(T)==sizeof(V)); __x__.b=(V); __x__.a; })

...
val2strg(reinterpret(frmt_t,(uint8_t)0x10));


Das static_assert dient dazu sicherzustellen, daß der Wert, denn du an 
reinterpret() übergibst, die gleiche Größe wie der Typ hat in den du 
umwandeln willst (0x10 ist ein int!) und nicht etwas etwas abgeschnitten 
wird.

Autor: Klaus Me (meinzinet)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Makros

Habs schon ausprobiert, es funktioniert prima!!

Keine Ahnung was die makros genau machen, aber es geht.

static assert versteh ich noch, wird zur compile zeit abgefragt ob die 
Datentypen gleich groß sind.
Nachdem was ich jetzt so nachgeschlagen habe wird durch union erreicht, 
dass beide Datentypen den gleichenspeicherberreich haben.
Nur wie der Compiler das ganze bei einem Funktionaufruf einfach schluckt 
:-( ??

Trotzdem vielen Dank, hat mir sehr geholfen

Autor: Michael K. (kichi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Me wrote:
> Nachdem was ich jetzt so nachgeschlagen habe wird durch union erreicht,
> dass beide Datentypen den gleichenspeicherberreich haben.
> Nur wie der Compiler das ganze bei einem Funktionaufruf einfach schluckt
> :-( ??

Wenn du es richtig machst ist das kein Problem... Du kannst entweder mit 
Zeigern arbeiten oder direkt eine der Komponenten übergeben - je nachdem 
was dir lieber ist.

Typenkonvertierung ist eine der Hauptanwendungen von Unions.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Typenkonvertierung ist eine der Hauptanwendungen von Unions.

Eigentlich nicht. Sie werden nur sehr häufig dazu mißbraucht. Für 
Typkonvertierungen sind eigentlich die Casts da.

Autor: Luther Blissett (luther-blissett)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Me wrote:

> Keine Ahnung was die makros genau machen, aber es geht.

GCC hat ein paar Erweiterungen, die einem definitiv das Leben leichter 
machen. Für details:

http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Statem...
http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Typeof.html

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.