Errore entrando in una funzione

di il
4 risposte

Errore entrando in una funzione

Salve a tutti,
a tempo di compilazione nessun errore, entrando nella seguente funzione ho un errore di Segmentation fault eseguendo il debugging.

Mat logGabor(matriz filter,Mat filter,double r_o,double theta_o,double sigma_theta, matriz radius,matriz theta,int cols,int rows,double sigma_r,int *padSize){

Mat rpad;
int k=*padSize;

printf("Welcome to the function"); //Here the error
...
Altre info: Ho creato un tipo matriz del tipo typedef double** matriz ed una funzione createmat che restituisce un double** e dove mi alloco lo spazio per la matrice e funziona.Ora nel main:

Mat chrRpad[4][5]; //chrOrient=4, chrScales=5
for(int i_or= i_or<chrOrient;i_or++){
  for(int i_sc=1;i_sc<chrScales;i_sc++){
     //some math calculation
     chrRpad[i_or-1][i_sc-1]=abs(logGabor(filter,imfft2,r_o,theta_o,sigma_theta,radius,theta,cols,rows,sigma_r,padSize));
  }
}

4 Risposte

  • Re: Errore entrando in una funzione

    Cosa sai sull'uso del debugger?
  • Re: Errore entrando in una funzione

    Scusa ma questa for

    for(int i_or= i_or<chrOrient;i_or++){

    è proprio così o hai dimenticato qualcosa?
  • Re: Errore entrando in una funzione

    No, ho mancato io del codice nel for, li e uguale a 1. del debugger nn ne so moltissimo, l utilita, come mettere breakpoint, avanzare al prossimo, avanzare alla seguente linea di codice,vedere le variabili,ecc. pero' sto usando il debugger d eclipse,che non è complicato.
  • Re: Errore entrando in una funzione

    Questa funzione è effettuata subito prima del for da cui elaboro la funzione logGAbor. Probabilmente puo' esserci qui un errore relazionato con la creazione di radius e theta.
    matriz ----> typedef double** matriz;
    Successivamente il matriz è allocato in una funzione che restituisce proprio un double** e riceve cols e rows. L allocazione è dinamica con new double*. Funziona bene
    
    void pre_filter_Computations(matriz radius,matriz theta,int cols,int rows){
    
      double X[rows][cols],Y[rows][cols];
      double x[cols],y[rows];
      double epsilon = 0.0001;
    
      for(int i=0;i<cols;i++){
          x[i]=((double)(i-cols)/2)/((double)cols/2);
      }
    
    
      for(int z=0;z<rows;z++){
           y[z]=-(((double)(z-rows)/2)/((double)rows/2));
       }
    
    //MESHGRID
    for(int m=0;m<rows;m++){     //Prima qui avevo cols nel meshgrid
      for(int n=0;n<cols;n++){   //prima avevo rows qui nel meshgrid
           X[m][n]=x[m];
           Y[m][n]=y[n];
      }
    }
    
          for(int a=0;a<rows;a++){
                for(int b=0;b<cols;b++){
    
                     X[a][b] = pow(X[a][b],2);
                     Y[a][b] = pow(Y[a][b],2);
                     X[a][b] = X[a][b] + Y[a][b];
                      radius[a][b] = sqrt(X[a][b]);
    
              }
          }
    
        radius[rows/2+1][cols/2+1]=1;
    
          for(int a=0;a<rows;a++){
               for(int b=0;b<cols;b++){
                   radius [a][b]= radius[a][b] + epsilon;
                   theta[a][b] = atan2(Y[a][b],X[a][b])*180/PI;
               }
          }
    }
    
    utilizzo del meshgrid da matlab:
    
    [X,Y] = meshgrid(x,y) transforms the domain specified by vectors x and y into arrays X and Y, which can be used to evaluate functions of two variables and three-dimensional mesh/surface plots. The rows of the output array X are copies of the vector x; columns of the output array Y are copies of the vector y.
    
    Avendo creato il vettore x generato dalle colonne ricevute nella funzione e y dalle righe, come è fatto nei primi due for della funzione, avevo messo nel for innestato prima un for relativo alle cols e poi uno relativo ai rows. cosi facendo mi veniva fuori che le righe e le colonne aumentavano vistosamente. In seguito cambiando e mettendo rows in precedenza ho risolto il problema della funzione anche se non sono sicuro che viene effettuato il meshgrid cosi come volevo. in effetti quel meshgrid crea due vettori bidimens che poi creeranno il mio radius che uso nella funzione in cui non posso entrare. magari l errore e creato in questa funzione proprio. Spero possiate aiutarmi e comuqnue grazie
Devi accedere o registrarti per scrivere nel forum
4 risposte