グローバルダブルへの参照を渡すことはできませんが、これらの事についての説明の多くがありますが、私は.hの間と変数との基本的な概念を得るように見えることはできません。 cファイル。私は、言い換えれば、ファイルとその内容のレイアウトを変更することはできません。ここに私のコードは次のとおりです。.hファイルを持つ2つの.cリンクされたファイルは、[] []
driver.h
#ifndef VARIABLES_H
#define VARIABLES_H
//size limits for Pk
double limit_x;
double limit_y;
double limit_z;
//grid cells
int cells_x = 500;
int cells_y = 500;
int cells_z = 500;
extern double particles[][3];
extern double randMtoN();
extern int populateParticles();
#endif
driver.c
#include "driver.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
int main(int argc, char **argv) {
//seed rand()
srand((unsigned)time(NULL));
//add particles to box
limit_x = 200;
limit_y = 200;
limit_z = 200;
int particle_no = 10000;
double particles[particle_no][3];
//memset(particles, 0, sizeof particles);
populateParticles(limit_x, limit_y, limit_z, particle_no, particles);
printf("l\n");
printf("%d %f %f %f", 1, particles[0][0], particles[0][1], particles[0][2]);
}
functions.c:
double randMtoN(double M, double N) {
return M + (rand() * N);
}
int populateParticles(double limit_x, double limit_y, double limit_z, int particle_no, double **particles) {
//double particles[particle_no][3];
for (int i = 0; i < particle_no; i++) {
particles[i][0] = randMtoN(0, limit_x);
particles[i][1] = randMtoN(0, limit_y);
particles[i][2] = randMtoN(0, limit_z);
}
return 0;
}
私は何を得るには、この警告です:の暗黙的な宣言関数 'rand' [-Wimplicit-function-declaration] 戻り値M +(rand()* N);
そして、(原因functions.c中の粒子[] [])にセグメンテーション違反
2次元配列は2重ポインタではありません。また 'functions.c'が' rand() 'を使用する場合は、' #include 'が必要です。 'driver.h 'が別々の翻訳単位に含まれている場合、それらはそれぞれグローバル変数の独立したコピーを取得します - 「extern」を考慮してください。 –
Dmitri
独立したインクルード関数なしで書き直す方法はありますか?c? driver.cが持っているものにすべてのアクセス権を持つ裸の関数を持つには? –
実際には、表示されたコードでは、 'main()'と同じように簡単に使うことができる、またはリテラルで置き換えられる 'limit_x'以外の' driver.h'のグローバル変数は実際には使用されません。 – Dmitri