0

これを行う方法を午前中ずっと探していましたが、探しているものがまったく見つかりません。私は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..
}

次に、ファイルを読み込み、さまざまな属性を構造体に割り当てます。私がやりたいことは、空の構造体 (またはそれへのポインター) を関数に渡し、関数内の構造体の要素を埋めてから、それを返してメイン プログラムで再び使用することです。

これには、main.c、ヘッダー ファイル、header.h、および関数アクション bin_gals.c を含むファイルの 3 つのファイルが必要です。

私が持っているヘッダーファイルで

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

2 に答える 2

1

で定義されているasstruct basic_gal*の宣言には、前方宣言が必要です。ただし、 の定義は の定義で使用できる必要があるため、その定義を別のモジュールに移動する必要があります。bin_NGP()struct basic_galmain.cstruct basic_galbin_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_gal


編集後、これは問題のある行です:

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

そのままNGALでありint*NGAL_MAXですint。逆参照NGAL:

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

NGAL配列インデックスとして使用する場合の逆参照:

gal[*NGAL].ra = ra*pi/180.;
于 2012-10-09T14:15:38.710 に答える
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);      
}      
于 2012-10-09T14:19:33.060 に答える