Newsgroup: it.comp.lang.c
Titolo: [IMPORTANTE]Copiare un vettore

Salve a tutti
ho la necessità di copiare un vettore di char* in un altro.
La copia deve avvenire dopo aver allocato dinamicamente il secondo
vettore. Quello da copiare è formato da stringhe tutte della stessa
lunghezza. il problema da cui nasce la necessità di allocare
dinamicamente il vettore di destinazione è che quello di origine ha
dimensioni varibili ossia: il vettore destinazione si trova in una
libreria che viene importata e che ad ogni compilazione può variare per
cui potrei avere all''inizio un vettore di 10 elementi in cui ogni
elemento è una stringa di 5 caratteri, ma alla compilaizone successiva
vorrei che, modificando il vettore sorgente nella libreria ad esempio
facnedolo di 8 elementi con ogni elemento pari a una stringa di 7
caratteri la copia avvenga ugualmente correttamente.
per effettuare la copia ho provato con una chiamata a malloc e
successivamente a strcpy o chiamando semplicemtne strdup oppure
utilizzando puntatori d'appoggio ma niente. effetivamente riesco ad
ottenere la copia ma subito dopo viene generato un errore (non dovuto a
mancanza di heap da allocare) e il programma viene terminato. se la
dimensione del vettore fosse costante il problema non ci sarebbe. non
posso nemmeno dichiarare un vettore destinazione sovradimensionato
perchè non so effetivamente di qunato può variare il sorgente.
qualcuno mi può aiutare? è abbastanza importante
grazie
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 utilizzando puntatori d'appoggio ma niente.
Bisognerebbe capire se commetti un errore.
La qual  cosa e' possibile solo se ci fai vedere le linee
incriminate.
Inoltre potresti aver fatto benissimo la copia, ma
il programma potrebbe piantarsi per effetto di errori
che commetti precedentemente senza accorgerti
(cosa piuttosto comune).
fare la copia e' una cosa banale. Non puoi sbagliare.
se quello di origine e'
char **S;
o
char *S[...];
e quello di destinazione e'
char **D;
e la sorgente e' composta da N strighe allora
prima allochi lo spazio per i puntatori:
D =  calloc(N, sizeof(char *));
poi determini quanto e' lunga una delle stringhe sorgente
(tu dici che sono tutte uguali)
L = strlen(S[0]);
poi allochi lo spazio per N stringhe (quindi L+1 caratteri ciascuna)
e le copi.
for (i=0; i<N; i++)
{
    D[i] = malloc(L+1);
    if (D[i]==NULL) Errore("Miiiii! ho finito la memoria!!");
    strcpy(D[i],S[i]);
}
ciao,
g.

ora funziona grazieeeeeeee
no funzionava perchè dichiaravo la destinazione come char *d[]={0}
e alla fine dava errore.
mettendo char **d funziona.
scusa ma ** cosa significa? pointer to pointer?
grazie ancora


 scusa ma ** cosa significa? pointer to pointer?
Certo.
int A;
A contiene un intero
int *A;
A contiene un puntatore ad (una zona di memoria che contiene) un intero
int **A;
A contiene un puntatore ad puntatore che punta ad un intero.
Quindi
char **D;
dice che D conterra' un puntatore verso un puntatore a carattere.
e' come dire
char *D[100];
solo che cosi' allochi gia' automaticamente 100 puntatori a caratteri.
(e D implicitamente punta al primo dei 100 puntatori, e non puoi
modificare D.
invece con
char **D;
e' tua resposabilita' allocare gli elementi (che in questo caso
saranno puntatori a caratteri) puntati da D. Ma in questo caso
D e' modificabile.
ciao,
g.

In realtà ho risolto ancora più comodamente togliendo tutta la parte di
allocazione e chiamando solo d[i]=strdup(s[i]) che poi altro non è che
un malloc + strcpy tutto insieme


Ma per caso studi alla sapienza? Primo anno?