2012-10-20 98 views
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; 
} 

然而,当我尝试编译,我收到错误

conflicting types for 'hexRepresentation'

我位于C完全新的,从Java来了,我敲我的头靠在墙上了什么应该是容易实现的事情。任何帮助将不胜感激!

+2

会是什么回报,如果你在5.6过去了?甚至10以下的整数值? '(char)5'不是'5'''。 – chris

+1

除了有问题的决定让它接受'双',你在使用之前是否声明了这个函数?如果您来自Java,您可能已经忘记了这一点。 –

+0

我现在甚至不关心这一点。我将n作为其他函数的双精度 - 特别是来自math.h的pow()。到目前为止,我只使用整数。 –

回答

9

你不会得到一个声明类型的错误,因为在C中,当你不转发声明一个函数时,大多数编译器会假设一个返回int类型的extern函数。实际上,编译器应该警告你(大部分都是这样)。然后,当编译器实际到达函数实现时,它会发现不同的返回类型,在这种情况下是char,然后抛出“冲突类型”错误。只是向前宣布所有的功能,以避免这种错误。

关于什么是最好的办法财产以后像下面的代码woudl产生类似的结果:

if (n > 9) 
{ 
    return('A' + (n - 10)); 
} 
0

只需创建一个具有推送和弹出功能的堆栈(用于字符)。我没有返回值,只是在相同的函数中打印它。 (仅为积分值实施)

#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++]); 
} 

它有帮助吗?

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() 
{ 
    ... 
}