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
constFONT_CHAR_INFOarial_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
constFONT_INFOarial_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
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.
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 ;)
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?
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...
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.
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
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.