Array bidimensionali

di il
8 risposte

Array bidimensionali

Ho un array bidimensionale che lo passo ad una funzione ma di cui non conosco le dimensioni!
In teoria per passarlo ad una funzione dovrei definire almeno la grandezza della seconda dimensione. Ho ovviato cosi'

void function(double *radius,double*theta,int rows,int cols);

radius e theta sono dichiarati come:

double *radius[rows][cols],*theta[rows][cols];

L' errore è sparito, ma la domanda è....E' fatto bene o puo' generare errore a Run-Time?
In teoria gli elementi sono nella stessa parte della memoria per cui un solo puntatore dovrebbe bastare!
GRAZIE

8 Risposte

  • Re: Array bidimensionali

    double *radius[rows][cols]
    Così definisci un array di array di puntatori a double
    double radius[rows][cols]
    Così definisci un array di array di double
  • Re: Array bidimensionali

    Si lo so, pero forse non mi sono spiegato bene io nella domanda, il fatto e ke devo usare puntatore di array bidimens....perche nn sapendo la dimensione dell array nn posso invocarla direttamente nella funzione altrimenti mi genera errore. In c vanno specificate tutte le dimensioni anche nell invocazione esclusa la prima! In questo modo per quando chiamo la stessa funzione mi da errore!
  • Re: Array bidimensionali

    È sbagliato il prototipo:
    
    //void function(double* radius,double* theta,int rows,int cols); errato
    void function(double** radius,double** theta,int rows,int cols);
    
    se è un vettore bidimensionale allora va passato come puntatore a puntatore.
  • Re: Array bidimensionali

    Avevo provato anche cosi pero mi dava errore alla chiamata, ora ho risolto anche questo ma ho un altro errore piu avanti!

    void pre_filter_Computations(double **radius, double **theta,int rows,int cols);

    double **radius,**theta;

    nella funzione pre_filter_Computations poi li setto, pero mi da errore nella malloc!

    void pre_filter_Computations(double **radius,double **theta,int cols,int rows){

    int a,b;
    double x[cols],y[rows];
    double X[cols][rows], Y[rows][cols];
    double epsilon=0.0001;


    a=cols;
    b=rows;

    for(int j=0;j<a;j++){
    for(int i=-(cols/2);i=((cols/2)-1);i++){
    x[j]= i/(cols/2);
    }
    }
    for(int k=0;k<b;k++){
    for(int z=-(rows/2);z=((rows/2)-1);z++){
    y[k]= z/(rows/2);
    }
    }

    for(int i=0;i<a;a++){
    for(int z=0;z<b;z++){
    X[z]=x;
    Y[z]=y[z];
    }
    }

    for(int a=0;a<rows;a++){
    for(int b=0;b<cols;b++){

    radius=malloc(sizeof(double)*rows);
    radius = *(sqrt((X[a]*X[a])+(Y[a]*Y[a])));

    //radius[(int)rows/2+1][(int)cols/2+1]=1;
    //radius [a]= radius[a] + epsilon;
    // theta[a] = atan2(Y[a],X[a])*180/PI;
    }
    }
    }

    Le ultime righe commentate le devo ancora cambiare. Gli errori che mi da sono:

    invalid conversion from 'void*' to 'double**'[-fPERMISSIVE ]

    e alla linea successiva alla malloc:
    invalid argument of unary '*' (have 'double')
  • Re: Array bidimensionali

    Qui siamo all'abc:
    
    int **eccetera = (int**) malloc(sizeof(int*) * row);
    for (k=0; k < row ; k++)
        eccetera[k]=(int*) malloc (sizeof(int) * col);
    
    eccetera[0][0]=0;
    //eccetera
    //eccetera
    //eccetera
    //...
    
    e usa quei maledetti tag code! clicca sul quel pulsante segreto dal nome code e metti il tuo codice li immezzo caspiterina usa anche un pò di tabulazione, non si capisce un tubercolo
  • Re: Array bidimensionali

    Ok hai ragione scusa!
    Ora l' unico problema me lo da quando invoco le malloc mi da come errore:

    cannot convert'double**'to 'double' in assignment

    se metto:
    radius=(double**)malloc(sizeof(double*)*rows);

    Non mi da errore

    
    
    void pre_filter_Computations(double **radius,double **theta,int cols,int rows){
    
      int a,b;
      double x[cols],y[rows];
      double X[cols][rows], Y[rows][cols];
      double epsilon=0.0001;
    
    
      a=cols;
      b=rows;
    
      for(int j=0;j<a;j++){
        for(int i=-(cols/2);i=((cols/2)-1);i++){
          x[j]= i/(cols/2);
        }
      }
      for(int k=0;k<b;k++){
          for(int z=-(rows/2);z=((rows/2)-1);z++){
                y[k]= z/(rows/2);
          }
      }
    
      for(int i=0;i<a;a++){
          for(int z=0;z<b;z++){
              X[i][z]=x[i];
              Y[i][z]=y[z];
          }
      }
    
         **radius=(double**)malloc(sizeof(double*)*rows);
           for(int k=0;k<cols;k++){
               radius[k]=(double*)malloc(sizeof(double*)*cols);
          }
         
           **theta=(double**)malloc(sizeof(double*)*rows);
                for(int z=0;z<cols;z++){
                  theta[z]=(double*)malloc(sizeof(double*)*cols);
                }
    
             for(int a=0;a<rows;a++){
                  for(int b=0;b<cols;b++){
                   
                        radius[a][b] = sqrt((X[a][b]*X[a][b])+(Y[a][b]*Y[a][b]));
                        radius[(int)rows/2+1][(int)cols/2+1]=1;
                        radius [a][b]= radius[a][b] + epsilon;
                        theta[a][b] = atan2(Y[a][b],X[a][b])*180/PI;
    
          }
      }
    }
    
    
  • Re: Array bidimensionali

    
    for(i=-(cols/2);i=((cols/2)-1);i++) //errato
    for(i=-(cols/2);i==((cols/2)-1);i++) //giusto
    for(i=0;i<a;a++)//errato
    for(i=0;i<a;i++)//giusto
    
    
    **radius=(double**)malloc(sizeof(double*)*rows);
    radius[k]=(double*)malloc(sizeof(double*)*cols);
    
    ma per fortuna che il compilatore non si è ancora ubriacato.

    è poi errato allocare memoria di un puntatore passato(non me ne ero accorto prima),in questo caso lo devi passare come *** perchè vuoi accedere alla variabile e non alla sua copia,ti ricordo che:
    void funzione (int *val);
    crea un nuovo puntatore che punta alla stessa area di memoria della variabile passata,se vuoi puntare direttamente alla memoria della variabile diventa:
    void funzione (int **val);
    nel tuo caso:
    
    void pre_filter_Computations(double ***radius,double ***theta,int cols,int rows)
    
    Per non diventare psicopatico nella gestione del triplo puntatore ti conviene fare cosi:
    
    void pre_filter_Computations(double ***radius,double ***theta,int cols,int rows)
    {
        double **rad;
        double **the;
        //uso rad e the al posto di radius e theta.
        // alla fine:
        *radius=rad;
        *theta=the;
    }
    
    dimenticavO:
    naturalmente dovrai passare tutto per indirizzo:
    
    double **a=NULL;
        double **b=NULL;
    
        pre_filter_Computations(&a,&b,3,3);
    
  • Re: Array bidimensionali

    Mi sono dimenticato di farti vedere la forma piu complessa:
    
    void pre_filter_Computations(double ***radius,double ***theta,int cols,int rows)
    {
        int k,z;
    
         *radius=(double**)malloc(sizeof(double*)*rows);
           for(k=0;k<cols;k++)
               (*radius)[k]=(double*)malloc(sizeof(double)*cols);
    
          *theta=(double**)malloc(sizeof(double*)*rows);
                for(z=0;z<cols;z++)
                  (*theta)[z]=(double*)malloc(sizeof(double)*cols);
    
           (*radius)[0][0]=0;
    }
    
Devi accedere o registrarti per scrivere nel forum
8 risposte