С функция выхода не делает то, что я думал, что это будет - PullRequest
1 голос
/ 09 октября 2010

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

int is_prime(int x,char array[]){
int divider = (x-1);   
float test;

  while(x>-1){
  test = isdigit((x % divider));  //isdigit returns !0 if digit
    if(divider == '1'){
    return(1);  //if divider reaches 1 then the number is prime
    exit;
    } 
    if(test  == '0'){
    return (0);//not prime
    exit;
    }
  divider--;
  }

}

Ответы [ 6 ]

5 голосов
/ 09 октября 2010

Имя самой функции (без скобок после нее) просто дает вам адрес функции без ее вызова. В C самым основным оператором является выражение, которое оценивается на предмет его побочных эффектов, а полученное значение выражения игнорируется. Так что утверждение типа exit; или 3;, которое не имеет побочных эффектов, является законным, но на самом деле ничего не делает и может быть с таким же успехом удалено. Некоторые компиляторы будут предупреждать вас о таких бессмысленных утверждениях, хотя вам, возможно, придется включить дополнительные диагностические предупреждения, чтобы получить их. Использование таких опций (например, -Wall для gcc) очень хорошая идея и поможет вам избежать некоторых ловушек, подобных этой.

2 голосов
/ 09 октября 2010

Вы должны вызвать его:

exit(0);

Кроме того, если вы поставите его после return, он никогда не будет вызван, поскольку return возвращает функцию.

EDIT: И, какдругие говорили, что выход из программы завершен, так что вы, вероятно, не хотите использовать здесь выход.

1 голос
/ 09 октября 2010

Помимо ошибок return и exit у вас есть ошибка также в том, как вы используете целые и символы. isdigit - это функция, которая применяется только к символам, и дает значение true, если символ находится в диапазоне от '0' до '9', но следует знать, что символьная нотация в C - это всего лишь причудливый способ написания кодовой точки (большинство ASCII). времени). Поэтому, когда вы пишете '1' в программе на C, компилятор увидит 49, если вы напишите 'a', компилятор увидит в реальности 97. Это означает, что isdigit возвращает true для значений от 48 до 57, вероятно, не то, что вы хотели. В строке, где вы сравниваете divider с '1', в действительности вы сравниваете его с 49 (кроме мэйнфрейма IBM, где '1' равно 241)

Ваш цикл бесконечен, он зависит от значения x, но x не изменяется в цикле, поэтому условие в это время никогда не может измениться.

РЕДАКТИРОВАТЬ: Здесь исправленный код

int is_prime(uint_t x)
{
uint_t divider;

  if(x <= 3)
    return 1;

  for(divider = x-1; ; divider--) {

    if(x % divider  == 0)
      return 0; //not prime

    if(divider == 1)
      return 1;  //if divider reaches 1 then the number is prime

  }
}
1 голос
/ 09 октября 2010

Оператор:

exit;

выдает следующее предупреждение с GCC:

C:\temp\test.c:71: warning: statement with no effect

Что происходит, если у вас есть выражение, которое оценивает адрес функции exit()- но это выражение на самом деле ничего не делает с этим адресом.это похоже на то, как если бы у вас было утверждение типа:

1 + 2;

Это допустимо C, но ни на что не влияет.

Для вызова функции от имени Томаса Падрона-Маккартасказал , у вас должен быть список аргументов (даже если они пусты для некоторых функций):

exit(0);
1 голос
/ 09 октября 2010

Чтение exit(3) руководство пользователя.

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

exit выходит из процесса, а не из функции. Вы хотите return.

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