Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    65

    [C]vettore dinamico passato alla funzione

    Ciao a tutti ho il seguente problema: una volta creato un vettore dinamico in una funzione non riesco a stamparlo nel main.
    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");
    }
    dove copia è una void in cui copio una matrice di dimensione n*n in un vettore ovviamente n*n
    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. #2

    Re: [C]vettore dinamico passato alla funzione

    Originariamente inviato da mame83
    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");
    }
    Intanto nel main() inizializza n a max, altrimenti allochi un array di cui non conosci la dimensione (a seconda del valore dell'int non inizializzato).
    Poi devi passare alla funzione un puntatore a vet (quindi **vm) perchè altrimenti funzionerebbe cone le normali variabili (anche un puntatore è una variabile come le altre) e verrebbe copiato per valore. Altrimenti puoi passare un reference a puntatore (*&vm) per evitare di dereferenziare il puntatore a puntatore ogni volta.
    lolide
    Java Programmer

    Informati

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326

    Re: Re: [C]vettore dinamico passato alla funzione

    Originariamente inviato da lolide
    Altrimenti puoi passare un reference a puntatore (*&vm) per evitare di dereferenziare il puntatore a puntatore ogni volta.
    Attenzione che i reference sono una caratteristica del C++, mentre l'op parlava di C. L'unica soluzione rimane quella del doppio puntatore (in realtà si potrebbe anche dichiarare il puntatore locale alla funzione e poi restituirlo al main(), avendo comunque cura in ogni caso di deallocare la memoria poi).
    every day above ground is a good one

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    65
    allora ho passato il vettore con il doppio puntatore. ma quando va a stampare va in loop mi dite dove sbaglio ancora???? grazie
    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];
      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");
    }
    Come vedete n viene inizializzato nella void riempi. quindi non è n il problema. spero mi aiutate di nuovo grazie

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Così ad occhio devi sostituire *vm[k] nella funzione con (*vm)[k] (ci sono due righe in cui lo hai scritto). Se continui ad avere problemi posta tutto il codice, dato che l'errore potrebbe essere anche altrove.
    every day above ground is a good one

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    65
    GRAZIE funziona prima non lo stampava nemmeno nella funzione era quello il problema delle parentesi tonde.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.