带有.h文件的两个链接的.c文件,无法传递对global double [] []的引用

时间:2016-07-16 19:44:27

标签: c linker segmentation-fault linker-errors

关于这些事情有很多解释,但我似乎无法在.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中的粒子[] []

3 个答案:

答案 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