2017-02-21 40 views
-1

Я написал эту программу для создания числа алмазов. Проблема в том, что, когда я скомпилировать программу, он выдает ошибкуНеопределенная эталонная ошибка для функции, которая фактически определена в C

build2.c:(.text+0x5): undefined reference to `get_input'

collect2: error: ld returned 1 exit status

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

//Define prior to main 

int is_valid(int); 
int get_input(void); 
void print_pattern(int); 

//Main 
int main(void){ 
     int diamond_size; 
     //diamond_size = get_input(); 

//value from get imput method used for diamond size 

     print_pattern(get_input()); 

     return 0; 
} 

void print_pattern(int size){ 
int length, num, i, j; 

//beginning of new diamond 

printf("\n"); 

//Define each integer to work in layout of diamond 
//First for loop fans out 

for(i=1; i <= size; i += 2){ 
     length = size-i+1; 
     num = 1; 
     printf("%*s", length," "); 
     for(j = 0; j < i; j++){ 
       printf("%d ", num); 
       num++; 
     } 
     printf("\n"); 
} 

//second for loop fans in 

for(i=size-2; i >= 1; i -= 2){ 
     length = size-i+1; 
     num = 1; 
     printf("%*s", length," "); 
      for(j = 0; j < i; j++){ 
       printf("%d ", num); 
       num++; 
     } 
     printf("\n"); 
} 




int is_valid(int value){ 
int rem; 

//uses remainder to determine if it is odd or even; an even number will not have a reaminder in this case 

rem = value % 2; 

if (rem == 0){ 
printf("You've entered a even number. Please try again.\n"); 
return (0); 
} 

//greater than 9 cnd 
if (value > 9){ 
printf("You have entered a number greater than 9. Please try again.\n"); 
return (0); 
} 

//less than 1 cnd 

if (value < 1){ 
printf("You have entered a number less than 1. Please try again.\n"); 
return (0); 
} 

return (1); 

} 

int get_input() 
{ 
int cont, number, valid; 
cont = 1; 
while (cont = 1) 
{ 
     printf("Enter an odd number less than 9 and greater than 0 < "); 
     scanf("%d", &number); 
     valid = is_valid(number); 
     if (valid == 1) 
     { 
     cont = 0; 
     } 

} 
return number; 
} 
} 
+0

Исправьте свой отступ - вы увидите, что 'print_pattern' не имеет достаточно закрывающих скобок'} ', поэтому другие функции находятся внутри этого. Я удивлен, что он компилируется. –

+2

Проверьте свои {} пары - вы поставили 'get_input' и' is_valid' * внутри * 'print_pattern', они должны быть вне его. - https://repl.it/FrDD/0 – TessellatingHeckler

ответ

2

У вас, кажется, есть вложенные функции; это (a) a non-standard GCC extension, и (b) я предполагаю, что область вложенной функции get_input() является закрывающей функцией, а не областью файлов. Решение заключается в перемещении get_input() в область действия. В конце print_pattern() добавьте дополнительно } и удалите окончательный } в конце файла.

Кроме того, пожалуйста, отформатируйте свой код - большинство IDE в эти дни имеют возможности его убрать, и с правильным отступом вы, возможно, раньше видели свою проблему.

О, и как бонус исправленной ошибкой, у вас также есть в get_input():

while (cont = 1) 

Это всегда будет верным - использовать вместо этого:

while (cont == 1) 
+0

Хорошо. Вау. Не могу поверить, что я пропустил это. Спасибо за это и бонус! Очень признателен. –

1

Функция print_pattern не прекращается в надлежащим образом, но в самом конце файла:

void print_pattern(int size){ 
... 
... end of the loop 
} 

... more functions 
... 
... end of print_pattern 
} 

Это результат int o определение вложенных функций вместо глобального уровня.

Обычно это хорошая привычка отступать от блоков, и в этом случае вы быстро поняли бы ошибку.

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

  • Нет связанных вопросов^_^