为什么"在十六进制重新声明中键入不匹配"不断弹出?

时间:2015-10-11 02:29:54

标签: c

我是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++; 
  } 
}

1 个答案:

答案 0 :(得分:3)

您获得的错误type mismatch in redeclaration of hexadecimal是您原型化和实施的功能之间差异的结果。

你的原型是:

char hexadecimal(char), k[MAX];

这一行原型化一个函数十六进制,它返回一个char并将一个char作为一个参数 AND 这一行也声明了一个大小为MAX的全局字符数组k。

您的实际功能是:

char hexadecimal(char k[MAX])

这个函数是一个返回char的函数,但它不是像你的原型那样取一个char而是取一个大小为MAX的char数组。正如您所看到的,原型函数和函数本身并不相同。通过使功能完全相同,您将解决您的问题。

老实说,您不需要将任何内容传递给该函数,也不需要创建全局char数组,因为您可以根据代码在本地保存数组。你使用数组的唯一另一次,你只需将它传递给这个函数,这意味着它最好是作为该函数的本地。所以,你可以这样做:

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

现在函数不带参数,k仍然在函数中声明,但是是局部的而不是全局的。这个函数的原型就是:

char hexadecimal(void);