Newsgroup: it.comp.lang.c
Titolo: passaggio char ** a funzione

Salve a tutti,
    non riesco a passare un char ** a una funzione per modificarlo, e 
stamparlo poi nella funzione principale:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
int funzione1(char **pippo);
int main(void){
 int i=0;
 char *stringa=NULL;
 stringa=(char *) malloc (1*20000);
 funzione1(&stringa);
 for(i=0;i<100;i++){
  printf("%s\n",stringa[i]);
 }
 return 0;
}
int funzione1(char **pippo){
 int i=0;
 for(i=0;i<100;i++){
  pippo[i]=strdup("PROVA");
 }
 return 0;
}
Il codice viene eseguito senza errori ma il main non stampa nulla :(
Ringrazio anticipatamente
Ciao
Denis 

 
char *stringa e' un unico puntatore a char, mentre la tua funzione si 
comporta come se ce ne fosse un array. Prova cosi':
char **stringa=NULL;
stringa=(char**)malloc(200000);
funzione(stringa);
-- 
Devaraja (Xdevaraja87^gmail^c0mX)
Linux Registerd User #338167
http://counter.li.org

 Denis
Ciao
m`

"Dade - Home -" <cucca7...@NOSPAMgmail.com> ha scritto nel messaggio 
news:CGtCe.171088$75.74...@news4.tin.it...
[CUT]
Grazie a tutti in effetti l'errore era tutto nella dichiarazione e nel cast 
di malloc... che purtroppo con vc++ _DEVO_ fare per forza pure includendo la 
stdlib.h!!! non so perche'.... anzi se usate vc... :P°°
grazie :-)
Denis
P.S.: I warning sono abilitati ma pecco di inesperienza e non mi e' sempre 
facile comprenderli :/ 

 Il codice viene eseguito senza errori ma il main non stampa nulla :(
Codice eseguito senza errori non vuol dire codice funzionante.

 funzione(stringa);
Tutto questo è sbagliato.  Una funzione che vuole modificare il valore 
di una variabile dichiarata nella funzione chiamante, deve accettare un 
puntatore a quella variabile.  Questo vale per tutti i tipi di 
variabili, anche i puntatori, quindi non ha senso fare ciò che tu 
suggerisci.  Nel chiamante, bisogna comunque definire:
char *stringa=0;
e poi lasciare che sia la funzione invocata a modificare il valore di 
stringa.  La necessità di allocare o meno memoria per stringa dipende 
dal ruolo della funzione chiamata.

 Tutto questo è sbagliato.  Una funzione che vuole modificare il valore 
E' vero, scusate. Non avevo letto bene il post :-(


 
No, ora che ci penso e compilo e' giusta anche la mia soluzione. Anche 
se la richiesta fa pensare a quello che dici tu, il codice sembra quello 
che dico io :-), cioe' tratta stringa come un array di puntatori a char 
e alloca nella funzione1 una stringa per ciascuno di questi. Prova a 
compilare con la mia correzione, funziona.


 
No invece sbaglio davvero! Oggi sono proprio fuso scusate tutti e 
ignorate ogni mio post fino a domani :-)


 Codice eseguito senza errori non vuol dire codice funzionante.
verissimo :-)
grazie di nuovo per il tuo aiuto!
Ciao
Denis

> [...]Prova a compilare con la mia correzione, funziona.
Lo dico ancora una volta:
1) il fatto che il compilatore non sollevi errori durante la 
compilazione NON vuol dire che il codice sia corretto e funzioni.
2) il fatto che un codice produca risultati corretti NON vuol dire che 
sia corretto e funzioni.
3) il test di un programma può solo dimostrare che il codice contiene 
degli errori, NON che non ne contenga.

 beh in realta' era solo per popolare un po' il vettore :-)
Non hai allocato nessun vettore di stringhe.

"Andrea Laforgia" <x...@xx.xx> ha scritto nel messaggio 
news:v_ACe.23843$b93....@tornado.fastwebnet.it...

mmm... perche' mi dici cio'? lo strdup alloca lo spazio e ci copia 
"PROVA"... sbaglio?
grazie ancora del tuo aiuto
Ciao
Denis 

 "PROVA"... sbaglio?
strdup() non è una funzione standard, quindi non si può dire che 
cosa faccia.  Se intendi con strdup(), quella funzione che secondo 
alcuni sistemi duplica una stringa, essa non ha nulla a che vedere 
con un "array di stringhe".

"Andrea Laforgia" <x...@xx.xx> ha scritto nel messaggio 
news:cYPCe.24966$b93....@tornado.fastwebnet.it...

Si, intendo proprio quella che duplica una stringa :P
Cerco di capire... dici che non ha nulla a che vedere con un "array di 
stringhe" perche' un array di stringhe non esiste in c giusto? perche' 
altrimenti la strdup duplicando una stringa alloca anche lo spazio sul ptr 
di destinazione....
Ciao e grazie
Dade
P.S.: Scusate se sto portando avanti un tread su una funzione non standard

 stringhe" perche' un array di stringhe non esiste in c giusto? 
Vediamo di intenderci.  In C una stringa è una sequenza di caratteri 
terminata dal carattere '\0'.  Un array di stringhe è normalmente 
implementato come un puntatore a puntatore a char o come un vettore di 
puntatori a char.  La funzione strdup() duplica, semplicemente, _una_ 
stringa.