2015-10-11 19 views
1

我是一個關於C編程的全新手。所以我的節目很長,對不起。爲什麼「十六進制重新聲明中的類型不匹配」一直彈出?

我的教授想要一個數字系統 - 二進制到十進制,十進制到二進制,八進制到十進制,十六進制到二進制。他也想要一個循環(如果他想退出按[E],如果沒有則按任意鍵)。現在我遇到了這個十六進制的問題,因爲它一直說「類型在重新聲明中不匹配」,我現在不知道如何解決這個問題。

所以繼承我的未完成的程序,因爲「十六進制」的問題。幫助我解決這個錯誤。不介意的八進制爲十進制,我目前編程吧:)

#include<stdio.h> 
#include<conio.h> 
#include<math.h> 
#define MAX 1000 

long num, decimal(long), octal(long), binary(long),j; 
char hexadecimal(char), k[MAX]; 

main() 
{ 
char choice; 
clrscr(); 

printf("[B]inary to Decimal\n"); 
printf("[D]ecimal to Binary\n"); 
printf("[O]ctal to Decimal\n"); 
printf("[H]exadecimal to Binary\n"); 
printf("[E]xit\n"); 
printf(" Enter your choice...."); 

choice=getche(); 
switch(choice) 
{ 
case 'b': 
case 'B': binary(j); break; 
case 'd': 
case 'D': decimal(num); break; 
case 'o': 
case 'O': 
case 'h': 
case 'H': hexadecimal(k[MAX]); break; 
case 'e': 
case 'E': return 0; 
default: printf("\n Invalid choice.... press any key to REPEAT"); 
getch(); 
main(); 
} 
printf("\nDo you want to [E]xit?"); 
choice=getch(); 
switch(choice) 
{ 
case 'e': 
case 'E': printf("\nInvalid choice... press any key to repeat"); 
getch(); 
main(); 
} 
getch(); 
return 0; 
} 

long binary(long j) 
{ 
long binary_val,decimal_val=0, base=1, rem; 
printf("Enter a binary number(1s & 0s): "); 
scanf("%ld",&j); 
binary_val=j; 
while(j>0) 
    { 
    rem=j % 10; 
    decimal_val=decimal_val + rem * base; 
    j= j/ 10; 
    base=base * 2; 
    } 
printf(" The Binary Number is %ld\n",binary_val); 
printf(" Its decimal equivalent is = %d\n",decimal_val); 
} 

long decimal(long num) 
{ 
long decimal_num, remainder, base=1, binary=0; 
printf(" \nEnter a decimal integer: "); 
scanf("%ld",&num); 
decimal_num=num; 

while(num>0) 
    { 
    remainder= num % 2; 
    binary=binary + remainder * base; 
    num=num/2; 
    base= base * 10; 
    } 
printf(" Input number is %d\n",decimal_num); 
printf(" Its binary equivalent is = %ld",binary); 
} 

char hexadecimal(char k[MAX]) 
{ 
long int i=0; 
clrscr(); 

printf(" Enter any Hexadecimal number: "); 
scanf("%s",&k); 
printf("\n Equivalent binary value: "); 

while(k[i]) 
{ 
    switch(k[i]) 
    { 
    case '0': printf("0000"); break; 
    case '1': printf("0001"); break; 
    case '2': printf("0010"); break; 
    case '3': printf("0011"); break; 
    case '4': printf("0100"); break; 
    case '5': printf("0101"); break; 
    case '6': printf("0110"); break; 
    case '7': printf("0111"); break; 
    case '8': printf("1000"); break; 
    case '9': printf("1001"); break; 
    case 'a': 
    case 'A': printf("1010"); break; 
    case 'b': 
    case 'B': printf("1011"); break; 
    case 'c': 
    case 'C': printf("1100"); break; 
    case 'd': 
    case 'D': printf("1101"); break; 
    case 'e': 
    case 'E': printf("1110"); break; 
    case 'f': 
    case 'F': printf("1111"); break; 
    default: printf("\n Invalid hexadecimal digit %c",k[i]); return 0; 
    } 
    i++; 
    } 
} 
+2

爲什麼從'main()'調用'main()'? –

+0

重複循環。我只是從我的教授抄下了代碼(從main調用main):) – Spencer

+0

您的教授從'main()'調用'main()'?也許有其他功能? –

回答

3

您得到type mismatch in redeclaration of hexadecimal的錯誤是你原型和實現的功能之間的差異的結果。

您的原型爲:

char hexadecimal(char), k[MAX]; 

此行原型的功能十六進制,返回一個字符,並採取了焦炭作爲參數該行還聲明尺寸最大的一個全球性的字符列K。

您的實際功能是:

char hexadecimal(char k[MAX]) 

這個函數是返回一個字符的功能,但不是採取一個char喜歡你的原型它,而不是需要尺寸最大的字符數組。正如你所看到的,原型函數和函數本身並不相同。通過使功能完全相同,您將解決您的問題。

說實話,你不需要傳遞任何東西到該函數中,也不需要創建一個全局字符數組,因爲你可以根據你的代碼在本地保存數組。唯一的另外一次你使用數組,你只是將它傳遞給這個函數,這意味着它最好是作爲本地函數。所以,你可以簡單地這樣做:

char hexadecimal(void) 
{ 
    char k[MAX] 
    //same code below... 

現在函數沒有參數和K仍然是函數聲明,但當地的,而不是全局性的。這個函數的原型可能只是:

char hexadecimal(void); 
相關問題