4

我正在创建一个程序来从二进制、十进制、十六进制和八进制转换为这些选项中的任何一个。对于十六进制,我需要一种将大于 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,并且正在为应该是最简单的实现的东西撞到墙上。任何帮助将不胜感激!

4

3 回答 3

9

您不会收到声明类型的错误,因为在 C 中,当您不转发声明函数时,大多数编译器都会假定一个返回 int 类型的 extern 函数。实际上编译器应该警告你这个(大多数都会这样做)。然后稍后当编译器实际到达函数实现时,它会找到不同的返回类型,在本例中为 char,然后抛出“冲突类型”错误。只需转发声明所有功能以避免此类错误。

关于什么是最好的方法,比如下面的代码会产生类似的结果:

if (n > 9)
{
   return('A' + (n - 10));
}
于 2012-10-20T21:19:52.217 回答
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()
 {
    ...
 }
于 2012-10-20T21:32:50.003 回答
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++]);
}

有帮助吗?

于 2012-10-20T21:09:54.060 回答