带有.h文件的两个链接的.c文件无法传递对全局双精度[][]的引用
关于这些问题有很多解释,但我似乎无法获得在.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;
#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时,它不应该自动得到它吗