Передача указателя файла в функции, и файл не читается правильно - PullRequest
2 голосов
/ 03 октября 2010

Я думаю, что моя проблема с моим кодом в том, что файл не передается правильно.Вход представляет собой файл с тремя строками 1 2 3;4 5 6;7 8 9;и на выходе будет ошибка сегментации (ядро сброшено), на выходе должна быть напечатана первая строка

Ответы [ 3 ]

4 голосов
/ 03 октября 2010

Скольжение вашего кода ...

int getNum();
int getLine();
int getMatrix();
int det1();
/* ... */

Эти объявления говорят компилятору: "эй, компилятор, пожалуйста, имейте в виду, что я буду вызывать функции с этими именами (getNum, getLine, getMatrix, det1,...) и они возвращают int, но я не говорю вам, какие параметры они принимают. Просто доверяйте мне, когда я их использую "

Лучше, если вы используете прототип прямо при представлении функцийкомпилятору

int getNum(int value, FILE *infile);
int getLine(int line[], int lineSize, FILE *infile);
/* ... */

Эти объявления говорят компилятору: "эй, компилятор, пожалуйста, имейте в виду, что я вызову функцию с этими именами, они вернут int и примут эти параметры. Если я сделаюошибка, пожаловайтесь, чтобы сообщить мне о моей ошибке "

... продолжение внутри main ()

      /* ... */
      int lineSize;
      int error;
      getLine(line,lineSize,infile);
      /* ... */

вы объявили lineSize, но не указали значение для переменной,Когда программа вызывает getLine, значение для lineSize почти наверняка является неправильным (это может даже привести к сбою компьютера даже перед вызовом функции).Инициализируйте (почти) все переменные перед их использованием.

      /* ... */
      int lineSize = 0;
      int error = 0;
      getLine(line,lineSize,infile);
      /* ... */

Я не просмотрел больше ...

Предложение : проверьте уровень предупреждения компилятора и выполнитене запускать вашу программу, пока компиляция выдает предупреждения.

3 голосов
/ 03 октября 2010

В getLine(), когда вы передаете infile FILE* функции getNum(), вы разыменовываете ее:

 l=getNum(value,*infile);

Но getNum() просто ожидает нормального FILE*не разыменованный.Поэтому передайте infile этой функции без изменений:

 l=getNum(value,infile);

Кроме того, цикл while(value != '\n'), вероятно, будет работать вечно, записывая после конца массива lines, пока не получите ошибку сегментации,value, который контролирует, когда цикл завершится, никогда не изменяется (также он не инициализируется, поэтому он начинается с произвольного значения).Функция getNum(), которая, вероятно, должна изменять value, получает копию целого числа, переданного в качестве параметра, а затем изменяет эту копию.Исходный value никогда не изменяется.

Если вы хотите, чтобы функция изменила переменную value, вы должны использовать указатель, который указывает на value и который используется для изменения этой переменной:

int getNum(int *value, ...) {
   *value = 5;
   ...
}

l=getNum(&value, infile);

Также немного сомнительно, что value, целочисленная переменная, присваивается и сравнивается с '\n', символьным литералом.Вы уверены, что хотите использовать целочисленное значение '\n' в качестве условия завершения вашего цикла?

0 голосов
/ 03 октября 2010

Хотя это и не прямой ответ, я бы рекомендовал вставлять несколько операторов printf в случайные места; это позволит вам сравнительно быстро сузить точную точку падения. Перемещайте их до тех пор, пока у вас не появятся два printfs, заключающие в скобки одну строку кода, которая, как вы знаете, будет причиной сбоя, что позволит вам лучше диагностировать.

...