www.mikrocontroller.net

Forum: Compiler & IDEs Problem mit struct


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich möchte wegen der besseren Übersicht ein struct verwenden.
Leider scheint der GCC-Compiler damit nich zurecht zu kommen.
Hier mal der Code:
struct font
{
       uint8_t width;
       uint8_t height;
};

struct font smallfont;

smallfont.width = 5;     //*
smallfont.height = 8;    //*

Es kommt dieser Fehler, bei den mit "//*" gekenntzeichneten Zeilen 
zustande:
error: expected '=', ',', ';', 'asm' or '__attribute__' before '.' token

Was mach ich falsch?
Danke
Michael

Autor: remote1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schreib einfach mal statt:
  struct font smallfont;
einfach nur
  font smallfont;

der compiler denkt evtl. dasss du eine neue struct machen willst

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider negativ.

Da kommt der gleiche Fehler wie bei den anderen beiden Zeilen.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Build succeeded with 0 Warnings...

Poste mal dein vollständiges Programm. Da muß ein anderer Fehler drin 
sein.

Oliver

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sicher, dass der eigentliche Fehler nicht vor den gekennzeichneten 
Zeilen liegt? An der Deklaration der struct gibts imho nix 
auszusetzen...

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So mache ich es:
typedef const struct{
  uint8_t x;
  uint8_t y;
  uint8_t g[];
} graphik_typ, *graphik_ptr;


extern const graphik_typ lcd_fnt1;

Gruß, Stefan

Autor: Michael (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal der ganze Code.
Vorher steht eigentlich nur ne include....
An der wirds ja nicht liegen.
Lösche ich die betreffenden Zeilen compiled er ohne Probleme.

Michael

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ahem ...

WO machst Du denn das hier:
smallfont.width = 5;
smallfont.height = 8;

Das geht vielleicht in Basic, aber in C darfst Du das NUR innerhalb 
einer Funktion machen.

Wenn Du Deine struct initliaisieren willst, dann mach das so:
struct font_typ
{
  uint8_t width;
  uint8_t height;
};

struct font_typ smallfont = {5, 8};
P.S.:
Schau Dir mal mein Beispiel oben an. Dort ist in der struct noch ein Ptr 
auf die Graphikdaten. Genauso kannst Du es auch mit Deinem Font machen. 
Dann hast Du Größe und Graphikdaten Deines Fonts nur über Deine struct 
erreichbar:
// der Font muss zuerst deklariert werden (oder forward):

const uint8_t font5x8[]PROGMEM= { 
0x00,0x00,0x00,0x00,0x00,  // 0x00

struct font
{
  uint8_t width;
  uint8_t height;
        uint8_t fnt_data[];
};

struct font smallfont = {
  5,
  8,
  font5x8
};

Gruß, Stefan

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich bin mir ziemlich sicher, dass ich das so auch in C verwenden darf.
Oliver kanns ja auch ohne Fehler compilen.
Kann das jemand bestätigen?

Naja wie auch immer. Das hier funktioniert jetzt scheinbar:
struct font_typ smallfont = {5, 8};

Danke dafür! :)

Michael

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann nimm mal Deinen Code von oben und schreib eine Funktion drumrum:
void font_init(void){
    smallfont.width = 5;
    smallfont.height = 8;
}

>Ich bin mir ziemlich sicher

Da ist beim Programmieren eine der häufigsten Fehlerquellen ;-)

Gruß, Stefan

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Ich bin mir ziemlich sicher, dass ich das so auch in C verwenden darf."
Nö. Darfst du nicht.

"Oliver kanns ja auch ohne Fehler compilen."
Nö. Kann ich nicht. Ich hatte das selbstverständlich innerhalb von 
main() getestet.

Globale Initialisierung geht so:
struct font smallfont = {5,8};
Oliver

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok wieder was gelernt! Danke ;)
Michael

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.