Hallo,

Zitat von
Mxt
Auf dem Raspi mit Arch mit g++ 5.3.0 das gleiche Bild wie mit Raspian.
Aber mit dem clang 3.7.1 und -std=c++14 wird ein 'ä' gar nicht mehr übersetzt. Das gibt jetzt ein
Es geht nur
L'ä' (Ausgabe "4 w" im obigen Testprogramm)
U'ä' (Ausgabe "4 Di")
u'ä' (Ausgabe "4 Ds")
Die Frage ist jetzt was es werden soll?
Eine Lösung ist, dass du einen Text-Editor nimmst, der reinen ASCII-Text erzeugt, bzw. deinen entsprechend einstellst (Kann schon am gewählten Zeichensatz liegen).
Du erzeugst mit dem Editor ein Textfile welches den Vorgaben des Betriebssystems folgt.
Nun hat aber dieses Betriebssystem oft gar nichts mit dem zu tun, was auf deinem µC vorhanden ist.
Die Motzerei des Compilers bezieht sich auf die Textdatei, welchem ihm gefüttert wird.
Die andere Möglichkeit ist, den Compiler so einzustellen, dass er mit Mehrbyte-Zeichen zurecht kommt, dann muss dies aber auch von der Laufzeitumgebung des µC unterstützt werden.
MfG Peter(TOO)
- - - Aktualisiert - - -
Hallo Geier,

Zitat von
oberallgeier
Peter, bitte gib dazu ein Beispiel. Denn ich bin a) reichlich unwissend und b) stehen solche fortgeschrittenen Beispiel ja leider (soweit ich es bisher sah) nicht im Manual. Und bisher stehen in meinem Definitions-Faulenzer (mydefs.h) nur Dinge wie
......typedef uint16_t u16; //typedef unsigned short u16;
und so.
Was für Beispiele willst du jetzt?
Bei mir stand da halt
typedef unsigned char uchar
Meinen Faulenzer hatte ich mit GoeDef.h bezeichnet.
Ein typisches Problem für die Portierbarkeit:
Code:
typedef struct
{
unsigned char c
unsigned int i;
} s_foo;
Ich gehe mal davon aus, dass char 8-Bit und int 16-Bit haben.
Manche CPUs können 16-Bit-Zugriffe nur auf gerade Adressen machen, weshalb der Compiler zwischen c und i noch ein Füllbyte einfügen muss. Kann man beim Compiler unter Alignement beeinflussen. Manche CPUs können auch auf ungeraden Adressen 16-Bit Zugriffe machen, brauchen dann aber 2 Speicherzyklen. Hier kann dann die Optimierung auf Geschwindigkeit das Füllbyte erzwingen.
Und bei int weiss man nicht ob da zuerst das Low-Byte oder das Hight-Byte abgelegt wird. Bei 32-Bit gibt's dann schon 4 Möglichkeiten (Endian).
Code:
typedef struct
{
unsigned char c
unsigned int i;
} s_foo;
s_foo var;
fwrite(&s_var, sizeof(s_foo), 1, file):
Scheint jetzt sehr einfach, aber da weiss jetzt keiner was wirklich geschrieben wird.
Je nach Füllbyte sind es 3 oder 4 Byte und wie der int dargestellt wird, weiss man auch nicht.
Eine sauber Lösung ist:
Code:
typedef struct
{
unsigned char c
unsigned int i;
} s_foo;
s_foo var;
unigned char buf[3];
buf[0] = var.c;
buf[1] = (var.c >> 8) & 0xFF;
buf[2] = (var.c ) & 0xFF;
fwrite(buf, sizeof(buf), 1, file):
Wolltest du so etwas?
MfG Peter(TOO)
Lesezeichen