C++ 在头文件中声明的函数中使用指向结构的指针

C++ 在头文件中声明的函数中使用指向结构的指针,c++,C++,我整个上午都在寻找如何做到这一点,但我找不到我想要的东西。我应该提到的是,我对C相当陌生 我正在尝试模块化我的代码(在我尝试这么做之前,它一直在工作) 目前在主代码中,我有: #include<stdio.h> #include<rfftw.h> #include<stdlib.h> #include<math.h> #include<string.h> #include <fstream> #include <iom

我整个上午都在寻找如何做到这一点,但我找不到我想要的东西。我应该提到的是,我对C相当陌生

我正在尝试模块化我的代码(在我尝试这么做之前,它一直在工作)

目前在主代码中,我有:

#include<stdio.h>
#include<rfftw.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include <fstream>
#include <iomanip>
#include<complex>
#include<omp.h>

struct basic_gal {
   double ra,dec,z,dist,fkp,nbar;
   double cp[3];
   double RSD[3];
};

struct basic_gal *gal; 
int NGAL_MAX =200000;

main() {

  if(!(gal = (struct basic_gal*)malloc(NGAL_MAX*sizeof(struct basic_gal))-1)) 
  printf("memory allocation problem for galaxies\n");

  etc etc..
}
我不知道如何解决这个问题。 任何帮助都将不胜感激

编辑:bin_gals.c的bin_NGP部分的实际内容为:

