Forum: Mikrocontroller und Digitale Elektronik array subscript has type 'char'


von Werner (Gast)


Lesenswert?

Hallo,

auch wenn es nur eine Warnung ist,
"array subscript has type 'char'"

Wie bekomme ich das am besten weg.
1
const char array[256][9] PROGMEM={
2
  {0x08,0x7E,0x81,0xA9,0x8D,0x8D,0xA9,0x81,0x7E},  // 0x01
3
  {0x08,0x7E,0xFF,0xD7,0xF3,0xF3,0xD7,0xFF,0x7E},  // 0x02
4
  {0x08,0x70,0xF8,0xFC,0x7E,0xFC,0xF8,0x70,0x00},  // 0x03
5
};
6
7
uint16_t func(char *s)
8
{
9
  uint16_t width = 0;
10
  uint16_t i = 0;
11
  while(i < strlen(s))
12
  {
13
    width += (int16_t)pgm_read_byte(&array[s[i]][0]);
14
    i++;
15
  }
16
  return width + (i-1);
17
}

von Klaus W. (mfgkw)


Lesenswert?

Indem du stattdessen unsigned char nimmst?

Das Problem mit char ist nämlich, daß es (je nach Umgebung) auch negativ 
sein kann, was bei einem Arrayindex in aller Regel eher unerwünscht ist.

von Peter II (Gast)


Lesenswert?

> width += (int16_t)pgm_read_byte(&array[s[i]][0]);

der cast ist unnötig

von Werner (Gast)


Lesenswert?

Mit "unsigned char" kommt der fehler auch. Erst wenn ich darauf einen 
uint8_t, was eigentlich gleichbedeutend mit "unsigned char" sein müsste, 
geht es.

von Karl H. (kbuchegg)


Lesenswert?

Welcher Compiler ist das?

von PittyJ (Gast)


Lesenswert?

Früher konnte man noch einfach s[i] in ein unsigned int casten.
Da gab es noch richtige Klammern dafür.

Früher war alles besser.
Und Lochkarten gab es da auch.

von Werner (Gast)


Lesenswert?

AVR/GNU C Compiler : 4.8.1

Aktuelles Atmel Studio (Version: 6.2.1502 - Service Pack 1)Atmel Studio 
6 (Version: 6.2.1502 - Service Pack 1)

von Karl H. (kbuchegg)


Lesenswert?

Werner schrieb:
> AVR/GNU C Compiler : 4.8.1
>
> Aktuelles Atmel Studio (Version: 6.2.1502 - Service Pack 1)Atmel Studio
> 6 (Version: 6.2.1502 - Service Pack 1)


Interessant.

> Mit "unsigned char" kommt der fehler auch.

Ok. Was hast du wie, exakt, geändert.

von Werner (Gast)


Lesenswert?

Was ich versucht habe ist
(Nur die geänderten Zeilen
1
const char array[256][9] PROGMEM={
2
width += pgm_read_byte(&font_bold[s[i]][0]);
array subscript has type 'char'
1
const unsigned char array[256][9] PROGMEM={
2
width += pgm_read_byte(&font_bold[s[i]][0]);
array subscript has type 'char'
1
const uint8_t array[256][9] PROGMEM={
2
width += pgm_read_byte(&font_bold[s[i]][0]);
array subscript has type 'char'
1
const uint8_t array[256][9] PROGMEM={
2
width += pgm_read_byte(&font_bold[(uint8_t)s[i]][0]); // Tipp Pitty
geht
1
const char array[256][9] PROGMEM={
2
width += pgm_read_byte(&font_bold[(uint8_t)s[i]][0]); // Tipp Pitty
geht

von Karl H. (kbuchegg)


Lesenswert?

mal abgesehen von der Diskrepanz 'array' versus 'font_bold'

Den ersten würde ich ja noch verstehen.
Aber bei den restlichen bin ich ratlos. Die sollten meinem Dafürhalten 
nicht sein.

von Rolf M. (rmagnus)


Lesenswert?

Karl Heinz schrieb:
> Den ersten würde ich ja noch verstehen.
> Aber bei den restlichen bin ich ratlos. Die sollten meinem Dafürhalten
> nicht sein.

Warum, ist doch ziemlich eindeutig?
s[i] ist vom Typ char und wird als Array-Index verwendet, deshalb kommt 
die Meldung. Nur bei den letzten beiden castet er das nach uint8_t, und 
deshalb sind das die einzigen, wo die Warnung nicht kommt.

von Karl H. (kbuchegg)


Lesenswert?

Rolf Magnus schrieb:

> Warum, ist doch ziemlich eindeutig?
> s[i] ist vom Typ char

Bei
1
const unsigned char array[256][9] PROGMEM={

ist s[i] aber nicht vom Typ 'char'. Trotzdem kriegt er die Warnung.

von Rolf M. (rmagnus)


Lesenswert?

Karl Heinz schrieb:
> Bei
> const unsigned char array[256][9] PROGMEM={
>
> ist s[i] aber nicht vom Typ 'char'.

Übersehe ich jetzt irgendwas? Solange er diese Zeile nicht ändert:

Werner schrieb:
> uint16_t func(char *s)

ist s[i] doch immer vom Typ char, völlig unabhängig davon, wie das 
Array definiert ist.

von PittyJ (Gast)


Lesenswert?

> Übersehe ich jetzt irgendwas? Solange er diese Zeile nicht ändert:
>
> Werner schrieb:
>> uint16_t func(char *s)
>
> ist s[i] doch immer vom Typ char, völlig unabhängig davon, wie das
> Array definiert ist.

So sehe ich das auch. Da muss der Funktionskopf angepasst werden. Oder 
richtig gecastet.

von Karl H. (kbuchegg)


Lesenswert?

Rolf Magnus schrieb:

> Übersehe ich jetzt irgendwas? Solange er diese Zeile nicht ändert:

Arg!

Du hast schon recht.
Ich bin auf der Leitung gestanden.

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.