PDA

View Full Version : [C] vettore dinamico passato ad una funzione


mame83
01-06-2011, 16:57
Ciao a tutti ho il seguente problema: una volta creato un vettore dinamico in una funzione non riesco a stamparlo nel main mentre nella funzione stessa si.

void copia(int matrice[max][max],int dim, int *vm)
{
int i,j,k;
vm=(int*)malloc(sizeof(int)*dim*dim);

k=0;
for(i=0; i<dim; i++)
for(j=0; j<dim; j++)
{
vm[k]=matrice[i][j];
k=k+1;
}
/*printf("vettore uguale a : \n");
for (i=0; i<dim*dim; i++)
printf("%d ",vm[i]);
printf("\n");*/

}
int main()
{
int mat[max][max],*vet;
int n,i,maggiore;
copia(mat,n,vet);/*copiamo matrice nel vettore */
for (i=0; i<n*n; i++)
printf("%d ",vet[i]);
printf("\n");
system("PAUSE");
}

dove copia è una funzione in cui copio una matrice nXn in un vettore nxn.
il vettore lo dichiaro nel main come puntatore ad un intero e lo creo nella funzione con una malloc.
Il problema e che se lo faccio stampare nella funzione copia me lo stampa correttamente, invece se lo stampo come nell esempio nel main mi da valori sballati.
Spero mi aiutate grazie in anticipo.

WarDuck
01-06-2011, 18:44
Il vm della funzione è una copia del puntatore che passi (che tra l'altro non è inizializzato).

Il problema è che eseguendo:

vm = malloc(...)

stai modificando la copia interna alla funzione.

Per cui vet non viene mai modificato.

Le soluzioni possibili sono 3:

1) fai ritornare vm direttamente alla funzione, senza necessità di passare il parametro dall'esterno

2) inizializzi vet fuori dalla funzione

3) usi un puntatore doppio

In particolare nel caso 3:


main()
{
int* vet = NULL;

copia (..., &vet); // passi l'indirizzo della variabile vet
}

copia(..., int** vm)
{
*vm = malloc(..); // cambio il valore di vet dall'interno della funzione
...
// ciclo su *vm
}


Salvo casi particolari io userei uno dei primi due metodi che ti ho elencato.

Ricorda però che poi dovresti liberare la memoria, quindi devi decidere di chi è la responsabilità.

mame83
02-06-2011, 08:07
allora ho fatto come mi dicevi tu ma va in loop quando deve stampare. sapresti dirmi dov è che sbaglio ancora???

void copia(int matrice[max][max],int dim, int **vm)
{
int i,j,k;
*vm=(int*)malloc(sizeof(int)*dim*dim);


k=0;
for(i=0; i<dim; i++)
for(j=0; j<dim; j++)
{
*vm[k]=matrice[i][j];
k=k+1;
}
}
int main()
{
int mat[max][max];
int n,i,maggiore;
int *vet=NULL;
copia(mat,n,&vet);
for (i=0; i<n*n; i++)
printf("%d ",vet[i]);
printf("\n");
system("PAUSE");
}

WarDuck
02-06-2011, 09:10
mat ed n dov'è che sono inizializzati?

max quanto vale?

mame83
02-06-2011, 09:48
mat ed n dov'è che sono inizializzati?

max quanto vale?

max è una costante. invece la matrice mat con la dimensione n è creata in una void riempi.


#define max 10
int main()
{
int mat[max][max];
int n,i,maggiore;
int *vet=NULL;
riempi(mat,&n);
stampa(mat,n);


copia(mat,n,&vet);/*copiamo matrice nel vettore */
for (i=0; i<n*n; i++)
printf("%d ",vet[i]);
printf("\n");

printf("valore di n e' %d \n",n);
system("PAUSE");
}

spero di essere stato piu chiaro

WarDuck
02-06-2011, 10:25
Sarebbe utile vedere il codice della funzione riempi, perché da quanto vedo dal codice n per me non viene inizializzato, forse lo inizializzi in riempi, ma con i forse in informatica non si va da nessuna parte :D.