2016-04-05 5 views
0

У меня есть это назначение, где мы ожидали написать программу, которая принимает положительное целое число в качестве аргумента командной строки и печатает наименьшее простое число , большее указанного числа. Основная функция не должна редактироваться, однако вы можете создать заголовочный файл для определения необходимых функций.ошибка несовместимого указателя-компилятора

До сих пор это то, с чем я столкнулся, я просто не могу узнать, что не соответствует моей программе. Помощь приветствуется.

Основная функция: Я не могу изменить основную функцию, однако, вы можете создать заголовок

#include "slow-prime.h" 

int main(int argc, char *argv[]) { 
    int num; 
    int nxt;enter code here 
    int ret = EXIT_FAILURE; 

    if (argc < 2) { 
     printf("error: missing command line argument\n"); 
     goto ERROR; 

    if (get_number(argv[1], &num)) { 
      printf("error: %s not a number\n", argv[1]); 
      goto ERROR; 
     } 

     next_prime(num, &nxt); 
     printf("%d\n", nxt); 
     ret = EXIT_SUCCESS; 
    ERROR: 
     return ret; 
    } 
} 

необходимые функции создаются в замедленной prime.h

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


// define true and false 
#define true 1 
#define false 0 

// check whether the numer is prime or mnot 
int isPrime(int num){ 
    if (num < 2) { 
     return false; 
    } 
    for (int i = 2; i <= num/i; i++) { 
     if (num % i == 0) { 
      return false; 
     } 
    } 
    return true; 
} 

// get number 
void get_number(char *argv[], int num) { 
    num = atoi(argv[1]); 
} 

// loop through the numbers/ and pick the one 

void next_prime(int num, int next){ 

    for(int i = 2; i < 80; i++){ 
     if (isPrime(i) == true){ 
      next = i; 

      if (next > num) { 
       return exit(0); 
      } 
     } 
    } 
} 

Сообщение об ошибке :

error

ответ

0

Вы:

void get_number(char *argv[], int num) { 

вы вызываете функцию с помощью:

if (get_number(argv[1], &num)) { 

Вы проходящее неправильные типы для обоих аргументов.

argv[1] имеет тип char*. &num имеет тип int*.

Я думаю, вы должны использовать:

void get_number(char *arg, int *num) { 

и немного изменить реализацию.

void get_number(char *arg, int *num) { 
    *num = atoi(arg); 
} 

Кроме того, учитывая, что get_number возвращает void, вы не можете использовать его в условном из if заявления. Вам нужно будет изменить его тип возврата на что-то еще, возможно, int. В этом случае использование atoi может оказаться неприемлемым. atoi возвращает 0, когда он не может преобразовать строку в int. Если 0 действительное значение для вас, то atoi не является хорошим выбором. Однако вы можете использовать sprintf для всех случаев.

Если 0 не является допустимым числом, вы можете использовать:

int get_number(char *arg, int *num) { 
    *num = atoi(arg); 
    return *num; 
} 

Если 0 является допустимым числом, вы можете использовать:

int get_number(char *arg, int *num) { 
    return (sprintf(arg, "%d", num) == 1); 
} 
+0

Я следовал за ваши комментарии, и я был в состоянии избавиться от всех ошибок, кроме одного: для выражения требуется выражение скалярного типа ('void' invalid) if (get_number (argv [1], & num)) { – ab141

+0

@ ab141, мне не ясно, когда вы ожидаете, что возвращаемое значение из 'get_number' для вычисления« false »и« true ». –

Смежные вопросы