void bin_NGP(const char *data, int NGAL_MAX, int *NGAL, double *min_x, double *min_y        ,double *min_z, double *max_x, double *max_y ,double *max_z ,struct basic_gal *gal, int     flag) {

  FILE *fp_rand;
  if((fp_rand=fopen(data,"r"))==NULL) printf("data file %d not opened\n", flag);
  const int bsz=100; char buf[bsz];  
  fgets(buf, bsz, fp_rand);                         //header line
  while((fgets(buf, bsz, fp_rand))!=NULL) { 
  double ra, dec, cz; 
  sscanf(buf,"%lf %lf %lf\n",&ra,&dec,&cz);
  if(++NGAL>NGAL_MAX) { NGAL--; break; }
  gal[NGAL].ra = ra*pi/180.;
      gal[NGAL].dec = dec*pi/180.;
      gal[NGAL].z = cz;
      gal[NGAL].dist = calc_dp(gal[NGAL].z);
      gal[NGAL].cp[0] = (gal[NGAL].dist*cos(gal[NGAL].dec)*cos(gal[NGAL].ra)); 
      gal[NGAL].cp[1] = (gal[NGAL].dist*cos(gal[NGAL].dec)*sin(gal[NGAL].ra));
      gal[NGAL].cp[2] = (gal[NGAL].dist*sin(gal[NGAL].dec));
      if (flag ==1) {
        if (gal[NGAL].cp[0] > max_x) max_x = gal[NGAL].cp[0];
        if (gal[NGAL].cp[1] > max_y) max_y = gal[NGAL].cp[1];
        if (gal[NGAL].cp[2] > max_z) max_z = gal[NGAL].cp[2];

        if (gal[NGAL].cp[0] < min_x) min_x = gal[NGAL].cp[0];
        if (gal[NGAL].cp[1] < min_y) min_y = gal[NGAL].cp[1];
        if (gal[NGAL].cp[2] < min_z) min_z = gal[NGAL].cp[2];
      }         
    }
    fclose(fp_rand);
}
void bin_NGP(常量字符*data,int NGAL_MAX,int*NGAL,double*min_x,double*min_y,double*min_z,double*MAX_x,double*MAX_y,double*MAX_z,struct basic_gal*gal,int标志){
文件*fp_rand;
if((fp_rand=fopen(data,“r”))==NULL)printf(“数据文件%d未打开,\n”,标志);
常量int bsz=100;字符buf[bsz];
fgets(buf、bsz、fp_rand);//标题行
while((fgets(buf,bsz,fp_rand))!=NULL){
双ra、dec、cz;
sscanf(buf、%lf%lf%lf\n、&ra、&dec、&cz);
如果(++NGAL>NGAL_MAX){NGAL--;break;}
gal[NGAL].ra=ra*pi/180。;
gal[NGAL].dec=dec*pi/180。;
gal[NGAL].z=cz;
gal[NGAL].dist=calc_-dp(gal[NGAL].z);
gal[NGAL].cp[0]=(gal[NGAL].dist*cos(gal[NGAL].dec)*cos(gal[NGAL].ra));
gal[NGAL].cp[1]=(gal[NGAL].dist*cos(gal[NGAL].dec)*sin(gal[NGAL].ra));
gal[NGAL].cp[2]=(gal[NGAL].dist*sin(gal[NGAL].dec));
如果(标志==1){
如果(gal[NGAL].cp[0]>max_x)max_x=gal[NGAL].cp[0];
如果(gal[NGAL].cp[1]>max_y)max_y=gal[NGAL].cp[1];
如果(gal[NGAL].cp[2]>max_z)max_z=gal[NGAL].cp[2];
如果(gal[NGAL].cp[0]
我试图通过删除一些输入参数来简化问题。。也许我在掩饰一个错误

编辑:修正。为了清楚起见,我已经包括了固定的代码,以防任何人有相同的问题

void bin_NGP(const char *data, int NGAL_MAX, int *NGAL, double *min_x, double *min_y ,double *min_z, double *max_x, double *max_y ,double *max_z ,struct basic_gal *gal, int flag) {

  FILE *fp_rand;
  if((fp_rand=fopen(data,"r"))==NULL) printf("data file %d not opened\n", flag);
  const int bsz=100; char buf[bsz];  
  fgets(buf, bsz, fp_rand);                         //header line
  while((fgets(buf, bsz, fp_rand))!=NULL) { 
  double ra, dec, cz; 
  sscanf(buf,"%lf %lf %lf\n",&ra,&dec,&cz);
  if(++(*NGAL) > NGAL_MAX) { *NGAL--; break; }
  gal[*NGAL].ra = ra*pi/180.;
      gal[*NGAL].dec = dec*pi/180.;
      gal[*NGAL].z = cz;
      gal[*NGAL].dist = calc_dp(gal[*NGAL].z);
      gal[*NGAL].cp[0] = (gal[*NGAL].dist*cos(gal[*NGAL].dec)*cos(gal[*NGAL].ra)); 
      gal[*NGAL].cp[1] = (gal[*NGAL].dist*cos(gal[*NGAL].dec)*sin(gal[*NGAL].ra));
      gal[*NGAL].cp[2] = (gal[*NGAL].dist*sin(gal[*NGAL].dec));
      if (flag ==1) {
        if (gal[*NGAL].cp[0] > *max_x) *max_x = gal[*NGAL].cp[0];
        if (gal[*NGAL].cp[1] > *max_y) *max_y = gal[*NGAL].cp[1];
        if (gal[*NGAL].cp[2] > *max_z) *max_z = gal[*NGAL].cp[2];

        if (gal[*NGAL].cp[0] < *min_x) *min_x = gal[*NGAL].cp[0];
        if (gal[*NGAL].cp[1] < *min_y) *min_y = gal[*NGAL].cp[1];
        if (gal[*NGAL].cp[2] < *min_z) *min_z = gal[*NGAL].cp[2];
      }         
  }
  fclose(fp_rand);
}
void bin_NGP(常量字符*data,int NGAL_MAX,int*NGAL,double*min_x,double*min_y,double*min_z,double*MAX_x,double*MAX_y,double*MAX_z,struct basic_gal*gal,int标志){
文件*fp_rand;
if((fp_rand=fopen(data,“r”))==NULL)printf(“数据文件%d未打开,\n”,标志);
常量int bsz=100;字符buf[bsz];
fgets(buf、bsz、fp_rand);//标题行
while((fgets(buf,bsz,fp_rand))!=NULL){
双ra、dec、cz;
sscanf(buf、%lf%lf%lf\n、&ra、&dec、&cz);
如果(+(*NGAL)>NGAL_MAX){*NGAL--;break;}
gal[*NGAL].ra=ra*pi/180。;
gal[*NGAL].dec=dec*pi/180。;
gal[*NGAL].z=cz;
gal[*NGAL].dist=calc_-dp(gal[*NGAL].z);
gal[*NGAL].cp[0]=(gal[*NGAL].dist*cos(gal[*NGAL].dec)*cos(gal[*NGAL].ra));
gal[*NGAL].cp[1]=(gal[*NGAL].dist*cos(gal[*NGAL].dec)*sin(gal[*NGAL].ra));
gal[*NGAL].cp[2]=(gal[*NGAL].dist*sin(gal[*NGAL].dec));
如果(标志==1){
如果(gal[*NGAL].cp[0]>*max_x)*max_x=gal[*NGAL].cp[0];
如果(gal[*NGAL].cp[1]>*max_y)*max_y=gal[*NGAL].cp[1];
如果(gal[*NGAL].cp[2]>*max_z)*max_z=gal[*NGAL].cp[2];
如果(gal[*NGAL].cp[0]<*min_x)*min_x=gal[*NGAL].cp[0];
如果(gal[*NGAL].cp[1]<*min_y)*min_y=gal[*NGAL].cp[1];
如果(gal[*NGAL].cp[2]<*min_z)*min_z=gal[*NGAL].cp[2];
}         
}
fclose(fp_rand);
}

由于
main.c
中定义了
struct basic\u gal
,因此需要向前声明
struct basic\u gal*
,以声明
bin\u NGP()。但是,
struct basic_gal
的定义需要可用于
bin_NGP()
的定义,因此您应该将其定义从
main.c
移动到单独的模块中:

/* basic_gal.h */
#ifndef BASIC_GAL_DEFINITION
#define BASIC_GAL_DEFINITION

struct basic_gal {
   double ra,dec,z,dist,fkp,nbar;
   double cp[3];
   double RSD[3];
};

#endif
注意,如果这是C,则需要使用
struct basic\u gal


编辑后,这是有问题的行:

if(++NGAL>NGAL_MAX) { NGAL--; break; }
as
NGAL
是一个
int*
NGAL\u MAX
是一个
int
。解除对NGAL的引用

if(++*NGAL > NGAL_MAX) { (*NGAL)--; break; }
当用作数组索引时,取消对NGAL的引用:

gal[*NGAL].ra = ra*pi/180.;

您需要使main.c和bin_gals.c都能看到您的结构。将标题bin_gals.h修改为如下内容:

 #include <stdlib.h> 
 #include <fstream> 
 #include <iomanip> 
 #include <stdio.h> 
 #include <math.h> 
 #include <string>  

 struct basic_gal { 
    double ra,dec,z,dist,fkp,nbar; 
    double cp[3]; 
    double RSD[3]; 
 }; 

 void bin_NGP(int,int*,struct basic_gal*,int); 
#包括
#包括
#包括
#包括
#包括
#包括
结构基本语法{
双ra、dec、z、dist、fkp、nbar;
双cp[3];
双相对标准偏差[3];
}; 
void bin_NGP(int,int*,struct basic_gal*,int);
那么bin_gals.c看起来像

 #include "bin_gals.h"   
 #include <all_the_others>   

 void bin_NGP(int NGAL_MAX, int *NGAL, basic_gal *gal, int flag) {   

 /*read in files and add data etc*/   

 }   
#包括“bin_gals.h”
#包括
void bin_NGP(int NGAL_MAX,int*NGAL,basic_gal*gal,int flag){
/*读入文件并添加数据等*/
}   
您的主文件如下所示:

#include "bin_gals.h"      
#include <all_the_others>      

struct basic_gal *gal;        
int NGAL_MAX = 200000;      

main() {      

  if(!(gal = (struct basic_gal*)malloc(NGAL_MAX*sizeof(struct basic_gal))-1))       
  printf("memory allocation problem for galaxies\n");      

  int NGAL =0;      
  int *ipNGAL =&NGAL;      
  bin_NGP(NRAN_MAX,ipNGAL,gal,1);      
}      
#包括“bin_gals.h”
#包括
结构基本语法*gal;
int NGAL_MAX=200000;
main(){
如果(!(gal=(结构基本gal*)malloc(NGAL_MAX*sizeof(结构基本gal))-1))
printf(“星系的内存分配问题”);
int NGAL=0;
int*ipNGAL=&NGAL;
bin_NGP(NRAN_MAX,ipNGAL,gal,1);
}      

编译器说错误在
bin\u NGP
中,所以最好显示它的源代码。在bin\u gals.c的特定行上你怎么做?(150和151)你现在不给我们显示这个源。根据头文件,这是C++,不是C。我认为你需要使用Strut关键字将参数传递到函数BiNNGP:<代码>空洞BIN NGP(int nGalax Max,int *ngAl,结构Basic SGal*GAL,INT FLAG)< /Cal> @拉斯曼:…也是第一条错误消息。我已将代码添加到头文件中,以定义其中的结构,但仍然会收到所有相同的错误消息。@user1731810,正如您在发布
bin_NGP()
函数的正文时所评论的那样。感谢您修复了该错误,我已更改了该部分,但我仍然收到错误消息,如下所示above@user1731810,refr
gal[*NGAL].ra = ra*pi/180.;
 #include <stdlib.h> 
 #include <fstream> 
 #include <iomanip> 
 #include <stdio.h> 
 #include <math.h> 
 #include <string>  

 struct basic_gal { 
    double ra,dec,z,dist,fkp,nbar; 
    double cp[3]; 
    double RSD[3]; 
 }; 

 void bin_NGP(int,int*,struct basic_gal*,int); 
 #include "bin_gals.h"   
 #include <all_the_others>   

 void bin_NGP(int NGAL_MAX, int *NGAL, basic_gal *gal, int flag) {   

 /*read in files and add data etc*/   

 }   
#include "bin_gals.h"      
#include <all_the_others>      

struct basic_gal *gal;        
int NGAL_MAX = 200000;      

main() {      

  if(!(gal = (struct basic_gal*)malloc(NGAL_MAX*sizeof(struct basic_gal))-1))       
  printf("memory allocation problem for galaxies\n");      

  int NGAL =0;      
  int *ipNGAL =&NGAL;      
  bin_NGP(NRAN_MAX,ipNGAL,gal,1);      
}