2012-10-09 155 views
0

宣布我一直在寻找一上午都如何做到这一点,我不能完全找到我要寻找一个函数使用指针的结构。我要指出,我是相当新的C.在在头文件

我想modulise我的代码(即工作,直到我试图做到这一点)

目前在主要的代码我有:

#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.. 
} 

然后我继续阅读文件并将各种属性分配给结构。 我想做的是将空结构(或指向它的指针)传递给函数,在函数中填充结构的元素,然后将其返回以在我的主程序中再次使用。

这需要3个文件,在main.c中,头文件,header.h和包含的功能操作bin_gals.c

在头文件中的文件,我有

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

void bin_NGP(int,int*,struct basic_gal*,int); 

在该bin_gals.c文件我有

#include "header.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*/ 

} 

而且main.c文件中我有

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

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"); 

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

的问题是,我想我不能正常传递结构,但无法弄清楚如何做到这一点。

我的错误消息看起来像

bin_gals.c: In function ‘void bin_NGP(int, int*, basic_gal*, int)’: 
bin_gals.c:150: error: ISO C++ forbids comparison between pointer and integer 
bin_gals.c:151: error: invalid types ‘basic_gal*[int*]’ for array subscript 

,我不知道如何解决这个问题。 任何帮助将不胜感激!

编辑: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(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); 
} 
+1

编译器说:错误在'bin_NGP'中,所以最好显示它的来源。 –

+1

你在bin_gals.c的特定行上做了什么? (150和151)你目前没有向我们显示该来源。 – Bart

+2

通过头文件判断,这是C++,而不是C. –

回答

1

您需要转发为bin_NGP()的声明中声明struct basic_gal*struct basic_galmain.c定义。然而,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 

注意,如果这是你需要使用struct basic_gal℃。


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

if(++NGAL>NGAL_MAX) { NGAL--; break; } 

作为NGALint*NGAL_MAXint。取消引用NGAL:使用作为数组索引时

if(++*NGAL > NGAL_MAX) { (*NGAL)--; break; } 

提领NGAL

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

好的,谢谢你的帮助,我会试试这个。 – user1731810

+0

我已经将代码添加到头文件中,以定义那里的结构,但我仍然得到所有相同的错误消息。 – user1731810

+0

@ user1731810,因为您已经评论过您需要发布'bin_NGP()'函数主体的问题。 – hmjd

0

你需要让你的结构可见双方的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); 

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*/ 

} 

而且你的主要文件将是这样的:

#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);  
}  
+0

谢谢你的时间。我刚刚尝试过,但仍收到相同的消息。 – user1731810