私は 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;
}