2017-02-21 11 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

あなたの{}ペアをチェックする - あなたは 'print_pattern'の中に' get_input'と 'is_valid' *を入れました。 - https://repl.it/FrDD/0 – TessellatingHeckler

答えて

2

ネストされた機能があるようです。これは(a)a non-standard GCC extensionであり、(b)ファイルスコープではなく、ネストされたget_input()関数のスコープが囲み関数であると仮定します。解決方法はget_input()をファイルスコープに移動することです。 print_pattern()の末尾には、追加の}を追加し、最後に}を削除します。

また、コードをフォーマットしてください - 最近のほとんどのIDEでは整理するオプションがあり、インデントを間違えた場合、以前に問題が発生している可能性があります。

ああ、とボーナスバグ修正として、あなたはまた、get_input()を持っている:これは常にtrueになります

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グローバルレベルの代わりにネストされた関数を定義する。

ブロックをインデントするのが一般的です。この場合、間違いを非常に迅速に認識できます。

関連する問題