关于这些事情有很多解释,但我似乎无法在.h和.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中的粒子[] []
答案 0 :(得分:1)
你有两个limit_x
等变量的化身。您必须使用extern
声明所有变量,而不必在.h
文件中初始化。然后你必须选择一个.c
文件和定义并在那里初始化变量。
答案 1 :(得分:1)
在functions.c中,您未包含stdlib.h
,其中包含rand()
的定义。
答案 2 :(得分:0)
除了另外两个答案:
然后是段错误(由于functions.c中的粒子[] []
在文件functions.c
中,您的定义是:
int populateParticles(double limit_x, double limit_y, double limit_z, int particle_no, double **particles) {…}
导致编译器警告:
incompatible pointer types passing 'double [particle_no][3]' to parameter of
type 'double **' [-Wincompatible-pointer-types]
和Segmentation fault
执行错误
应改为:
int populateParticles(double limit_x, double limit_y, double limit_z, int particle_no, double particles[][3]) {…}
导致预期的行为。
...无法传递对全局double [] []
的引用
NB :没有&#34;传递参考&#34;在 C 。如需进一步阅读,请参阅this SO post。