Newsgroup: it.comp.lang.c++
Titolo: string vs char str[]...

Salve a tutto il ng,
vorrei chiedere un parere :  in un progetto C++ (si tratta di un parser)  ho
preferito utilizzare anzichč la classe standard string i vecchi array di
char. Secondo il vostro parere, tale scelta puņ essere criticabile da un
punto di vista concettuale ? Il codice funziona, ma mi chiedevo se non sia
una violazione allo spirito di programmazione C++ non usare le classi
predefinite facendo invece affidamento su vecchi metodi del vecchio C....
Grazie a chiunque vorrą darmi il suo parere !
Scorpio.
--
"Long is the way, and hard,
 which from Hell leads up to light"
[J.Milton, Il paradiso perduto]

 vecchi metodi del vecchio C....
il discorso non e` tanto nell'usare vecchi o nuovi metodi, siano essi 
del C o del C++: il punto centrale e` che se sviluppi software il tuo 
scopo dovrebbe essere quello di realizzare un programma:
1) corretto
2) facile da capire, modificare, estendere, manutenere
3) nel piu` breve tempo possibile
4) efficiente (non sempre e` necessario, i punti 1 e 2 sono spesso piu` 
importanti)
Guarda caso std::string risponde proprio a questi criteri:
1) sono piu` facili da usare e di conseguenza i programmi che la usano 
avranno in media meno bug di quelli che usano i vecchi char*
2) hanno una semantica di piu` alto livello e sono altamente integrate 
con la libreria standard. Inoltre offrono molte operazioni utili che 
dovrebbero essere gia` conosciute da qualsiasi programmatore C++ (e 
quindi sono piu` facili di capire, ecc.)
3) dato che sono piu` facili da usare e sono gia` pronte il tempo 
necessario per completare il programma si riduce drasticamente.
4) sono stati realizzati numerosi test che dimostrano che std::string e` 
nella maggior parte dei casi piu` veloce dei char*
quindi la domanda e`: consideranto i punti 1,2,3,4, perche` hai 
utilizzato i char*? :-)
ciao Anto
-- 
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.73, higher than 99% of all previous test takers.
C Language: 3.79, higher than 92% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

 utilizzato i char*? :-)
Mi viene in mente una sola risposta accettabile: le stringhe non
cambiano mai dimensione e vengono modificate esclusivamente carattere
per carattere, ovvero il codice non contiene chiamate a delete ne a
strcpy/str[n]cat.
In quanti casi concreti questo capiti e' un altro discorso.
Ciao,
Nicola

 utilizzato i char*? :-)
Per ignoranza del fatto che string č ormai uno standard.

 strcpy/str[n]cat.
personalmente utilizzerei std::string anche in un caso del genere, per 
due motivi principali:
1) estendibilita`: se dopo qualche release del programma mi accorgo di 
dover utilizzare una stringa un po' piu` lunga o di doverne contatenare 
due di seguito allora "ho gia` la pappa pronta"
2) sicurezza: in fase di sviluppo posso utilizzare una qualche forma di 
accesso controllato (come la modalita` debug di STLPort) per essere 
sicuro di non sforare mai i limiti.


nella maggior parte dei casi piu` veloce dei char*
Effettivamente le implementazioni di basic_string possono contenere
tali e tante ottimizzazione nascoste che sicuramente non é possibile
ottenere con l'uso liscio delle funzioni della lib.standard del C, che
come si é già detto contengono delle gravi sviste che causano perdite
prestazionali notevoli.
Il Ghenio
---------
// TODO: Place your ass here

 Sapresti dirmi anche perchč ? Cosě posso valutare meglio il da farsi.
ti ho gia` detto perche` e` meglio std::string: e` piu` facile, sicura, 
potente, efficiente, estendibile.
Penso che le uniche applicazioni che *potrebbero* necessitare dei char* 
sia quelle per sistemi embedded dove la memoria scarseggia ed e` 
necessario sapere esattamente quanta memoria e` allocata in ogni 
istante. Ma per la programmazione "di ogni giorno" non c'e` char* che 
tenga.


 E' vero che anche std::string ha un suo limite massimo di caratteri,
in effetti non ci avevo mai pensato: perche` std::string pone un limite 
massimo al numeri di caratteri?
Pensavo che std::string::max_size() resistituisse semplicemente il 
numero massimo rappresentabile, ma facendo la prova con g++ ho notato 
che il valore restituito e` circa 1/4 di quello che pensavo.
Perche`?


 tenga.
Ti ringrazio per la risposta.... ad ogni modo, poichè il tutto funziona
bene, non mi sembra per il momento il caso di passare a string.
Grazie !

 sicuro di non sforare mai i limiti.
Rispetto al punto uno in realta' sono abbastanza d'accordo. Credo pero'
che queste decisioni debbano tenere conto di aspetti non strettamente
tecnici, ad esempio, chi paga l'estensibilita'? Dare al cliente/utente
piu' di quanto chiede puo' risultare politicamente sbagliato (anche se
la scelta tra array e stringhe e' da questo punto di vista spesso
trascurabile).
Rispetto al punto due boost::array puo' essere un'interessante via di
mezzo.
Ciao,
Nicola

 mezzo.
purtroppo non ho mai approfondito la mia conoscenza di boost: cosa offre 
boost::array di diverso da std::vector?


 boost::array di diverso da std::vector?
E' un vero e proprio array allocato sullo stack, che pero' offre
un'interfaccia da contenitore STL.
Ciao,
Nicola

 un'interfaccia da contenitore STL.
immagino che pero` non sia exception-safe: cfr il tema 5 di Exceptional 
C++...
ciao anto
