Forum: Compiler & IDEs Eclipse / Gcc Problem : Multiple markers at this line


von Boris (Gast)


Lesenswert?

Hallo liebe Profis, ich stecke ein bisschen fest:

ich möchte in einem String die Sonderzeichen ersetzten.
Das hat auch bei Studio4 Winavr gut funktioniert doch in Eclipse bekomme 
ich folgende Meldung:

Multiple markers at this line
  - multi-character character constant [-Wmultichar]
  - case label value is less than minimum value for type [enabled by
   default]

wenn ich dort schreibe:

switch (c) //sucht nach Sonderzeichen und ersetzt diese
  {
    case 'ä': //ü wird ersetzt duch 0xE1
      c = 0xE4;
      break;

Die selbe Meldung bekomme ich bei:

if (c=='ä'){}

Ist vermutlich eine Einstellung im GCC-Compiler ?

von Peter II (Gast)


Lesenswert?

Boris schrieb:
> Ist vermutlich eine Einstellung im GCC-Compiler ?

'ä' ist kein normales ACCII Zeichen, quellcode sollte aber nur ASCII 
enthalten. Im schlimmsten fall speichert er den Quellcode sogar als UTF8 
- was auch nicht zulässig ist.

schreibe einfach den hex code hin, der bei dir dem 'ä' entspricht.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das 'ä' ist das Problem. Dein Editor verwendet als Zeichencodierung 
UTF-8, damit ist das nicht ein einzelnes Byte, sondern zwei.

Daß das 'ä' kein ASCII-Zeichen ist, ist nicht das eigentliche Problem; 
würde der Editor beispielsweise in CP1252 (auch Windows-ANSI genannt, 
alternativ ist auch ISO8859-1 oder "Latin 1" zulässig) codieren, wäre 
das 'ä' nur ein einzelnes Byte, und dann ist es als Zeichenkonstante 
zulässig.

Das ist keine Compilereinstellung, sondern eine des Editors, also von 
Eclipse.

von Boris H. (Firma: omfbv) (hightech75)


Lesenswert?

Du meinst sowas wie

case 0xFC: c=0xE2 ?

Ist halt umständlich

ich ab ja Texte in der Form wie
char room [][11]={"","Büro   ","Diele     ","Küche    "};

Wie bekomme ich da Umlaute rein die ich dann an das Display senden kann 
?

von Peter II (Gast)


Lesenswert?

Boris Hightech schrieb:
> Wie bekomme ich da Umlaute rein die ich dann an das Display senden kann
> ?

das kommt auch auf den Display an, ob es direkt dem Zeichensatz vom PC 
entspricht.

char room [][11]={"","B\x12ro   ","Diele     ","K\x34che    "};

von Boris H. (Firma: omfbv) (hightech75)


Lesenswert?

Rufus Τ. Firefly schrieb:

> Das ist keine Compilereinstellung, sondern eine des Editors, also von
> Eclipse.

Achso, denn schau ich mal in den Editor-Einstellungen.
Das erklärt auch die Meldung mit dem "multi" und das im Diplay 2 
Hiroglyphen stehen.

von Boris H. (Firma: omfbv) (hightech75)


Lesenswert?

Danke an alle,
wenn ich die Codierung auf ISO-8859-1 umstelle funktioniert das wie 
gewünscht !

von Markierer (Gast)


Lesenswert?

Hab hier das gleiche Problem.

Das hier liegt in der Datei in der main liegt und funktioniert:
1
  int s;
2
  for (s = 0; s < 101; s++) {
3
      myGLCD.drawPixel(0,0);
4
  };


Das hier liegt in einer neu angelegten Datei sevenseg.cpp
1
extern UTFT myGLCD;
2
3
 .
4
 .
5
 .
6
7
int i;
8
for (i = 0; i < 101; i++) {
9
    myGLCD.drawPixel(0,0);
10
};
und bringt schon vor dem compilieren in der Zeile:
for (i = 0; i < 101; i++) {
Multipe markers at this line
 -Syntax error
 -Syntax error
 -Syntax error

Außerdem bekomme ich:
Unused declaration of variable 'myGLCD'  sevenseg.cpp  /Test_7_7_seg 
line 5  Code Analysis Problem

Irgendwie die Datei nicht richtig hinzugefügt?

von Peter II (Gast)


Lesenswert?

Markierer schrieb:
> Das hier liegt in einer neu angelegten Datei sevenseg.cppextern UTFT
> myGLCD;
>
>  .
>  .
>  .
>
> int i;
> for (i = 0; i < 101; i++) {
>     myGLCD.drawPixel(0,0);
> };

naja das sollte schon in einer Funktion stehen und nicht einfach so in 
der Datei.

von Markierer (Gast)


Lesenswert?

Hihi. Jaa.. wenn man es gleich richtig macht, dann funktioniert's auch.

Wenn man nicht konzentriert ist sollte man die Finger vom Rechner 
lassen...

von Rolf M. (rmagnus)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Das 'ä' ist das Problem. Dein Editor verwendet als Zeichencodierung
> UTF-8, damit ist das nicht ein einzelnes Byte, sondern zwei.
>
> Daß das 'ä' kein ASCII-Zeichen ist, ist nicht das eigentliche Problem;
> würde der Editor beispielsweise in CP1252 (auch Windows-ANSI genannt,
> alternativ ist auch ISO8859-1 oder "Latin 1" zulässig) codieren, wäre
> das 'ä' nur ein einzelnes Byte, und dann ist es als Zeichenkonstante
> zulässig.
>
> Das ist keine Compilereinstellung, sondern eine des Editors, also von
> Eclipse.

Naja, das stimmt nicht ganz. Es gibt nämlich in C eine Unterscheidung 
zwischen dem "source character set" und dem "execution characer set". 
Die dürfen durchaus unterschiedlich sein, und der Compiler kann zwischen 
denen konvertieren. Das heißt, selbst wenn das 'ä' in der 
Zeichenkonstante im Quellcode aus zwei Bytes besteht, muss es das nicht 
zwangsläufig auch im generierten Code tun. gcc bietet 
Kommandozeilenparameter zur Angabe beider Zeichensätze, nämlich 
-fexec-charset und -finput-charset. Tatsächlich geht gcc per Default 
sogar von UTF-8 für beide Zeichensätze aus.
Aus der manpage:
1
      -fexec-charset=charset
2
           Set the execution character set, used for string and character constants.
3
           The default is UTF-8.  charset can be any encoding supported by the
4
           system's "iconv" library routine.
5
6
       -fwide-exec-charset=charset
7
           Set the wide execution character set, used for wide string and character
8
           constants.  The default is UTF-32 or UTF-16, whichever corresponds to the
9
           width of "wchar_t".  As with -fexec-charset, charset can be any encoding
10
           supported by the system's "iconv" library routine; however, you will have
11
           problems with encodings that do not fit exactly in "wchar_t".
12
13
       -finput-charset=charset
14
           Set the input character set, used for translation from the character set
15
           of the input file to the source character set used by GCC.  If the locale
16
           does not specify, or GCC cannot get this information from the locale, the
17
           default is UTF-8.  This can be overridden by either the locale or this
18
           command line option.  Currently the command line option takes precedence
19
           if there's a conflict.  charset can be any encoding supported by the
20
           system's "iconv" library routine.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Wenn der Compiler für beide Zeichensätze UTF-8 verwendet, ist aber 'ä' 
kein mit char darstellbares Zeichen.

In einem switch-Statement sollte es sich dann zwar verwenden lassen, das 
Resultat aber ist nicht hilfreich.

von Rolf M. (rmagnus)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Wenn der Compiler für beide Zeichensätze UTF-8 verwendet, ist aber 'ä'
> kein mit char darstellbares Zeichen.

Nicht mit einem einzelnen char, richtig. Man kann aber das input-charset 
durchaus auf UTF-8 lassen und nur das execution-charset auf z.B. 
ISO-8859-1 einstellen.
Es scheint, als ob gcc, wenn beide Encodings gleich sind, diese nicht 
näher untersucht und einfach durchreicht. Nur deshalb funktioniert das 
im Compiler fehelrfrei, wenn man das Quellfile als iso-8859-1 
abspeichert und gcc aber trotzdem im Glauben läßt, das sei utf-8. Denn 
z.B. der Code für das iso-8859-1-Zeichen À wäre in UTF-8 das erste Byte 
eines Multibyte-Zeichens, und wenn dann das dazugehörige nächste Byte 
fehlt, müßte es eigentlich eine Fehlermeldung wegen einer defekten 
Multibyte-Sequenz geben. Mein Test hat ergeben, daß das aber nicht der 
Fall ist.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.