Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有.h文件的两个链接的.c文件无法传递对全局双精度[][]的引用_C_Linker_Segmentation Fault_Linker Errors - Fatal编程技术网

带有.h文件的两个链接的.c文件无法传递对全局双精度[][]的引用

带有.h文件的两个链接的.c文件无法传递对全局双精度[][]的引用,c,linker,segmentation-fault,linker-errors,C,Linker,Segmentation Fault,Linker Errors,关于这些问题有很多解释,但我似乎无法获得在.h和.c文件之间有变量的基本概念。可以说,我无法更改文件及其内容的布局。这是我的密码: 司机 #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;

关于这些问题有很多解释,但我似乎无法获得在.h和.c文件之间有变量的基本概念。可以说,我无法更改文件及其内容的布局。这是我的密码:

司机

#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
司机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]);         
}
#包括“driver.h”
#包括
#包括
#包括
#包括
int main(int argc,字符**argv){
//种子兰德()
srand((无符号)时间(NULL));
//将粒子添加到长方体
极限_x=200;
极限值y=200;
极限_z=200;
int particle_no=10000;
双粒子[particle_no][3];
//memset(粒子,0,粒子大小);
粒子(极限x、极限y、极限z、粒子数、粒子数);
printf(“l\n”);
printf(“%d%f%f%f”,1,粒子[0][0],粒子[0][1],粒子[0][2]);
}
职能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;

}
double randMtoN(双M,双N){
返回M+(rand()*N);
}
整数粒子(双极限x,双极限y,双极限z,整数粒子号,双**粒子){
//双粒子[particle_no][3];
对于(int i=0;i
我得到的是这个警告:函数“rand”[-Wimplicit函数声明]的隐式声明 返回M+(rand()*N)


然后是一个segfault(由于functions.c中的粒子[][])

您有两个
limit\ux
etc变量的化身。您必须使用
extern
声明所有变量,而不在
.h
文件中进行初始化。然后,您必须选择一个
.c
文件,并在那里定义和初始化变量。

您有两个
limit\ux
etc变量的化身。您必须使用
extern
声明所有变量,而不在
.h
文件中进行初始化。然后,您必须选择一个
.c
文件,并在那里定义和初始化变量。

在functions.c中,您没有包括
stdlib.h
,它包含
rand()的定义。c您没有包括
stdlib.h
,它包含
rand()的定义

除了其他两个答案外:

然后是一个segfault(由于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]
以及
分段错误
执行错误

应改为:

int populateParticles(double limit_x, double limit_y, double limit_z, int particle_no, double particles[][3]) {…}
导致预期的行为

…无法传递对全局双精度[][]的引用


NB:在C中没有“传递引用”。如需进一步阅读,请参阅。

以及其他两个答案:

然后是一个segfault(由于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]
以及
分段错误
执行错误

应改为:

int populateParticles(double limit_x, double limit_y, double limit_z, int particle_no, double particles[][3]) {…}
导致预期的行为

…无法传递对全局双精度[][]的引用


NB:在C中没有“传递引用”。如需进一步阅读,请参阅。

2D数组不是双指针。另外,如果
functions.c
使用
rand()
,则需要
#包括
。如果<代码>驱动程序> h <代码>被包含在单独的翻译单元中,它们将各自获得全局VARS的独立副本——考虑<代码> ExtNe>代码>。是否有一种方法可以在没有单独的函数包含的情况下重写它?只是为了拥有一个能够访问driver.c所拥有的全部权限的裸函数?实际上,在您所展示的代码中,
driver.h
中没有任何全局变量被实际使用,除了
limit\u x
等,这可能很容易成为
main()的本地变量
或由文本替换。如果
driver.c
需要头文件中的声明,它必须
包含它。。。你真的绕不过去。但为什么这会是一个问题呢?此外,您的崩溃可能是由于将
double
particles
main()
)的2D数组传递给一个将其视为
double**
的函数,这是不等价的。如何正确传递该数组(或引用该数组)这样我就可以从functions.c中将其修改为全局变量了?2D数组不是双指针。另外,如果
functions.c
使用
rand()
,则需要
#包括
。如果<代码>驱动程序> h <代码>被包含在单独的翻译单元中,它们将各自获得全局VARS的独立副本——考虑<代码> ExtNe>代码>。是否有一种方法可以在没有单独的函数包含的情况下重写它?只是为了拥有一个能够访问driver.c所拥有的全部权限的裸函数?实际上,在您所展示的代码中,
driver.h
中没有任何全局变量被实际使用,除了
limit\u x
等,这可能很容易成为
main()的本地变量
或由文本替换。如果
driver.c
需要头文件中的声明,它必须
包含它。。。你真的绕不过去。但为什么这会是一个问题呢?此外,您的崩溃可能是由于将
double
particles
main()
)的2D数组传递给一个将其视为
double**
的函数,这是不等价的。如何正确传递该数组(或引用该数组)这样我就可以从functions.c中修改它作为一个全局变量了?当它通过运行gcc-o driver\u data.out driver.c函数链接到driver.c时,它不应该自动得到它吗?当它通过运行gcc-o driver\u da链接到driver.c时,它不应该自动得到它吗