|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Nov 2010
Messaggi: 71
|
[C] vettore dinamico passato ad una funzione
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.
Codice:
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");
}
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. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12869
|
Il vm della funzione è una copia del puntatore che passi (che tra l'altro non è inizializzato).
Il problema è che eseguendo: Codice:
vm = malloc(...) 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: Codice:
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
}
Ricorda però che poi dovresti liberare la memoria, quindi devi decidere di chi è la responsabilità. Ultima modifica di WarDuck : 01-06-2011 alle 19:47. |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Nov 2010
Messaggi: 71
|
allora ho fatto come mi dicevi tu ma va in loop quando deve stampare. sapresti dirmi dov è che sbaglio ancora???
Codice:
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");
}
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12869
|
mat ed n dov'è che sono inizializzati?
max quanto vale? |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Nov 2010
Messaggi: 71
|
max è una costante. invece la matrice mat con la dimensione n è creata in una void riempi.
Codice:
#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");
}
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12869
|
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
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:00.




















