2012-11-22 4 views
-1

Je suis assez nouveau en C++ et j'essaie d'apprendre à utiliser des pointeurs. J'ai le fichier suivant qui crée des coordonnées, puis les déplace dans des directions aléatoires en utilisant un générateur de nombres aléatoires.L'expression doit avoir un pointeur vers le type de fonction

La valeur sigmaf_point est introduite à partir d'un fichier texte:

void methane_coords(double *&sigmaf_point) 

double dummy_int = 1; 
string dummystring; 
     string s; 

     ifstream Dfile; 
     std::stringstream out; 

     out << 1; 
     s = out.str() + ".TXT"; 
     Dfile.open (s.c_str()); 

     if (Dfile.fail()) 
     { 
      return; 
     } 

     for (int i=0; i<dummy_int; i++) 
     { 
     Dfile >> sigmaf_point[i]; 
     } 

que j'utilise alors dans une autre fonction:

double initial_energy(double **coords_fluid, const double *box_size){ 


// Loop over all pairs of atoms and calculate the LJ energy 
double total_energy = 0; 

for (int i = 0; i <= n_atoms-1; i++) 
{ 

     sf1=sigmaf_point(coords_fluid[i][3]); 
     ef1=epsilonf_point(coords_fluid[i][3]); 

     // Energy fluid-fluid 
     for (int j = i+1; j <= n_atoms-1; j++) 
     {    
      sf2=sigmaf_point(coords_fluid[j][3]); 
      ef2=epsilonf_point(coords_fluid[j][3]);    

      double delta_x = coords_fluid[j][0] - coords_fluid[i][0]; 
      double delta_y = coords_fluid[j][1] - coords_fluid[i][1]; 
      double delta_z = coords_fluid[j][2] - coords_fluid[i][2]; 

      // Apply periodic boundaries 
      delta_x = make_periodic(delta_x, box_size[0]); 
      delta_y = make_periodic(delta_y, box_size[1]); 
      delta_z = make_periodic(delta_z, box_size[2]); 

      // Calculate the LJ potential 
      s=(sf1+sf2)/2.0; 
      e=pow((ef1*ef2),0.5); 
      double r = pow((delta_x*delta_x) + (delta_y*delta_y) + 
         (delta_z*delta_z),0.5)/s; 

     double e_lj = 4*((1/pow(r,12.0))-(1/pow(r,6.0))/e); 

     total_energy = (total_energy + e_lj); 
     } 
    } 

coords_fluid est créé dans le fichier principal comme ceci:

double **coords_fluid = new double*[5000]; 

Maintenant, le problème est avec sf1 = sigmaf_point (coords_fluid [i] [3]); J'ai l'erreur "l'expression doit avoir un pointeur sur le type de fonction" pour sigmaf_point. Je suis un peu confus à ce sujet, je sais que c'est à propos de la façon dont j'appelle la variable, mais je n'arrive pas à la résoudre.

Vive

+0

pouvez-vous fournir un [sscce] (http://sscce.org/)? – Default

+1

quand je google le message d'erreur, je trouve beaucoup d'informations. Quelle enquête avez-vous faite pour résoudre ce problème? – Default

Répondre

0

Tout d'abord: Rereference des pointeurs sont inutiles car il completly un pointeur est déjà une sorte de référence. Changez donc double *& en double * ou double &. Ce sera plus rapide. En outre, je vois que vous utilisez sigmaf_point en tant que fonction et en tant que tableau. Lequel est-ce? Pourriez-vous donner la déclaration de sigmaf_point?

En supposant qu'il est un changement de tableau

sf1 = sigmaf_point(coords_fluid[i][3]); 

à

sf1 = sigmaf_point[coords_fluid[i][3]]; 
Questions connexes