C “为什么?”;“十六进制重新声明中的类型不匹配”;不断出现?

C “为什么?”;“十六进制重新声明中的类型不匹配”;不断出现?,c,C,我对C编程完全是个新手。所以我的节目很长,对不起 我的教授想要一个数字系统——二进制到十进制,十进制到二进制,八进制到十进制,十六进制到二进制。他还希望有一个循环(如果他想退出,请按[E],如果不想退出,请按任意键)。现在我对这个十六进制有一个问题,因为它一直在说“重新声明中的类型不匹配”,我现在不知道如何解决这个问题 这是我尚未完成的程序,因为“十六进制”问题。帮我解决这个错误。不介意从八进制到十进制,我目前正在编程:) #包括 #包括 #包括 #定义最大1000 长数值、十进制(长)、八进制

我对C编程完全是个新手。所以我的节目很长,对不起

我的教授想要一个数字系统——二进制到十进制,十进制到二进制,八进制到十进制,十六进制到二进制。他还希望有一个循环(如果他想退出,请按[E],如果不想退出,请按任意键)。现在我对这个十六进制有一个问题,因为它一直在说“重新声明中的类型不匹配”,我现在不知道如何解决这个问题

这是我尚未完成的程序,因为“十六进制”问题。帮我解决这个错误。不介意从八进制到十进制,我目前正在编程:)

#包括
#包括
#包括
#定义最大1000
长数值、十进制(长)、八进制(长)、二进制(长)、j;
字符十六进制(char),k[MAX];
main()
{
字符选择;
clrsc();
printf(“[B]从一开始到小数\n”);
printf(“[D]从小数到二进制\n”);
printf(“[O]ctal到Decimal\n”);
printf(“[H]从十六进制到二进制\n”);
printf(“[E]xit\n”);
printf(“输入您的选择…”);
choice=getche();
开关(选择)
{
案例“b”:
案例“B”:二进制(j);中断;
案例“d”:
案例“D”:十进制(num);中断;
案例“o”:
案例“O”:
案例“h”:
案例“H”:十六进制(k[MAX]);中断;
案例“e”:
案例“E”:返回0;
默认值:printf(“\n无效选择…按任意键重复”);
getch();
main();
}
printf(“\n您想退出吗?”);
choice=getch();
开关(选择)
{
案例“e”:
案例“E”:printf(“\n无效选择…按任意键重复”);
getch();
main();
}
getch();
返回0;
}
长二进制(长j)
{
长二进制值,十进制值=0,基数=1,rem;
printf(“输入二进制数(1s&0s):”;
scanf(“%ld”、&j);
二进制_val=j;
而(j>0)
{
rem=j%10;
十进制值=十进制值+rem*基数;
j=j/10;
基数=基数*2;
}
printf(“二进制数为%ld\n”,二进制值);
printf(“其十进制等价物为=%d\n”,十进制值);
}
长十进制(长数值)
{
长十进制数,余数,基数=1,二进制=0;
printf(“\n输入一个十进制整数:”);
scanf(“%ld”、&num);
十进制数=num;
while(num>0)
{
余数=num%2;
二进制=二进制+余数*基数;
num=num/2;
基数=基数*10;
}
printf(“输入编号为%d\n”,小数);
printf(“其二进制等价物为=%ld”,二进制);
}
字符十六进制(字符k[MAX])
{
长整数i=0;
clrsc();
printf(“输入任何十六进制数字:”);
scanf(“%s”、&k);
printf(“\n等效二进制值:”);
而(k[i])
{
开关(k[i])
{
案例“0”:printf(“0000”);中断;
案例“1”:printf(“0001”);中断;
案例“2”:printf(“0010”);中断;
案例“3”:printf(“0011”);中断;
案例“4”:printf(“0100”);中断;
案例“5”:printf(“0101”);中断;
案例“6”:printf(“0110”);中断;
案例“7”:printf(“0111”);中断;
案例“8”:printf(“1000”);中断;
案例“9”:printf(“1001”);中断;
案例“a”:
案例“A”:printf(“1010”);中断;
案例“b”:
案例“B”:printf(“1011”);break;
案例“c”:
案例“C”:printf(“1100”);中断;
案例“d”:
案例“D”:printf(“1101”);中断;
案例“e”:
案例“E”:printf(“1110”);break;
案例“f”:
案例“F”:printf(“1111”);break;
默认值:printf(“\n无效的十六进制数字%c”,k[i]);返回0;
}
i++;
} 
}

在十六进制的重新声明中出现的错误是由于原型函数和实现的函数之间的差异造成的

您的原型是:

char hexadecimal(char), k[MAX];
这一行是一个十六进制函数的原型,该函数返回一个字符,并将一个字符作为参数这一行还声明了一个大小为MAX的全局字符数组k

您的实际功能是:

char hexadecimal(char k[MAX])
此函数是一个返回字符的函数,但它不是像原型那样获取字符,而是获取一个大小为MAX的字符数组。正如您可以看到的那样,原型函数和函数本身并不相同。通过使函数完全相同,您将解决您的问题

老实说,您不需要向该函数传递任何内容,也不需要生成全局字符数组,因为您可以基于代码在本地保存该数组。唯一一次使用数组时,您只需将其传递给此函数,这意味着它最好作为该函数的局部。因此,您可以简单地执行以下操作:

char hexadecimal(void)
{
    char k[MAX]
    //same code below...
现在函数不带参数,k仍然在函数中声明,但它是局部的,而不是全局的。该功能的原型简单地说就是:

char hexadecimal(void);

为什么要从
main()
调用
main()
?以重复循环。我刚刚从我的教授那里复制了代码(从main调用main):)你的教授从
main()调用
main()
?也许还有其他功能?我想是的@iharob。但它不知怎么起作用了,例如,我输入了一个与给定字母不同的字母,然后它说“无效选择…按任意键重复”,当我按任意键时,它再次转到main()。嗯。但我的主要问题是“十六进制的类型不匹配声明”@ChrisBeck。它只是C++中的未定义行为。
char hexadecimal(void);