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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Aktuell (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

Funktioniert es ohne const am Pointer?

von Aktuell (Gast)


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

von Hans (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht lesenswert
1
const __flash uint8_t (*fnt)[8] = fontdata;

: Bearbeitet durch User
von Aktuell (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Danke auch euch. Jetzt sind ja alle Varianten zusammengekommen :-)

von Johann L. (gjlayde) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Aktuell schrieb:
> Jetzt sind ja alle Varianten zusammengekommen :-)

Wobei nicht alle die Struktur des Arrays wiederspiegeln.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.