Newsgroup: it.comp.lang.c
Titolo: Aiuto sul passaggio di un punt...

Ciao a tutti, devo sottoporvi un problema a cui non riesco a venirne a capo.
Sono quasi 2 giorni che ci sono su, ho provato a leggere ovunque, ma 
proprio non ci salto fuori!!!
Ecco il mio problema:
dentro al file main.c ci sta:
int main(int argc, char *argv[]){
unsigned int dim=0;
int *v=NULL;
....
inserimentoVettore(v, &dim);
...}
mentre dentro un'altro file chiamato ordint.h ci sta la mia funzione:
void inserimentoVettore(int v[], unsigned int *dim){
  unsigned int n=0, i=0;
  printf("Quanti elementi nel vettore?\t");
  scanf("%u",&n);
  if ((NULL == (v = (int*)malloc(sizeof(int)*n)))){
    printf("Non c'è abbastanza memoria disponibile.\n");
    exit(1);}
  else{
    printf("Generazione casuale del vettore, attendere prego...\n");
    for (i=0; i<n; i++)
    v[i]=rand()%100; /*molto lento se n grande*/
    printf("Generazione ultimata.\n");
    printVett(v, n);}
  *dim=n;
  } /*chiusura primo else*/
}
bene il mio problema è questo: il vettore viene creato della dimensione e 
con gli elementi giusti, e dentro alla funzione riesco anche a 
visualizzarlo senza problemi, se però chiamo da main la funz printVett che 
appunto mi stampa il vettore mi vengono stampati dei numeri senza senso.
In effetti ho controllato facendo del debug e alla funz inserimentoVettore 
viene passato l'ind del puntatore, poi la malloc cambia questo indirizzo e 
poi il vettore viene riempito, e fin qui tutto ok. Quando però esce dalla 
funzione e ritorna alla main il mio vettore v si riprende il valore che 
aveva prima che venisse chiamata la malloc, cioè NULL!!!
Ma i puntatori non vengono sempre passati per indirizzo? Sembra proprio che 
nel mio caso il puntatore venga passato per valore ma tutto ciò non ha 
senso!!!
Vi prego aiutatemi, mi serve per passare un esame..
Ah, dimenticavo uso il compilatore gcc 2.96 sotto linux.
Bye.
Katte.

 
Scrivendo
    inserimentoVettore(v, &dim);
alla funzione passi il valore di v e l'indirizzo di dim.
all'interno della funzione il valore di v viene assegnato
alla variabile v (potevi scegliere un nome diverso!).
Con la malloc cambi il valore della variabile v locale
a inserimentoVettore, non quella di main.
Per cambiare la v di main devi passare il suo indirizzo.
es.
int main(void)
{
   int* v = NULL;
   inserimentoVettore(&v, &dim);
}
void inserimentoVettore(int** pV, unsigned int *pDim){
  ...
  int* tmpP = NULL;
  tmpP = malloc(...);
  *pV = tmpP;
  ...
}
 
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 C:\>iao Angelo
Ciao e grazie.
Katte.

un puntatore doppio giusto?
Puoi definire un puntatore doppio, o più semplicemente (risparmiando
la memoria occupata da un puntatore) passare l'indirizzo del puntatore
v.
la chiamata della funzione sarà
inserimentoVettore(&v, &dim);
e la dichiarazione della funzione sarà
void inserimentoVettore(int **v, unsigned int *dim){...}
Dovrai ovviamente cambiare anche la funzione, dovrai sostituire
*v ovunque compaia v
(*v)[espressione] ovunque compaia v[espressione]
le parentesi tonde servono perché
(*v)[espressione) == *(*v + espressione)  (corretta)
*v[espressione] == **(v + espressione)  (sbagliata)
gli operatori parentesi quadre hanno priorità sull'asterisco.
-- 
Cordiali saluti
  Artemio

devi passare il suo indirizzo (&v), in maniera del tutto analoga.
... a quanto fai per modificare una qualsiasi altra variabile. :-)
Periodo sospeso. ^__^
-- 
Cordiali saluti
  Artemio

Direi proprio che ho capito, infatti ho corretto il programma con i vostri 
aiuti e ora funziona a meraviglia!
Grazie mille Artemio e grazie mille Angelo.
Bye.
Katte.