Почему я получаю ошибку сегментации в этой программе? - PullRequest
0 голосов
/ 06 ноября 2010

Я пытаюсь установить значения M и N в этой программе на то, что анализируется из строки, которую эта программа C получает в своей командной строке.Тем не менее, я получаю ошибку сегментации всякий раз, когда я запускаю код.Я новичок в концепции указателя в C, поэтому я знаю, что это что-то есть.

Код должен работать следующим образом:

. / A.out -1,12

Отпечатки:

1, 12

Спасибо за любую помощь!

    #include <stdio.h>
    #include <stdlib.h>

    void getnumber(char *toTest, int *a, int *c);

    int main ( int argc, char *argv[] )
    {

            int a, c, curr; 

            a = 1;
            c = 1;
            curr = 1;

            if ( argv[1][0] == '-' )
            {
                    curr = 2;
                    getMandNValues(argv[1], &a, &c);
            }

            printf("%d, %d\n", a, c);
            return 0;
    }


    void getMandNValues(char *src, int *a, int *c)
    {

            char aString[sizeof src];
            char bString[sizeof src];

            int i = 0;

            while((aString[i] = &src[i+1]) != ',')
                    ++i;

            aString[i] = '\0';

            int j = 0;

            while((bString[j] = &src[i + 2]) != '\0')
            {
                    ++j;
                    ++i;
            }

            bString[j] = '\0';

            *a = atoi(aString);
            *c = atoi(bString);
    }

Вывод компилятора:

/tmp/foo.c: In function ‘main’:
/tmp/foo.c:18: warning: passing argument 2 of ‘getMandNValues’ makes pointer from integer without a cast
/tmp/foo.c:18: warning: passing argument 3 of ‘getMandNValues’ makes pointer from integer without a cast
/tmp/foo.c: In function ‘getMandNValues’:
/tmp/foo.c:34: warning: assignment makes integer from pointer without a cast
/tmp/foo.c:41: warning: assignment makes integer from pointer without a cast

Ответы [ 5 ]

3 голосов
/ 06 ноября 2010

Не посмотрел на все, но вам нужен адрес переменной для этого вызова.

getMandNValues(argv[1], &a, &c);

Я не знаю, какой компилятор вы используете, но я не проигнорировал бы предупреждение, которое должно отображаться при компиляции. (Если вы не используете самый высокий уровень предупреждения, вам следует.)


Если посмотреть еще, есть еще одна проблема

while((aString[i] = &src[i+1]) != ',')
   ++i;

Кажется странным (и неправильным). Я бы сделал это:

int index=0;
do
{
  aString[index] = src[index+1];
  index++;
} while (str[index] != ',')

вот еще одна проблема

char aString[len(src)];
char bString[len(src)];
2 голосов
/ 06 ноября 2010
getMandNValues(argv[1], a, c);

должно быть

getMandNValues(argv[1], &a, &c);
1 голос
/ 06 ноября 2010

Вы должны передать & a и & c в функцию, для одного.

0 голосов
/ 06 ноября 2010

Вы передаете int a и int c функции, которая ожидает int * a и int * c

вместо использования

getMandNValues(argv[1], a, c);

, попробуйте

getMandNValues(argv[1], &a, &c);
0 голосов
/ 06 ноября 2010

Вы смешиваете getnumber и getMandNvalues.

Вы предоставили прототип для getnumber, но нет определения этой функции.Вы передали определение getMandNvalues, но не вызвали прототип, прежде чем вызывать эту функцию.

Вызов функции без прототипа в области действия является допустимым.Компилятор предполагает, что он возвращает int, а все аргументы int.Ничто из этого не верно в этом случае.

Исправьте ваш прототип

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...