Forum: Compiler & IDEs Struct Adresse einem Pointer übergeben


von Jonny (Gast)


Lesenswert?

Hallo Community,

nachdem ich mir etliche Forenbeiträge durchgelesen und immer noch keine 
funktionierende Lösung für mein Problem gefunden habe, will ich das 
Problem mal in einem separaten Beitrag schildern. Ich hoffe mir kann 
dabei jemand weiterhelfen.

Folgende Files sind gegeben...


Fonts.h


#include <stdint.h>
#ifndef Fonts_h
#define Fonts_h

#ifndef ELEMENT_NUMBER
#define ELEMENT_NUMBER code-(font->chars[0].code)
#endif
.
.
.
typedef struct {
 uint16_t length;  // number of characters
 const tChar *chars;  // reference to the characters
} tFont;

extern const tFont Arial;

const tImage *find_image(const tFont *font, uint16_t code);

#endif /* Fonts_h */


Fonts.c


#include "Fonts.h"

/* find image and return block size, width, height & bitmap */
const tImage *find_image(const tFont *font, uint16_t code)
{
 if (font->chars[ELEMENT_NUMBER].code == code) {
  return (font->chars[ELEMENT_NUMBER].image);
 }
 else {
  return (0);
 }
}

const tFont Arial = { 95, Arial_array };


und main.c


#include <stdint.h>
#include "Fonts.h"

int main(void)
{
 const tImage *im = find_image(Arial, 0x20);

 return 0;
}


beim Compilieren kommt folgende Fehlermeldung bei der Funktion 
find_image in dem main.c-file:

incompatible type for argument 1 of 'find_image'


Ich hoffe es findet jemand den Fehler und kann mir dabei weiterhelfen.

Gruß Jonny

von Peter II (Gast)


Lesenswert?

1
const tFont Arial = { 95, Arial_array };
2
3
find_image(const tFont *font, uint16_t code);
4
5
6
find_image(Arial, 0x20);

find_image will ein zeiger!


find_image(&Arial, 0x20);

von Tom (Gast)


Lesenswert?

