我正在创建一个程序,用于将二进制,十进制,十六进制和八进制转换为这些选项中的任何一个。对于十六进制,我需要一种方法将大于9的值格式化为A,B,C,D,E,F之一。由于这将在几个函数中重复,我决定使用以下函数:
char hexRepresentation(double n){
if(n > 9){
if(n==10) return 'A';
if(n==11) return 'B';
if(n==12) return 'C';
if(n==13) return 'D';
if(n==14) return 'E';
if(n==15) return 'F';
}
return (char)n;
}
但是,当我尝试编译时,收到错误
'hexRepresentation'的冲突类型
我是C的全新人,来自Java,并且正在抨击我应该做的最简单的事情。任何帮助将不胜感激!
答案 0 :(得分:9)
你没有得到一个声明类型的错误,因为在C中,当你不转发声明一个函数时,大多数编译器都假设一个返回int类型的extern函数。实际上编译器应该警告你(大多数情况下)。然后,当编译器实际到达函数实现时,它会找到不同的返回类型,在本例中为char,然后抛出“冲突类型”错误。只需向前声明所有函数以避免此类错误。
关于什么是最好的方式,像下面的代码woudl产生类似的结果:
if (n > 9)
{
return('A' + (n - 10));
}
答案 1 :(得分:1)
无论你在发布的代码中做了什么,你都没有在函数中使用double
数据类型。从函数返回类型看,您似乎永远不会看到返回值> 127。
此代码突出显示了一些问题:(这只是说明性的)
char hexRepresentation(double n){
if(n > 9){//comparing (double>int). Bad.
if(n==10) return 'A';
if(n==11) return 'B';
if(n==12) return 'C';//You wrote if(double == int). Bad.
if(n==13) return 'D';
if(n==14) return 'E';
if(n==15) return 'F';
}
return (char)n; //again unsafe downgrade from 8 bytes double to 1 byte char.
}
即使您修复了编译器错误,由于函数中数据类型的这种危险使用,您也可能无法始终获得所需的结果。
要知道为什么不好,请看这里:
http://www.cygnus-software.com/papers/comparingfloats/Comparing%20floating%20point%20numbers.htm
我会在该函数体中的任何地方使用fabs(n)
而不是n
。
当在此函数定义之前存在同一命名函数hexRepresentation
的先前声明或定义时,将显示错误“'hexRepresentation'的冲突类型”。此外,如果您没有声明一个函数并且它仅在被调用后出现,则编译器会自动将其假定为int
。
因此,在main()之前声明并定义你的函数 或者在main()之前声明,并在文件中的任何其他位置定义函数,但是,使用相同的函数原型。
做:
char hexRepresentation(double); //Declaration before main
main()
{
...
}
char hexRepresentation(double n){//Definition after main
...
}
或者
char hexRepresentation(double n){ //Declaration and definition before main
...
}
main()
{
...
}
答案 2 :(得分:0)
只需创建一个具有推送和弹出功能的堆栈(用于char)。我没有返回值只是在同一个函数中打印它。 (仅针对整数值实施)
#define max 100
char a[max];
void hex(int n)
{
while(n>0)
{
int rem = n%16;
if (rem<10)
push(rem+'0');
elsif(rem >=10 && rem <16)
{
switch(rem)
{
case 10:
push('A');break;
case 11:
push('B');break;
case 12:
push('C');break;
case 13:
push('D');break;
case 14:
push('E');break;
case 15:
push('F');break;
}
else
n=n/16;
}
}
i=0;
while(top>-1)
a[i++]=pop();
i=0;
while(a[i]!='\0')
printf("%c",a[i++]);
}
有用吗?