passing const argument Konstante an funktion übergeben

OP #4525953
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
OP #4525971
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;
Gast #4525989
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.
#4525992
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 ;)
OP #4525996
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;
OP #4525997
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren