1

私は C が初めてで、このポインタと参照が少し難しすぎて理解できないと言わざるを得ません。私は Java から来たので、これは実際には何も存在せず、慣れると、今のように少し迷ってしまうこともあります。

私はヘッダーファイルを持っています:

globals.h
    typedef struct {
    float *array;
    size_t used;
    size_t size;
} points;
extern points readedPoints;

そして、別のファイルで使用したい関数を持つ .c クラスがあります。

        graph.c

    #include "globals"

    points readedPoints;

    void readFile( char* filename)
    {

        ...
            ...
    // I read floats from a file and store it in my
    // readedPoints. When i print, they are all there


            for(i=0; i < readedPoints.used;++i){                
                //fprintf(stderr, "%d", graphIndices[i]);
                fprintf(stderr, " %f\n", readedPoints.array[i]);
            }
    }

次に、その関数を使用している.cで:

 init.c

#include "globals.h"

void Init(...){

   readFile("graph1.txt");

// here i do that same for-loop to check if 'readedPoints' can be accessed here, but it cant.

for(i=0; i < readedPoints.used;++i){                
            //fprintf(stderr, "%d", graphIndices[i]);
            fprintf(stderr, " %f\n", readedPoints.array[i]);
        }
}

理由がわかりません。extern として宣言しました。すでに readFile 関数内の「graph.c」で初期化されていましたが、他の .c ファイルでは使用できません。私の理由と私が間違っていることを説明してください。どうもありがとうございました

編集。エラーが表示されます: この最後の for ループでアクセス違反の読み取り場所

ここに画像の説明を入力

編集:読み取り機能全体:

void readFile( char* filename)
{

    int i;
    int j;
    float n;
    int nn;
    int tags_x;

    int nrLines;
    int nrColumns;
    FILE* fp = fopen( filename, "r" );

    if ( fp == NULL )
    {
        fprintf( stderr, "ERRO na leitura do ficheiro %s\n", filename );
        exit( EXIT_FAILURE );
    }

    /* Read the number of lines */
    fscanf( fp, "%d", &nn );
    nrLines = nn;

    initFPoints(&readedPoints, nrLines*10);

    for(i = 0; i < nrLines-2;i++)
    {  
    for(j = 0; j < nrColumns;j++)
    {  
            //printf ("%f ", i);
            fscanf (fp, "%f", &n);
            //fprintf(stderr, " %f\n", n);
            insertFPoints(&readedPoints, n);
    }}
    fclose( fp );

// here it prints exactly what i want
//      for(i=0; i < readedPoints.used;++i){                
//          //fprintf(stderr, "%d", graphIndices[i]);
//          fprintf(stderr, " %f\n", readedPoints.array[i]);
//      }

}

void initFPoints(points *a, size_t initialSize) {
    a->array = (float *)malloc(initialSize * sizeof(float));
    a->used = 0;
    a->size = initialSize;
}

void insertFPoints(points *a, float element) {
    if (a->used == a->size) {
        a->size *= 2;
        a->array = (float *)realloc(a->array, a->size * sizeof(float));
    }
    a->array[a->used++] = element;
}
4

2 に答える 2

1

readFile初期化されていない値を使用していて、nrColumns大きすぎるバッファを割り当てるように要求している可能性が非常に高いです。これは、失敗realloc()していて、結果として不確定な値を割り当てていることを意味しますarray

が初期化されていることを確認し、nrColumns読み取りの失敗 (ファイルが予想よりも短い) とメモリ割り当ての失敗の両方をテストする必要がありmallocますrealloc。それがおそらくあなたのエラーです。

于 2013-04-24T23:10:11.453 に答える