Newsgroup: it.comp.lang.c++
Titolo: Come si inizializza un ARRAY CONST???????????????

Come si fa ad inizializzare un array dichiarato costante?
Ad esempio per un intero č
int b=3;
int const a=b;
per un array di caratteri come si fa?
char const a[20]=b[20]; NON FUNZIONA
Ciao

 char const a[20]=b[20]; NON FUNZIONA
E meno male! Stai tentando di assegnare ad a, dopo averlo dichiarato
costante, il valore del ventesimo elemento di b credendo di copiare il
contenuto dell'array puntato da b nella memoria puntata da a: il compilatore
si ferma
bestemmiando tutti gli dei della Terra perché il tipo non coincide.
Con l'istruzione "char const a[20]" non dichiari un array di caratteri (una
stringa, in breve) costante (oppure di costanti carattere, se ti è più
facile da ricordare), ma una costante puntatore ad un array di caratteri,
ottenendo l'effetto opposto a quello desiderato: il valore di a (l'indirizzo
del primo carattere della stringa in questo caso) non può essere modificato
mentre questo è possibile per l'elemento al quale punta.
Le costanti puntatori e gli array costanti devono essere inizializzati
(uccidiamo pure l'italiano con 'sti orrendi neologismi informatichesi) nelle
loro _dichiarazioni_; ovviamente, le costanti extern di qulsiasi tipo non
necessitano di inizializzazione alcuna (sento Dante e Manzoni rivoltarsi
nelle tombe ed emettere acutissime grida di dolore!), benché non sia
illegale.
Alcuni esempi:
1)const char str[21]="uiyuioyuiyouiyou";
Dichiara un array costante di caratteri o di costanti carattere: str è una
variabile puntatore ad una _stringa_ costante.
2)const char const str[20]="uidrhlgjksdfhsj";
Dichiara una _costante_ puntatatore ad una stringa _costante_.
3)const char *str="uildfhgjsdfh";
È identico al primo esempio, esonerandoti però dall'onere del contare
manualmente le dimensioni (in char) + il '\0' della stringa, operazione
svolta in automatico dal compilatore. La forma
const char str[]="uiodahfgdfhhj"; //SENZA l'operatore * !!!!
è equivalente.
4)const char * const str="asidufhsd";
Dopo tutto 'sto spiegone barocco, spero d'essere stato abbastanza chiaro
affinché tu possa comprenderne il significato.
Ricordati, anzi stampati in testa che per copiare una stringa terminata da
'\0' in un'altra *non costante* è *consigliabile* utilizzare la funzione
#include <cstring>
char *strcpy(char *dest, const char *sorg)
.Tentare una copia di stringhe con
str=str2; //Assegna a str il valore di str2. Ed i dati puntati da str? Persi
nell'oblio dello stack (o dell'heap)!
oppure
str=*str2; //Ancora peggio!
è da autodenuncia al 
S.i.s.De
 per sovversivismo ;-).
Un altro metodo (_sempre_e_comunque_ inutile, tranne per alcune rarissime
eccezioni che possono rivelarsi ogni 2-3000 anni) per copiare una stringa in
un'altra dichiarata const consiste nell'utilizzare il const_cast<>. È
semplicissimo, ma non ne posto esempi per evitare di confonderti le idee più
di quanto abbia già fatto col mio stile di scrittura barocco.
I puntatori sono potenti e flessibili, permettono alcuni giochetti
impossibli in linguaggi privi di essi (come il Visual Basic) e possono
diventare anche divertenti, ma sono delle brutte bestie: avendo iniziato col
C a 12 anni, ne so qualcosa.
Scusa se sono stato poco chiaro.
Saluti

di quanto abbia già fatto col mio stile di scrittura barocco.
Usare const_cast su oggetti dichiarati const e' undefined
behaviour. C'e' una tremenda differenza filosofica fra un
reference const o un puntatore a const e un oggetto const...
anche su questo punto ci sono stati diversi thread in
questo NG che probabilmente ti sei perso.
HTH
Andrea

 char *strcpy(char *dest, const char *sorg)
Per copiare una array di caratteri terminato da '\0' in un altro
(ovviamente non costante) e` consigliabile usare strncpy e non strcpy
a meno che non si sia sicuri di non superare i limiti dell'array.
Usare array di caratteri come stringhe ha senso solo se si deve
lavorare con librerie scritte per il C, e anche in questo caso spesso
conviene usare le stringhe e il metodo c_str() per passare i dati alle
funzioni stile C.
Per copiare una stringa in un altra si usa l'operatore = delle
stringhe (e non funzioni obsolete che operano su array e puntatori):
  #include <string>
  std::string str1( "fmnklfmsdf;ladf" )
  std::string str2( "12345678" )
  str2 = str1;
  str1 = str1 + str2;
        Mauro

 wrote:
[cut]