Forum: Mikrocontroller und Digitale Elektronik warning: differ in signedness, -fsigned-char


von warning destroyer (Gast)


Lesenswert?

moinmoin,
ich möchte ein C Projekt gern kompilieren, bekomme dabei allerdings 
einige warnings der art:  ../screen.c:70: warning: pointer targets in 
passing argument 3 of 'lcd_put_string_P' differ in signedness

Ich vermute, das liegt an der compileroption -fsigned-char, die für alle 
files aufgeführt ist. Ich kann sie im AVR Studio aus den Projekt jedoch 
leider nicht rauslöschen. auf remove klicken sorgt kurz dafür, dass sie 
gelöscht wird, beim nächsten aufruf der Projektoptionen ist sie aber 
wieder da

hat da jemand 'nen tip für mich, wie ich die rausbekomme? funktionieren 
tut es zwar auch trotz der warnung, aber ich möcht nicht immer schauen, 
ob sich unter den warnings nicht vielleicht doch noch 'ne böse versteckt 
hat.

Vielen Dank,
Martin

von johnny.m (Gast)


Lesenswert?

Haste mal in dem Dialog "General" (da wo man auch die Taktfrequenz, 
Optimierung usw. angibt) ein Häkchen bei "Unsigned chars 
(-funsigned-char)" gemacht? Afaik muss immer eine der beiden Optionen 
angegeben sein.

von warning destroyer (Gast)


Lesenswert?

hab ich versucht, hat mich aber leider auch nicht weitergebracht, die 
warnings bleiben.
Ich hab hier ein (fremdes) Projekt, indem weder -funsigned-char noch 
-fsigned-char in den optionen stehen, sonst werd ich gleich mal 
versuchen, das zu kopieren und den quelltext einzufügen, aber das ist 
nicht unbedingt die lösung, die ich auf dauer bevorzuge, ich würd gern 
verstehen, warum das nicht klappt...

von johnny.m (Gast)


Lesenswert?

Dann wirst Du wohl das Programm mal durchsehen müssen und schauen, dass 
Zeichen, die ausgegeben werden sollen, als char und nicht als unsigned 
char deklariert sind. Ich vermute, Du hast halt eine Mischung aus 
beiden...

von Joe (Gast)


Lesenswert?

laß mich raten ;-)) der neue AVR GCC ;-)) Du ließt strings aus dem ROM 
mit unsigned char obwohl es const char sein sollte.

Der aktuelle GCC meckert das an.

von warning destroyer (Gast)


Lesenswert?

1
// definition der messages:
2
static const uint8_t msg_waiting[] PROGMEM = "Waiting for input";
3
4
5
//die funktion:
6
uint8_t lcd_put_string_P( uint8_t  left, uint8_t top, PGM_P string) 
7
{
8
 uint8_t i;
9
 uint8_t endpos;
10
 uint8_t ch;
11
12
 endpos = left;
13
 i = 0;
14
 ch = pgm_read_byte(&string[i]);
15
 while(ch)
16
 {
17
   endpos = lcd_put_char(endpos, top, ch);
18
   i++;
19
   ch = pgm_read_byte(&string[i]);
20
 }
21
return(endpos);
22
}
23
24
25
//der aufruf
26
lcd_put_string_P(12, 25, msg_waiting);
was müsste da geändert werden, damit die warnings verschwinden? ist 
PGM_P ein "normaler" datentyp? ich hab ihn nämlich noch nicht gesehen, 
hab aber auch die definition dessen gerade noch nicht gefunden.



von johnny.m (Gast)


Lesenswert?

> ist PGM_P ein "normaler" datentyp?
Es ist zumindest kein Standard-Datentyp, sondern vermutlich irgendein 
anwendungsspezifischer. Ersetze mal in der Definition der Message das 
"uint8_t" durch "char".

von Joe (Gast)


Lesenswert?

Besser noch const char.

von johnny.m (Gast)


Lesenswert?

@Joe:
Das "const" steht doch schon da...

von Joe (Gast)


Lesenswert?

In der Funktion ? hab ich Tomaten aufn Augen ?!?

Beispiel:
1
void lcd_puts (const char *lcd_string)  {
2
  while (*lcd_string)  {
3
    lcd_char (*lcd_string++);  // string an LCD Ausgabe
4
  }
5
}

nu kannste
1
lcd_puts ("WIN_AVR GCC");

  

von warning destroyer (Gast)


Lesenswert?

ich bin nun auch schlauer geworden, wo das PGM_P herkommt.
In der <avr/pgmspace.h> lässt sich der folgende Eintrag finden:

typedef char prog_char PROGMEM;

#ifndef PGM_P
#define PGM_P const prog_char *
#endif

ein ändern des uint8_t in char hat die warnings wegbekommen. Vielen Dank 
für eure Hilfe und einen schönen Abend noch.

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.