Forum: Mikrocontroller und Digitale Elektronik passing const argument Konstante an funktion übergeben


von Holger K. (holgerkraehe)


Lesenswert?

Hallo zusammen

Ich habe folgenden Code:

zwei strukte.
Wobei das untere das obere enthält.

Nun frage ich mich grundsätzlich: werden hier unnötige Daten kopiert?
Denn nach einem Pointer sieht mir das ja nicht aus.
1
// Character descriptors for Arial 36pt
2
// { [Char width in bits], [Offset into arial_36ptCharBitmaps in bytes] }
3
const FONT_CHAR_INFO arial_36ptDescriptors[] =
4
{
5
  {23, 0},    // 0
6
  {13, 115},    // 1
7
  {23, 180},    // 2
8
  {23, 295},    // 3
9
  {24, 410},    // 4
10
  {23, 530},    // 5
11
  {24, 645},    // 6
12
  {23, 765},    // 7
13
  {23, 880},    // 8
14
  {23, 995},    // 9
15
  {4, 1110},    // :
16
};
17
18
// Font information for Arial 36pt
19
const FONT_INFO arial_36ptFontInfo =
20
{
21
  35, //  Character height
22
  '0', //  Start character
23
  ':', //  End character
24
  2, //  Width, in pixels, of space character
25
  arial_36ptDescriptors, //  Character descriptor array
26
  arial_36ptBitmaps, //  Character bitmap array
27
};


Leider bekomme ich dazu noch eine Warnung.
1
warning: initialization discards 'const' qualifier from pointer target type [enabled by default]

Könnte mich hier jemand etwas über die Hintergründe aufklären?
Dass arial.... nicht als const im unteren strukt deklariert ist, ist mir 
klar. aber einfach "const" davor bringt nichts.

Danke schonmal

von Tom (Gast)


Lesenswert?

Was steckt hinter FONT_CHAR_INFO und FONT_INFO ?

von Holger K. (holgerkraehe)


Lesenswert?

Stimmt, das müsste ich auch noch posten:
1
////////////////////////////////////////////////////////////////////////////////
2
typedef struct _font_char_info
3
{
4
   uint8_t Charwidth;
5
   uint16_t Offset;
6
}FONT_CHAR_INFO;
7
////////////////////////////////////////////////////////////////////////////////
8
typedef struct _font_info
9
{
10
   uint8_t CharacterHeight;
11
   char StartCharacter;
12
   char EndCharacter;
13
   uint8_t  FontSpace;
14
   FONT_CHAR_INFO *Descriptors;
15
   uint8_t *Bitmaps;
16
}FONT_INFO;

von Tom (Gast)


Lesenswert?

FONT_CHAR_INFO *Descriptors ist ein normaler Pointer, also ist das, 
worauf er zeigt, problemlos manipulierbar, wenn man ein FONT_INFO hat.

Du versuchst, die Adresse eines als const definierten Arrays darin zu 
speichern, die const-ness ginge damit verloren.


Wenn man über das FONT_INFO das FONT_CHAR_INFO ändern können soll, darf 
arial_36ptDescriptors[] nicht const sein.
Wenn man das FONT_CHAR_INFO nicht ändern können muss, sollte Descriptors 
const sein.
Wenn die Header nicht änderbarer Code einer altlastenbehafteten 
Fremd-Library sind, hat man verloren und muss arial_36ptDescriptors 
nicht const machen, casten oder Warnungen abstellen, const-correctness 
geht nur ganz oder gar nicht.

von Harry L. (mysth)


Lesenswert?

const bedeutet für den Compiler sinngemäß: "don't touch"
Wenn du einem Pointer die Adresse einer const-Variable zuweist, kann der 
Compiler nicht mehr sicherstellen, daß die Variable auch beim Zugriff 
über den Pointer konstant bleibt, und reagiert mit dieser Warnung.

Alles nix Schlimmes, so lange man weis, was man tut ;)

von Holger K. (holgerkraehe)


Lesenswert?

