2013-12-05 1 views
1

Во-первых, я объявлять переменные перед основной функцией():Переходя с плавающей точкой * и FILE * в/из функций в C

// Files 
FILE *density_model_file; 
char *density_model_filename; 
float *density_array; 

Далее я открыть файл * для чтения и выделения памяти для массива плотности :

density_model_file = open4read(density_model_filename, program_name); 
density_array = allocator(density_model_size, sizeof(float)); 

До этого момента отладчик показывает, что все работает нормально. Здесь шаг, который я не могу исправить, где я пытаюсь загрузить данных в calloc'd массива:

density_array = floatfromfile(sizeof(float), density_model_size, density_model_file, density_model_filename); 

density_array имеет значение NULL после этого шага по некоторым причинам. Вот код этой функции (содержится в отдельном .c файле). я жирный шрифт части, где я думаю, что проблема существует:

float * floatfromfile(unsigned long int entrysize, int numentries, FILE *inputfile, const char *filename) 
     { 
     /* Declaration of density model array size variable */ 
    int numbytes; 

    **void *temparray = 0; 
    /* Writes the gravity model to file */ 
    numbytes = (int)fread(temparray, entrysize, numentries, inputfile);** 


    /* Checks that the forward model file has a sufficient number of entries */ 
    if (numbytes == numentries) 
     { 
     printf("loaded %i values from %s using fread()\n", numbytes, filename); 
     return((float *)temparray); 
     } 
    else 
     { 
     printf("ERROR: %i data points read from %s of %i needed\n", numbytes, filename, numentries); 
     return((float *)temparray); 
     } 
    } 

Любого понимание будет высоко ценится. Я думаю, проблема может заключаться в том, что calloc() возвращает указатель на массив void. При необходимости я могу предоставить другие функции.

+0

Bolding не работает внутри кодовых блоков. Вы можете пометить эти строки по-разному, например. с комментариями. – danfuzz

ответ

0

fread ожидает, что он сможет записать свои результаты в выделенный блок памяти. Но вы даете ему temparray, который не был выделен - на самом деле его значение равно 0. Поэтому вы даете fread адрес 0 для записи, что может привести к сбою программы. Вместо этого вам нужно передать выделенный вами указатель density_array.

3

У вас, похоже, есть недоразумение о том, как работают указатели. Что вам нужно сделать, это передать density_array в floatfromfile в качестве аргумента.

Вместо этого вы переписываете указатель на выделенную память с возвращаемым значением от floatfromfile. Это возвращаемое значение всегда равно NULL, потому что именно вы назначили его (как temparray).