Newsgroup: it.comp.lang.c
Titolo: Inizializzare un puntatore a char ad una stringa costante definita in  un altro modulo

-- prova.c --
extern const char *const prova;
const char *const string = prova;
--
La compilazione di questo sorgente (ridotto all'osso) mi dà il
seguente errore:
  error: initializer element is not constant
Immagino che al momento della compilazione del file prova.c il
compilatore non conosca l'indirizzo della variabile prova (essendo
definita in un altro modulo), quindi non possa neanche inizializzare
la variabile string.
E' strano perchè nel file obj il compilatore potrebbe inserire un
simbolo (indirizzo della variabile prova) e scriverlo veramente
durante la fase di linking. Non penso che il compilatore abbia bisogno
del valore numerico per forza... o sbaglio?
Il problema è questo. Vorrei isolare in un file .c/.h, per comodità,
tutte le stringhe del mio programma:
-- mystrings.c --
const char strPippo[] = "Pippo";
...
--
-- mystrings.h --
extern const char *const strPippo;
...
--
In alcuni moduli ho naturalmente bisogno di fare riferimento ad esse:
-- main.c --
#include "mystrings.h"
struct mystruct {
  const char *const string;
  int value;
} mys[] = {
  { strPippo, 2 },
  { ..., ... }
};
...
--
L'inizializzazione dell'array mys non va a buon fine, come nel primo
esempio.
So che potrei inizializzare mys[i].string durante l'esecuzione del
programma, ma non vorrei farlo per i seguenti motivi:
- voglio mantenere il codice il più piccolo possibile (il programma
gira su un micro con poca memoria)
- l'array mys è molto lungo e con molti membri, quindi è comodo
inizializzarlo piuttosto che modificarlo
  "a runtime"
Possibile che una cosa così semplice non si possa fare?

 Possibile che una cosa così semplice non si possa fare?
Non in C. In C++ dovrebbe essere possibile (prova ad attivare le
estensioni del tuo compilatore, se proprio vuoi usare questa strada).
Normalmente per queste cose si usa il preprocessore (metti qualche
#define).
Ciao!

 #define).
Difficile usare le #define senza definire più volte la stessa stringa,
se viene
utilizzata da più parti. Mi daresti una mano?

 utilizzata da più parti. Mi daresti una mano?
non capisco... basta mettere la/e define(s) in un file ed includerlo
dove serve... no? qual'è il problema?
Ciao!

 dove serve... no? qual'è il problema?
--
#define STRING1 "String1"
#define STRING2 "String2"
const char *strList1[] = { STRING1, STRING2 };
const char *const strList2[] = { STRING1, STRING1, STRING1 };
--
Quante volte viene "allocata staticamente" la stringa "String1"?
Secondo 4 volte, cioè occupo 32 byte (7 caratteri più '\0') solo
per "String1" e 8 per "String2". Moltiplica questi array di liste
per 100 e immagina un microcontrollore con pochi KB di Flash
e potrai capire la mia esigenza.
Utilizzando una stringa costante e solo i puntatori ad essa, riuscirei
a risparmiare un bel po' di preziosa memoria Flash.

 Nel primo caso non c'è errore.
Penso di aver risolto così:
--
extern const char my2[];
const char *m2 = my2;
--
In pratica il compilatore vuole sapere che my2 è un array di char e
non un
puntatore. In effetti un array di char ha una posizione nota in
memoria già
a compile time, un puntatore invece no (anche se potrebbe essere stato
inizializzato).

 a risparmiare un bel po' di preziosa memoria Flash.
Hai ragione, a questo non avevo pensato.
In ogni caso non m'è mai capitata una situazione del genere, e non
vedo in che modo potrebbe capitare. Probabilmente io per risolvere
userei variabili non costanti e/o settate a runtime :)
Ciao!