2011-12-14 13 views
0

いくつかのファイル間で複数のグローバルポインタを共有する必要があります。ポインタは本質的には実行時に長さが決まるdoubleの配列です。Cポインタ - 別のファイルでグローバルポインタを1つのファイルに割り当てますか?

ここには、問題の原因となったコードが含まれています。これは、正確なコードではないが、それは正確にすべてのポイントを示す:

foo.hという

#ifndef FOOH 
#define FOOH 

/* ------------------ 
COMMON VARIABLES 
---------------------*/ 

// create_bundles.c 
extern double *all_bundle; 

/* ------------------ 
COMMON FUNCTIONS 
---------------------*/ 

// create_bundles.c 
void create_bundles(int num_firm); 

// memory_allocation.c 
void allocate_memory(int num_firm, int num_bundle); 
void clean_memory(void); 
#endif 

create_bundles.c

#include "foo.h" 
extern double *all_bundle; 

void create_bundles(int num_firm) { 
int i; 
    for (i = 0; i < num_firm; i++) { 
     all_bundle[i] = 1 
    } 

memory_allocation.c

#include "foo.h" 

// create_bundles.c 
double *all_bundle = NULL; 

void allocate_memory(int num_firm, int num_bundle) { 
    all_bundle = calloc(num_bundle * num_firm, sizeof(double)); 
} 
void clean_memory(void) { 
    free(all_bundle); 
} 

主.c

#include "foo.h" 
void main(int num_firm, int num_bundle) { 
    allocate_memory(num_firm, num_bundle); 
    create_bundles(num_firm); 
    clean_memory(); 
} 

私がall_bundle [i]を印刷すると、すべて0になるので、セグメント化エラーが発生します。

なぜエラーとそれを修正するのですか?

+3

すべてのコードを見ることなく、明確ではありません。しかし、グローバルにファイルを共有しても問題はありません。ポインタを初期化する関数が実際にポインタを修正する(** doubleの引数を取る)だけでなく、ポインタのローカルコピーを変更するのではないことを再確認します – TJD

+0

あなたがinucude foo.h(または ' all_bundle')を使用してすべてのモジュール(* .c)に送信しますか? – alk

+0

私は 'num_firm'の値が何であるかチェックします。デバッグで問題を見つけるのは簡単なはずです。 – Sulthan

答えて

0

問題はグローバルポインタではなく、他のものです。 共通コードで問題を探し続ける。私はあなたがclean_memoryを呼び出す前に、all_bundle配列の内容を表示しようとしていることを願っています。あなたのコードを少し編集しました。セグメンテーションエラーがなくてもうまく動作し、1.0000を出力します。ここでは、見て、次のとおりです。
がfoo.h:

#ifndef FOOH 
#define FOOH 

// create_bundles.c 
extern double *all_bundle; 

// create_bundles.c 
void create_bundles(int num_firm); 

// memory_allocation.c 
void allocate_memory(int num_firm, int num_bundle); 
void clean_memory(void); 

#endif 

memory_allocation.c:

#include <stdlib.h> 

#include "foo.h" 

double *all_bundle = 0; 

void allocate_memory(int num_firm, int num_bundle) { 
    all_bundle = calloc(num_bundle * num_firm, sizeof(double)); 
} 
void clean_memory(void) { 
    free(all_bundle); 
} 

create_bundles.c:

#include "foo.h" 

void create_bundles(int num_firm) { 
    int i; 
    for (i = 0; i < num_firm; i++) { 
     all_bundle[i] = 1; 
    } 
} 

main.c:

#include <stdio.h> 
#include "foo.h" 

int main(int argc, char *argv[]) { 
    allocate_memory(100, 1); 
    create_bundles(100); 

    { 
     int i; 
     for(i = 0; i < 100; ++i) 
      printf("%f\n", all_bundle[i]); 
    } 

    clean_memory(); 
    return 0; 
} 
+0

あなたは正しいです。問題は他にもありました。赤ちゃんだった。ありがとう。 – user18115

0

メモリにアクセスするためのヘッダファイルを用意しています(つまり、メモリにデータを追加したり、メモリからデータを削除したり、readfビットなど)。 マジックを行うには、対応する.c(またはそれが気になる場合は.cpp)を持ってください。そして、staticを使用してメモリを定義します。

これは問題に対する簡単で簡単な解決方法であり、実行が必要な場合は実装を変更することもできます。

+0

私はこの答えを理解していません。質問のコードを見て、あなたが意味するものを指定するのを助けることができますか?ありがとう。 – user18115

関連する問題