char und int_8t nicht das selbe?

OP #4004146
Lesenswert?
• ▲
▼
Hallo

ich dachte immer char und int_8t wäre das selbe.
Dieses C Programm zeigt mir gerade, dass es wohl nicht so ist^^

Ich habe ein Programm welches über die Serie Schnittstelle Daten an 
meinen Controller sendet. Allerdings scheint dieses Programm Probleme 
mit Sonderzeichen zu haben.
Statt ü sendet es die Zahl 195 anschließend 188.
Statt ü sendet es die Zahl 195 anschließend 159.

Das unten stehende Programm funktioniert so. Es passt diesen Fehler 
entsprechend an.

Schreibe ich allerdings statt
char empfangen =0;
das hier
int_8t empfangen =0;
funktioniert meine Auswertung nicht mehr.
Die Zeichen 195 und 188 bzw 159 werden aber trotzdem in mein Array
empfangspuffer übertragen.

Wie kann das sein?
1
ISR(USARTC1_RXC_vect)
2
{  
3
  char empfangen =0;
4
  empfangen = USARTC1.DATA;
5
  
6
  if (paket_wird_empfangen ==1)
7
  {
8
    if (empfangen == '$') //36Wenn das Schlusszeichen $ empfangen wurde
9
    {
10
      paket_empfangen =1;
11
      paket_wird_empfangen =0;
12
    }
13
    else
14
    {
15
      if(empfangen!= 195) //Anfangszeichen für Sonderzeichen nicht werten
16
      {
17
        //Sonderzeichen anpassen
18
        if(empfangen ==188) empfangen ='ü';
19
        if(empfangen ==159) empfangen ='ß';
20
        
21
        empfangspuffer[empfangspuffer_zaehler] = empfangen; 
22
        empfangspuffer_zaehler++;
23
      }
24
      
25
    }
26
  }
27
  
28
  if (empfangen == '#')  //35 =#
29
  {
30
    paket_wird_empfangen =1;
31
  }
32
  
33
}
Gast #4004148
Lesenswert?
• ▲
▼
Matthias Frank schrieb:
> ich dachte immer char und int_8t wäre das selbe.

char != int_8t != uint8_t

wobei man abhängig vom Compiler ist ob ein char singed oder unsigend 
ist. Dazu kommt jetzt noch das Problem mit der Codepage. Ü ist nicht 
überall gleich. Sinnvoll ist es hierfür gleich den passende int wert zu 
verwenden.
Gast #4004166
Lesenswert?
• ▲
▼
For gcc, the default is signed, but you can modify that with 
-funsigned-char. note: for gcc in Android NDK, the default is unsigned. 
You can also explicitly ask for signed characters with -fsigned-char.

On MSVC, the default is signed but you can modify that with /J.
#4004192
Lesenswert?
• ▲
▼
Kann dein Compiler keine Warnungen? Bei mir kommt:
1
main.c:46:40: error: character too large for enclosing character literal type
2
        if(empfangen ==188) empfangen ='ü';
3
                                       ^
4
main.c:47:40: error: character too large for enclosing character literal type
5
        if(empfangen ==159) empfangen ='ß';
6
                                       ^
7
main.c:43:17: warning: comparison of constant 195 with expression of type 'char' is always true
8
      [-Wtautological-constant-out-of-range-compare]
9
    if(empfangen!= 195) //Anfangszeichen für Sonderzeichen nicht werten
10
       ~~~~~~~~~^  ~~~
11
main.c:46:22: warning: comparison of constant 188 with expression of type 'char' is always false
12
      [-Wtautological-constant-out-of-range-compare]
13
        if(empfangen ==188) empfangen ='ü';
14
           ~~~~~~~~~ ^ ~~~
15
main.c:47:22: warning: comparison of constant 159 with expression of type 'char' is always false
16
      [-Wtautological-constant-out-of-range-compare]
17
        if(empfangen ==159) empfangen ='ß';

Warnungen sind nicht zum Spaß da.
#4004208
Lesenswert?
• ▲
▼
Matthias Frank schrieb:
> ich dachte immer char und int_8t wäre das selbe.

Kann so sein, muß aber nicht.

Ein Ärgernis (IMHO) bei C ist, daß die Standard-Datentypen so schwammig 
definiert sind:

char - kann ein Zeichen halten
int - Ganzzahl-Typ mit (ca.) der Bitbreite der CPU

Weil man für viele Anwendungen aber Typen mit genau bekannter Bitbreite 
und signedness (ist bei char z.B. unbestimmt) braucht, hat man mit C99 
das System-Headerfile stdint.h [1] eingeführt, das Integertypen mit 
vorhersagbarer Bitbreite und Signedness definiert.

[1] https://en.wikibooks.org/wiki/C_Programming/C_Reference/stdint.h

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.