Newsgroup: it.comp.lang.c++
Titolo: Aiuto su char**

Innunzitutto volevo ringraziare Maurus per il suo aiuto tempestivo nel mio
post di ieri, e anche gli altri che si sono prodigati, quel problema l'ho
risolto, ma adesso volevo capire meglio char**.
Il mio problema è capire come funziona char**, non riesco a capire il suo
funzionamento.
Qualcuno potrebbe postarmi un link dove posso trovare una spiegazione e
qualche esempio?
E' tutto il giorno che spulcio google ma non riesco a trovare nulla a
riguardo.
Grazie
Riccardo

 wrote in message
news:avftt4$jq$1...@lacerta.tiscalinet.it...

Il tuo e' piu' un problema che si riscontra col linguaggio C, che col C++.
Questo perche' il char ** si usa ad esempio, come nel tuo caso, quando si
vuol fare caricare una stringa a una funzione.Per cui passandovi
semplicemente un char* si commette un errore, per lo stesso motivo per cui
passando un valore una funzione e' sbagliato aspettarsi che quel valore sia
cambiato dalla funzione stessa.Bisogna invece passare il puntatore alla
variabile che contiene quel valore o un suo riferimento.
In C++ tutti questi problemi sono superati in quanto ora ci sono le string e
i vector, che puoi usare includendo gli headers <string> e <vector>, i quali
hanno sostituito i char* per gestire le stringhe e gli array.
Per cui ora invece di passare un char** a una funzione per fargli caricare
una stringa, gli si passa un riferimento a una string:
#include <string>
void caricaStringa (std::string &str)
{// qui metti in str la stringa che vuoi: "Pippo"}
....
std::string miaStringa
caricaStringa(miaStringa);
// ora in miaStringa hai "Pippo"
Come vedi non c'e' piu' bisogno di char**, ne' di new ne' di delete, ora e'
tutto gestito da string.
Ma tu sei interessato piu' al C o al C++ ?
Maurus

 Maurus
Hai ragione, non sono stato chiaro dall'inizio.
Io sto sviluppando una dll (come tesi) e può essere C o C++, ma
l'interfaccia della dll mi è stata imposta.
Tra i parametri di questa interfaccia ho proprio char** e devo utilizzarlo
per forza, effettivamente il codice che ho scritto è tutto in C, il new l'ho
sostituito con malloc.

>>>ritorno dalla funzione.
Ovviamente come dici tu, per due stringhe ti servono due char**, (oppure un
char***) !!!
Studiati i due codici. Nell'ultimo esempio se tu invece di ricevere char**,
ricevi un normale char* non funziona in quanto (in CreaStringa) avresti una
variabile locale di tipo char* che punta all'indirizzo puntato da ps, cioe'
NULL (ma sono due puntatore diversi, che puntano allo stesso indirizzo). Con
malloc (o con la costante stringa "TOMMASO") diresti ad essa di puntare
(diaciamo per esempio) a 0x456A, ma ps nel main() continuerebba a puntare a
NULL (ora non puntano piu' allo stesso indirizzo).
Ricevendo char** invece  *ps e' la varibile ps di main() e punta a NULL (ora
non e' un altro puntaore che punta a NULL, e' quello di main()), mentre ps
(senza *) e' un puntatore locale che punta al puntatore ps di main! Ora con
*ps=malloc (o con *ps="TOMMASO") possiamo cambiare il valore del puntatore
di main() e supponendo che malloc restituisca 0x456A allora anche in main()
ps puntera' a 0x456A !!!
Capito il trucchetto? Capisco che all'inizio sia ostico, ma.... se ti studi
i due programmini fatti al volo...
Spero ti sia stato di aiuto.
Siamo al limite, per stare in ambito C++ ho usato #include<cstdio> ed il
cast sul malloc!!!!
Altrimenti era C puro visto che in C++ ci sono altri modi migliori per fare
tutto cio' !!!
Tommy

}
Pessimo esempio: l'uso piu` corretto e` quello in cui la memoria viene
allocata (con new, visto che siamo in C++).  Tra l'altro sizeof(char)
vale sempre 1 su qualunque piattaforma e quindi si puo` omettere nella
moltiplicazione.

 il new l'ho sostituito con malloc.
Ecco perche' ho usato malloc, ed ecco perche' non e' un pessimo esempio
(anzi, rispecchia maggiormente le sue esigenze al limite dell'OT).
sizeof(char) vale certamente sempre 1,ma mettendolo e' piu' didattico visto
che se un domani volesse usare con int (ad esempio) un malloc(64) potrebbe
confonderlo. In pratica per i char malloc(64) e' piu' diretto, ti do
ragione. Ma con malloc(sizeof(char)*64) credi di (al contrario di quello che
dici tu) dare un esempio migliore e che lo porti ad evitare errori.
Tommy

che se un domani volesse usare con int (ad esempio) un malloc(64) 
Certo, la probabilita`, magari, e` la stessa di tramutare la propria
auto in un hovercraft, per cui da subito, sotto la tua Fiat 500, non
monti le ruote, ma un bel cuscino pieno d'aria.  Ti ricordo che si sta
parlando di stringhe.

 parlando di stringhe.
??? ehhh? Ma che esempi sono?!?
Ad ogni modo ti ricordo che volendo esistono anche le stringhe fatte di
caratteri UNICODE!!!
Tommy

l'uso di char**.
E io sto ribattendo sul fatto che l'uso di char** che proponi, visto
che ci tieni tanto alla didattica, non e` appropriato.

 l'uso di char**.
