2013-04-09 2 views
0

Вот моя проблема: у меня есть матрица 2d char, с которой я malloc с функцией. После этого, я хочу, чтобы получить карту из файла, но я получил ошибку сегментации прямо там, и я не знаю, почему ... Вот пример кода:C - malloc или fgets, я не знаю, что не работает

// struct where I put the map and others informations from the 
typedef struct problem_t 
{ 
    char *nom; 
    Coordonnees arrivee, depart; 
    int nb_ligne, nb_col; 
    char **  
} Problem; 

// Function wich malloc the map 
int mallocCarte(char *** carte, int nbLigne, int nbCol) 
{ 
    *carte = malloc(nbLigne * sizeof(char*)); 

    if (*carte == NULL) 
    { 
     return false; 
    } 

    int i; 
    for (i = 0; i < nbLigne ; ++i) 
    { 

     (*carte) [i] = malloc(nbCol * sizeof(char)); 
     if ((*carte) [i] == NULL) 
     { 
      return false; 
     } 
    } 

    return true; 

} // mallocCarte () 

// Code sample, I've already got the others informations, now, I'd like to get the map 
// On commence par reserver l'espace memoire reserve à la carte. 
int res = mallocCarte(&problem->carte, problem->nb_ligne, problem->nb_col); 

// Si l'allocation s'est mal passée, on renvoie un message 
if (res == false) 
{ 
    exc.num_Exc = MALLOC_ERROR; 
    exc.msg_Err = "Erreur lors de l'allocation mémoire de la carte"; 
    return exc; 
} 

printf("Recuperation de la carte 2 ...%d %d\n", problem->nb_ligne, 
     problem->nb_col); 
int nbLi = 0; 
int nbCol = 0; 
while (fgets(fromFile, 1, file) != NULL && nbLi < problem->nb_ligne) 
{ 
    if (fromFile [0] == '\n') 
    { 
     nbCol = 0; 
     ++nbLi; 
     continue; 
    } 

    if (nbCol == problem->nb_col) 
    { 
     printf("malformed input file!\n"); 
     exit(-1); 
    } 


    (problem->carte) [nbLi] [nbCol++] = fromFile [0]; 
} 

Прошло много дней, и я на самом деле не знаю, что делать ... Я был бы так любезен Если кто-то мог мне помочь!

Спасибо Вам

(Вот исходный файл, где я беру информацию. Сначала они проблемно имя, то некоторые координаты, и, наконец, размер карты. В конце файла карты https://dl.dropbox.com/u/56951442/map.txt)

+4

Это даже компиляция? .. У меня есть некоторые сомнения относительно строки 'char **' объявления 'struct'. – dasblinkenlight

+1

Вам не нужно указывать возвращаемое значение 'malloc' в программе C. И 'sizeof (char)' is '1'. –

+0

Если вы хотите вернуть 2d-массив через параметр out, для этого параметра нужен тип 'char ***'.Тогда ваше первое задание выглядит как 'carte * = (char **) malloc (nbLigne * sizeof (char *));' – jpm

ответ

1

Когда вы увеличиваете nbLi в main, вам необходимо сбросить nbCol до нуля. Вы позволяете столбцу продолжать увеличиваться бесконечно и превышать размер вашего массива.

Также you should not cast malloc in C.

Кроме того, вы должны быть прохождение & проблемно> меню в вашей функции распределения ...

// Function wich malloc the map 
int mallocCarte(char *** carte, int nbLigne, int nbCol) 
{ 
    *carte = malloc(nbLigne * sizeof(char*)); 
... 
    (*carte)[i] = malloc(nbCol * sizeof(char)); 
... 
} 

main() 
{ 
    ... 
    int res = mallocCarte(&problem->carte, problem->nb_ligne, problem->nb_col); 
    ... 
} 

Вы, вероятно, следует добавить тест, тоже, чтобы убедиться, что вы не блуждать конец столбец, если ваш входной файл имеет неверный формат ...

if (isspace(fromFile [0])) 
    { 
     nbCol = 0; 
     ++nbLi; 
     continue; 
    } 

    if(nbCol == problem->nb_col) 
    { 
     printf("malformed input file!\n"); 
     exit(-1); 
    } 

вы уверены, что вы имеете в виду использовать fgets(fromFile, 1, file) ?? Из приведенного ниже описания следует, что fgets()всегда возвращает пустую строку до конца файла и fromFile[0] всегда будет '\0' до EOF. Вы должны использовать fgets(fromFile, 2, file)

fgets() считывает максимум один меньше, чем символы размера из потока и сохраняют их в буфер, указанных на с. Чтение останавливается после EOF или новой строки. Если считывается новая строка, она сохраняется в буфере . A '\ 0' сохраняется после последнего символа в буфере.

+0

Ну, это не сработало – Carvallegro

+0

Я вложил все ваши предложения в свой код, но он все еще не работает:/Кроме того, вы могли бы объяснить материал *** char и * carte? Я действительно не получаю это – Carvallegro

+0

Вы выделяете char **, а затем вы выделяете char * для каждого элемента char ** - однако вы хотите ВОЗВРАТИТЬ этот новый выделенный указатель на вызывающего. Это означает, что вам нужно написать новый указатель в этот аргумент и прочитать его позже. Думайте об этом так: если вы передадите целое число в функцию, тогда функция может читать и изменять этот аргумент все он хочет, но вызывающий не увидит эти изменения, потому что вы передали КОПИЮ целого числа. Если вы передадите POINTER в целое число, а затем измените его содержимое, вызывающий вызовет изменения. –

-1

проблема является объектом структуры problem_t. Это не указатель, вы должны получить доступ к переменной структуры, как

problem.carte, 
problem.nb_ligne 
problem.nb_col 

Я попробовал ваш код на моей системе. ваш код работает отлично для меня с вашим данным map.txt. Я только что объявил char fromFile [2]; Пока (fgets (fromFile, 2, file)! = NULL) {// файл печати}. Его файл для печати правильно для меня.

+0

Нет, в коде проблема problem_t * параметр – Carvallegro

+0

Если бы это было так, код вообще не компилировался ... это заданная проблема. указатель на problem_t по дизайну кода. –

+0

ваш код работает отлично для меня с вашим данным map.txt. Я только что объявил char fromFile [2]; Пока (fgets (fromFile, 2, file)! = NULL) {// файл печати}. Его файл для печати правильно для меня. – surender8388