Forum: Compiler & IDEs __flash Array und Pointer: incompatible pointer type


von Aktuell (Gast)


Lesenswert?

Kann mir bitte jemand folgenden Fehler erklären:

font.h:
1
const __flash uint8_t fontdata[96][8]= {
2
    {  0,  
3
     ....

code.c:
1
#include "font.h"
2
const __flash uint8_t* fnt = fontdata;

Ergibt
1
avr-gcc.exe (GCC) 5.3.0
2
....
3
main.c:24:30: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
4
 const __flash uint8_t* fnt = fontdata;
5
                              ^

Wieso passt der Pointer nicht zum Array im Flash, was ist richtig?

von Aktuell (Gast)


Lesenswert?

Hoppla: den AVR-GCC-Tutorial: Flash mit flash und Embedded-C fand ich 
ein bisschen wirr ("links/rechts von *") und ich habe dort keine 
weiteren Hinweise gefunden.

von Rätselrater (Gast)


Lesenswert?

Aktuell schrieb:
> Wieso passt der Pointer nicht zum Array im Flash, was ist richtig?

Funktioniert es ohne const am Pointer?

von Aktuell (Gast)


Lesenswert?

Nein:
1
error: pointer targeting address space '__flash' must be const in variable 'fnt'

von Hans (Gast)


Lesenswert?

Das liegt daran, dass fontdata ein zweidimensionales Array ist.

So müsste die Warnung weggehen:
1
#include "font.h"
2
const __flash uint8_t* fnt = fontdata[0];

von Stefan E. (sternst)


Lesenswert?

Aktuell schrieb:
> Wieso passt der Pointer nicht zum Array im Flash

Weil bei einem zweidimensionalen Array der Name nicht zu einem "typ *" 
zerfällt, sondern zu einem "typ (*)[Y]".

Aktuell schrieb:
> was ist richtig?

Kommt darauf an, was du mit fnt genau machen willst. Davon hängt ab, ob 
es sinnvoller ist, die linke oder die rechte Seite vom = zu ändern.

von Markus F. (mfro)


Lesenswert?

Wäre das hier für dich einfacher zu verstehen?
1
const __flash uint8_t *fnt = &fontdata[0][0];

Dann schreib's so ;).

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

1
const __flash uint8_t (*fnt)[8] = fontdata;

: Bearbeitet durch User
von Aktuell (Gast)


Lesenswert?

Danke soweit, das leuchtet ein. fnt arithmetisch auf eine bestimmte 
"Zelle" gesetzt, also wäre wohl gar kein zweidimensionales Array 
erforderlich.

Weitere Infos: http://en.cppreference.com/w/c/language/array ganz unten.

von Aktuell (Gast)


Lesenswert?

Danke auch euch. Jetzt sind ja alle Varianten zusammengekommen :-)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Aktuell schrieb:
> Jetzt sind ja alle Varianten zusammengekommen :-)

Wobei nicht alle die Struktur des Arrays wiederspiegeln.

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.