find_image(const tFont *font,...
                        ^^^
                        Datentyp?


const tFont Arial ...
            ^^^
            Datentyp?

find_image(Arial
            ^^^
            Datentyp?

von Tom (Gast)


Lesenswert?

Zu langsam. Wenn jemand die Antwort schon vorgekaut hat, sind Hinweise 
zum Selbstfinden überflüssig...

von Jonny (Gast)


Lesenswert?

Habe ich auch schon ausprobiert...

Dann kommt folgende Fehlermeldung, wobei ich nicht genau weiß was das zu 
bedeuten hat bzw. wodurch diese hervorgerufen wurde.

Program Memory Usage : 5182 bytes   15,8 % Full
Data Memory Usage : 4169 bytes   203,6 % Full  (Memory Overflow)

von Peter II (Gast)


Lesenswert?

Jonny schrieb:
> Habe ich auch schon ausprobiert...
>
> Dann kommt folgende Fehlermeldung, wobei ich nicht genau weiß was das zu
> bedeuten hat bzw. wodurch diese hervorgerufen wurde.
>
> Program Memory Usage : 5182 bytes   15,8 % Full
> Data Memory Usage : 4169 bytes   203,6 % Full  (Memory Overflow)

steht doch alles da, die Programm ist mehr doppelt so groß wie es sein 
darf.

von Peter II (Gast)


Lesenswert?

nachtrag:

Es braucht mehr als doppelt sie viel ram wie vorhanden ist. Vermutlich 
ist dein Array viel zu groß.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Lass mich raten:

Es geht um einen AVR?

Es geht um avr-gcc?

Du hast __flash vergessen?

von Falk B. (falk)


Lesenswert?

@Jonny (Gast)

>Dann kommt folgende Fehlermeldung, wobei ich nicht genau weiß was das zu
>bedeuten hat bzw. wodurch diese hervorgerufen wurde.

>Program Memory Usage : 5182 bytes   15,8 % Full
>Data Memory Usage : 4169 bytes   203,6 % Full  (Memory Overflow)

203,6% ist etwas viel.

(Memory Overflow) Speicher Überlauf.

Dein Controller (AVR?) hat nur 2048 Bytes RAM, du willst aber mehr als 
4000 belegen. Beim AVR muss man die Daten dazu in den Flash packen.

https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Flash_mit_PROGMEM_und_pgm_read

Also eher so.

const tFont Arial PROGMEM = { 95, Arial_array };

Ob die Bibliothek allerdings damit klar kommt, muss man prüfen. 
Eigentlich sollte das aber klappen.

von Jonny (Gast)


Lesenswert?

Zuerst mal danke für die Antwort Peter.

Die Lösung funktioniert soweit, wenn ich meine Arrays und Structs kürze. 
Also liegt es an der Datenmenge.


Ich weiß nicht ob ich jetzt nochmal ein neuen Beitrag aufmachen soll, 
deswegen kurz die Frage in diesem.

Ich habe in meinem Programmcode Bitmaps für die Darstellung von Zeichen 
auf einem Display hinterlegt. Jetzt habe ich natürlich folgendes 
Problem, dass ich eben keine Zeichen wegkürzen kann, sonst würden mir 
diese fehlen.

Gibt es irgendeine Möglichkeit die Bitmaps komprimiert in das Programm 
einzubinden, bzw auf die MCU zu laden?


Hier mal ein Beispiel für die Bitmap des Ausrufezeichens:

static const uint8_t image_data_Arial_0x21[32] = {
  0xff, 0xc0,
  0xff, 0xc0,
  0xff, 0xc0,
  0xf3, 0xc0,
  0xf3, 0xc0,
  0xf3, 0xc0,
  0xf3, 0xc0,
  0xf3, 0xc0,
  0xf3, 0xc0,
  0xf3, 0xc0,
  0xf3, 0xc0,
  0xff, 0xc0,
  0xf3, 0xc0,
  0xff, 0xc0,
  0xff, 0xc0,
  0xff, 0xc0
};
static const tImage Arial_0x21 = { image_data_Arial_0x21,
5, 16, 8};

von Jonny (Gast)


Lesenswert?

Ja, es geht um AVR-GCC und einen ATmega328P uC.

Danke im Voraus für die weiteren Antworten. Ich werde diese mal 
ausprobieren und ein bisschen rum basteln am Programm. Wenn ich das 
soweit ausprobiert habe, werde ich mich nochmal melden ob es 
funktioniert hat.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Eher so:
1
> typedef struct {
2
>  uint16_t length;  // number of characters
3
>  const __flash tChar *chars;  // reference to the characters
4
> } tFont;
5
> 
6
> extern const __flash tFont Arial;
7
> 
8
> const __flash tImage* find_image (const __flash tFont *font, uint16_t code);
9
10
> /* find image and return block size, width, height & bitmap */
11
> const __flash tImage *find_image(const __flash tFont *font, uint16_t code)
12
> {

etc.

von Jonny (Gast)


Lesenswert?

Mittlerweile habe ich die Lösungen in meinen Quellcode integriert und es 
funktioniert alles einwandfrei, so wie ich mir das vorgestellt habe.

In diesem Sinne nochmals danke an alle für die schnellen Antworten zu 
meinem Problem.

von Falk B. (falk)


Lesenswert?

@Jonny (Gast)

>Mittlerweile habe ich die Lösungen in meinen Quellcode integriert und es
>funktioniert alles einwandfrei, so wie ich mir das vorgestellt habe.

Und wie sieht die Lösung aus?

https://www.mikrocontroller.net/articles/Netiquette#Happy_End

von W.S. (Gast)


Lesenswert?

Jonny schrieb:
> /* find image and return block size, width, height & bitmap */

Wer sich seine Fonts und das dazugehörige GDI derartig konstruiert, 
braucht sich nicht zu wundern, wenn dabei nix Gescheites herauskommt.

Lade dir hier die Lernbetty herunter und schau dir die dortigen Fonts 
nebst Gdi an, da kannst du draus lernen, wie das effizient gemacht 
werden kann.

W.S.

von sw (Gast)


Lesenswert?

So, nu isser beleidigt und wir werden es nie erfahren.

von W.S. (Gast)


Lesenswert?

Ist wohl kein Verlust für die Allgemeinheit.

Ich hab schon ne Menge Bastel-Fonts gesehen und die allermeisten waren 
schlichtweg idiotisch organisiert, weil sich die Erfinder keinerlei 
echte Gedanken zuvor gemacht haben. Eben immer mit dem Kopf durch die 
Wand. Nun ja, wer das ne Weile lang so praktiziert hat, wird vermutlich 
Probleme mit dem Innenleben seines Kopfes bekommen haben.

Naja..so im Nachhinein finde ich meinen Font-Entwurf für die Lernbetty 
so richtig gut. Hat mir zumindest bei ganz vielen anderen Projekten sehr 
geholfen - eben weil ich damals gründlich genug nachgedacht hab, bevor 
ich in die Tasten gegriffen habe. Man kann damit proportionale und feste 
Breiten haben, auch Piktogramme und monochrome Grafiken sind möglich, 
kurzum, der Entwurf ist tragfähig. Das Einzige, was mich dabei noch 
stört, ist der Mangel an Unicode-Fähigkeit. Für die Zeichen stehen nur 8 
Bit zur Verfügung und wenn man das auf 16 Bit erweitern will, läuft man 
Gefahr, den Font unnötig aufzublähen.

W.S.

von Jonny (Gast)


Lesenswert?

Es soll noch Leute geben, die eben nicht jeden Tag Zeit haben um zu 
antworten, deswegen erst jetzt die verspätete Antwort.

@Falk: Sorry, wusste ich nicht, dass ich auch nochmal meine Lösung in 
den Beitrag posten soll. Die Lösung kommt sofort.


@W.S.: Normalerweise antworte ich auf solche durchaus unnötige, 
arrogante und nicht dem Beitragsthema entsprechende Posts nicht. Aber 
für dich mache ich eine Ausnahme, weil so etwas kannst dir echt 
ersparen! Hilf lieber anderen Leuten, anstatt solch unqualifizierte 
Beiträge zu schreiben!

Mir ist das zudem so was von egal, was du wie gemacht oder programmiert 
hast.

Ich habe eben nicht ausreichend Zeit, um das Programm so zu verbessern, 
dass es optimal ist. Aber das solltest du eigentlich sehr genau wissen, 
dass es eben sehr viel Zeit braucht um ein Programm perfekt zu 
gestalten.
Wenn das für dich neu ist, wirst du auch noch nichts von dem 
Pareto-Prinzip gehört haben. Aber was will man von so einem Kleingeist 
wie dir erwarten, wenn man es nötig hat solche Beiträge zu verfassen.

von Jonny (Gast)


Lesenswert?

zum Abschluss des Beitrags noch meine Lösung...


Fonts.h
1
#include <stdint.h>
2
#ifndef Fonts_h
3
#define Fonts_h
4
5
#ifndef ELEMENT_NUMBER
6
#define ELEMENT_NUMBER code-(font->chars[0].code)
7
#endif
8
.
9
.
10
.
11
typedef struct {
12
 uint16_t length;  // number of characters
13
 const __flash tChar *chars;  // reference to the characters
14
} tFont;
15
16
extern const __flash tFont Arial;
17
18
const __flash tImage *find_image(const tFont *font, uint16_t code);
19
20
#endif /* Fonts_h */

Fonts.c
1
#include "Fonts.h"
2
3
/* find image and return block size, width, height & bitmap */
4
const __flash tImage *find_image(const tFont *font, uint16_t code)
5
{
6
 if (font->chars[ELEMENT_NUMBER].code == code) {
7
  return (font->chars[ELEMENT_NUMBER].image);
8
 }
9
 else {
10
  return (0);
11
 }
12
}
13
14
static const __flash uint8_t image_data_Arial_0x21[32] = {
15
  0xff, 0xc0,
16
  0xff, 0xc0,
17
  0xff, 0xc0,
18
  0xf3, 0xc0,
19
  0xf3, 0xc0,
20
  0xf3, 0xc0,
21
  0xf3, 0xc0,
22
  0xf3, 0xc0,
23
  0xf3, 0xc0,
24
  0xf3, 0xc0,
25
  0xf3, 0xc0,
26
  0xff, 0xc0,
27
  0xf3, 0xc0,
28
  0xff, 0xc0,
29
  0xff, 0xc0,
30
  0xff, 0xc0
31
};
32
static const __flash tImage Arial_0x21 = { image_data_Arial_0x21,
33
5, 16, 8};
34
35
const __flash tFont Arial = { 95,

und main.c
1
#include <stdint.h>
2
#include "Fonts.h"
3
4
int main(void)
5
{
6
 const __flash tImage *im = find_image(&Arial, 0x20);
7
8
 return 0;
9
}

Mod: Code-Tags ergänzt; bitte Verwenden!

: Bearbeitet durch User
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.