0

ファイルからデータを読み取って操作するコードを作成しています。アイデアは、グローバルな方法でデータをロードし、データに対していくつかの関数を使用して計算を実行することです。私が抱えている問題は、コンパイル時に次のエラーが発生することです。

' vertices' が宣言されていません (この関数で最初に使用されます)。

ヘッダー ファイルには次のものが含まれます。

typedef struct
{
    double x;
    double y;
    double z;
} variable;

メインでは、malloc と、「頂点」と呼ばれるこの「変数」の配列を使用する関数を呼び出します。

int main (void)
{   
    variable *vertices = (variable*) malloc( 5000 * sizeof (variable) ) ; 
    load_file();
    free(vertices);
    return 0;
}

関数 load_file ():

    FILE *fp1 ;
    fp1 = fopen( 'file',"r");
    if (fp1==NULL)
    {
        printf("File couldn't be opened or read!");
        return 1;
    }   

    int j = 0;
    while(fscanf(fp1, "%lf %lf %lf ", &vertices[j].x, &vertices[j].y, &vertices[j].z ) == 3 )
    {
        j++;
    }
    fclose(fp1);

実際には、 malloc をload_fileに入れるとコンパイルされて動作しますが、問題は、データを使用する他のさまざまな関数があり、 load_file で解放するとすべてが失われることです。メインの上の typedef を再定義すると、「以前の定義はここにありました」というメッセージが表示され、変数の頂点を追加すると、メインの前に、大量のエラーが発生します。

どうすればそのような問題を解決できますか?

4

2 に答える 2

3

問題は、main内で「頂点」を宣言しているため、そのスコープがmainに対してローカルになり、load_file()がそれを認識できないことです。

load_file()の宣言を次のように変更します。

void load_file( variable* vertices )
{
    /// blah blah
}

次に、メインで、頂点変数をそれに渡します...

int main (void)
{   
    variable *vertices = malloc( 5000 * sizeof (variable) ) ; 
    load_file( vertices );
    free(vertices);
    return 0;
}

編集:頂点をグローバル変数にすることはお勧めしません...つまり、意図せずにでも、頂点にアクセスしたり、変更したりすることができます。引数を世界中でグローバルに利用できるようにするよりも、引数を必要とする関数に引数を出し入れする方が、ほとんどの場合賢明です...スコープはあなたの友達です。

于 2013-03-21T19:52:49.027 に答える
1

ファイル内のすべての関数から にアクセスできるようにする場合verticesは、その宣言をmain()関数の外に移動し (つまり、グローバル スコープを指定し) 、関数内でのみ初期化します。main()

#include <stdlib.h>
#include <stdio.h>

typedef struct {
    double x;
    double y;
    double z;
} variable;

static variable *vertices = NULL;

int load_file() {
    FILE *fp1 ;
    fp1 = fopen( "file","r");
    if (fp1==NULL){
        printf("File couldn't be opened or read!");
        return 1;
    }

    int j = 0;
    while(fscanf(fp1, "%lf %lf %lf ", &vertices[j].x, &vertices[j].y, &vertices[j].z ) == 3 ){
        j++;
    }
    fclose(fp1);
    return 0;
}

int main (void){
    vertices = (variable*) malloc( 5000 * sizeof (variable) ) ;
    load_file();
    free(vertices);
    return 0;
}

verticesプログラム内のすべてのファイルでポインタにアクセスできるようにする場合は、そのstatic宣言からキーワードを削除して外部リンケージを指定します。

于 2013-03-21T19:50:28.563 に答える