2013-03-21 5 views
0

Я работаю над фрагментом кода, который считывает данные из файла и обрабатывает его. Идея состоит в том, чтобы загрузить данные глобально, а затем использовать несколько функций для данных для выполнения вычислений. Проблема, с которой я сталкиваюсь, заключается в том, что при компиляции я получаю следующую ошибку:Объявление переменной

«вершины» необъявленные (первое использование в этой функции).

Заголовочный файл содержит следующее:

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

В основном я называю таНос и функцию, которая будет использовать этот массив «переменной» называемые «вершины»:

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 выше main, я получаю 'предыдущее определение было здесь', и если я добавлю переменные вершины; до main, получить ошибку.

Как решить такую ​​проблему?

+0

Какая строка дает ошибку? – Roddy

+0

Почему вы назвали «переменную» типа? Это не имеет никакого смысла. – LtWorf

+0

Вы уверены, что он не говорит '' вершины 'undeclared' в load_file ??? это, по крайней мере, имело бы смысл. – Roddy

ответ

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 ключевое слово из его декларации.

+0

У меня был тот же самый код, что и выше, помимо определения нулевого указателя: 'variable * vertices = NULL;'. Теперь он работает (с ошибкой сегментации ...). Большое спасибо. – user1873500

+0

Я бы рекомендовал предложение @K Scott Piel. глобальные переменные должны быть зарезервированы для констант. любая функция, которая нуждается в переменной 'vertices', должна быть явно указана как параметр. –

3

Проблема заключается в том, что вы объявляете «вершины» внутри основного, что делает область видимости локальной для 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; 
} 

EDIT: Я бы рекомендовал против просто превращения вершин в глобальную переменную ... это означает, что все может получить к ней доступ и/или изменить ее ... даже непреднамеренно. Почти всегда разумнее передавать аргументы в и из функций, которые им нужны, а не просто сделать их доступными миру в мире ... область - ваш друг.

+0

Хорошо сделано для просмотра неправильного сообщения об ошибке! – Roddy

+0

Если это действительно C, а не C++, то не бросайте malloc. –

+0

Правда ... Я должен был отредактировать это, когда копирую/вставляю его код. Хороший улов. –

Смежные вопросы