2016-07-16 15 views
0

グローバルダブルへの参照を渡すことはできませんが、これらの事についての説明の多くがありますが、私は.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中の粒子[] [])にセグメンテーション違反

+1

2次元配列は2重ポインタではありません。また 'functions.c'が' rand() 'を使用する場合は、' #include 'が必要です。 'driver.h 'が別々の翻訳単位に含まれている場合、それらはそれぞれグローバル変数の独立したコピーを取得します - 「extern」を考慮してください。 – Dmitri

+0

独立したインクルード関数なしで書き直す方法はありますか?c? driver.cが持っているものにすべてのアクセス権を持つ裸の関数を持つには? –

+0

実際には、表示されたコードでは、 'main()'と同じように簡単に使うことができる、またはリテラルで置き換えられる 'limit_x'以外の' driver.h'のグローバル変数は実際には使用されません。 – Dmitri

答えて

1

あなたはlimit_xなどの変数の2つの化身を持っています。 externとし、.hファイルで初期化せずにすべての変数を宣言するためにあなたは持っていると思います。そして、あなたが、あなたの.cファイルのいずれかを選んで、を定義して、変数を初期化する必要があると思います。

+0

cells_xなどは正しい型ですか、それともdriver.hで定義したほうがよいでしょうか? –

+2

いいえ、 '.h'は宣言だけを持つべきです。定義は '.c'ファイル用です。 –

+0

ありがとう!それを修正します –

1

functions.cでは、rand()の定義が含まれているstdlib.hを含めていません。

そしてファイルfunctions.c、あなたの定義では(原因functions.c中の粒子[] [])にセグメンテーション違反

:2つの他の回答に加えて

+0

実行することによってdriver.cにリンクされているため、これを自動的に取得しないでください。 gcc -o driver_data.out driver.cfunction.c –

0

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]) {…} 

。何の "パッシング参照は" Cではありません。

は...グローバルダブル[] []

NBへの参照を渡すことはできません。詳細は、this SO postをご覧ください。

+0

まだこのセグメンテーションの値を編集できませんfunctions.cファイル内で動的に? –

+0

これはテストされ、動作しています。それ以外の場合は投稿していません。答えを慎重に読んでおらず、コードを修正したかもしれません。これら3つの答えには、コードを修正するために必要なものすべてが含まれます。 – user3078414

関連する問題