E ci sei riuscito benissimo, ho capito finalmento dove sbagliavo.
Io volevo solo capire con un esempio ed č quello che hai fatto.
Ringrazio tutti quanti mi hanno risposto.
Riccardo

cosa ti e` chiara.
No, ma non importa. Non ho voglia di discutere su cose inutili, visto che
sulla parte utile gia' ti ho dato (parzialmente) ragione. (su quella inutile
no, ma e' inutile parlarne).
In altre parole STOP a questo thread.
[STOP]

Si, ma allora impara a scrivere, era chiaro il contrario ;-)
Stai cominciando a stancarmi, Io ho scritto:
"l'uso piu` corretto e` quello in cui la memoria viene
allocata (con new, visto che siamo in C++)"
Il concetto piu` importante che traspare da questa frase, almeno per
una persona dotata di un briciolo di intelligenza, e` che la memoria
deve essere allocata.  Il fatto che debba essere usato new e` un
aspetto secondario e, per questo, riportato tra parentesi.
Dici agli altri di imparare a scrivere, quando tu non sai leggere.

 Stai cominciando a stancarmi
Anno nuovo, Laforgia vecchio... ;-PPP
-- 
Luc.

Anno nuovo, Laforgia vecchio... ;-PPP
...ops... chi ti ha fatto uscire dal kill-file ?

 [STOP]
BAAAAAAAAAASSSSSSSSSSSSSTTTTTTTTTAAAAAAAA !!!
NON ME NE FREGA UN CA**O !
Possibile che questi threads di polemiche non si fermino mai.....
SSSSSSSSSSSSTTTTTTTTTTOOOOOOOOOOOPPPPPPP.

Sapessi tu, io avevo scritto:
I thread non si fermano perche` lo decidi tu, tanto piu` quando
dimostri di non saper leggere e intendere quello che gli altri
scrivono.  Le polemiche nascono perche` c'e` gente come te (ti ricordo
la questione su '\0' o 0 con cui hai abbondantemente sfasciato le
gonadi a tutti su it.comp.lang.c).

 gonadi a tutti su it.comp.lang.c).
sulla quale avevo ragione! Ad ogni modo c'era bisogno di scrivere questo tuo
ultimo messaggio?!?
Si, perche' vuoi avere tu l'ultima parola.... (e non credere di essere meno
polemico di me).

 ...ops... chi ti ha fatto uscire dal kill-file ?
Non sei buono neanche con il pattern matching? ;-)
-- 
Luc.