Tom schrieb:
> FONT_CHAR_INFO *Descriptors ist ein normaler Pointer, also ist
> das,
> worauf er zeigt, problemlos manipulierbar, wenn man ein FONT_INFO hat.
>
> Du versuchst, die Adresse eines als const definierten Arrays darin zu
> speichern, die const-ness ginge damit verloren.
>
> Wenn man über das FONT_INFO das FONT_CHAR_INFO ändern können soll, darf
> arial_36ptDescriptors[] nicht const sein.
> Wenn man das FONT_CHAR_INFO nicht ändern können muss, sollte Descriptors
> const sein.
> Wenn die Header nicht änderbarer Code einer altlastenbehafteten
> Fremd-Library sind, hat man verloren und muss arial_36ptDescriptors
> nicht const machen, casten oder Warnungen abstellen, const-correctness
> geht nur ganz oder gar nicht.

Danke für deine Antwort.
Nein es ist nicht altlastenbehaftet. Sondern es wird neu programmiert.
Die Fonts kommen aus diesem tool: 
http://www.eran.io/the-dot-factory-an-lcd-font-and-image-generator/

Es muss nichts änderbar sein an den Structs.
Sie dienen lediglich dem auslesen und sollen möglichst im Flash landen.


Wo soll ich Descriptors als const definieren?

So?
1
////////////////////////////////////////////////////////////////////////////////
2
typedef const struct _font_char_info
3
{
4
   uint8_t Charwidth;
5
   uint16_t Offset;
6
}FONT_CHAR_INFO;
7
////////////////////////////////////////////////////////////////////////////////
8
typedef const struct _font_info
9
{
10
   uint8_t CharacterHeight;
11
   char StartCharacter;
12
   char EndCharacter;
13
   uint8_t  FontSpace;
14
   FONT_CHAR_INFO *Descriptors;
15
   uint8_t *Bitmaps;
16
}FONT_INFO;

von Holger K. (holgerkraehe)


Lesenswert?

Harry L. schrieb:
> kann der
> Compiler nicht mehr sicherstellen, daß die Variable auch beim Zugriff
> über den Pointer konstant bleibt, und reagiert mit dieser Warnung.
>
> Alles nix Schlimmes, so lange man weis, was man tut ;)

Grundsätzlich weiss ich was ich tue :)
Ich schreibe nie in den Font.

Allerdings möchte ich, dass der Font durch das "const" im Flash landet.
Deshalb hoffe ich de compiler macht das auch noch, auch wenn er denkt 
ich könnte ja plötzlich was ändern aufgrund des pointers...

von Harry L. (mysth)


Lesenswert?

Holger K. schrieb:
> Allerdings möchte ich, dass der Font durch das "const" im Flash landet.

Das erreichst du aber nicht durch const.

Wenn es sich um einen AVR handelt brauchst du PROGMEN.

von Holger K. (holgerkraehe)


Lesenswert?

Harry L. schrieb:
> Holger K. schrieb:
>> Allerdings möchte ich, dass der Font durch das "const" im Flash landet.
>
> Das erreichst du aber nicht durch const.
>
> Wenn es sich um einen AVR handelt brauchst du PROGMEN.

Nein, es handelt sich um einen STM32 CM3 mit ARM-GCC Compiler

: Bearbeitet durch User
von Harry L. (mysth)


Lesenswert?

Holger K. schrieb:
> Nein, es handelt sich um einen STM32 CM3 mit ARM-GCC Compiler

Dann ist doch alles gut.
Konstanten im Source landen auch ohne spezielle Deklaration im Flash.

von Holger K. (holgerkraehe)


Lesenswert?

Gut, und wie sieht es mit dem eigentlichen problem aus?

Kann ich die Warnung irgendwie wegbringen indem ich ein strukt als const 
deklariere?

von (prx) A. K. (prx)


Lesenswert?

Holger K. schrieb:
> Kann ich die Warnung irgendwie wegbringen indem ich ein strukt als const
> deklariere?

  const FONT_CHAR_INFO *Descriptors;

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.