2012-10-09 196 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