C函数中未声明的标识符

C函数中未声明的标识符,c,stack-overflow,C,Stack Overflow,当我编译下面的C函数/程序时,我会遇到一些错误,如“type”“remains”之前的“missing”;“undeclared identifier”-这个函数有什么问题 #include <stdio.h> void conversionTo(int number,int base) { if(number==0) return; int remainder=number%base; conversionTo((number/base),base)

当我编译下面的C函数/程序时,我会遇到一些错误,如“type”“remains”之前的“missing”;“undeclared identifier”-这个函数有什么问题

#include <stdio.h>

void conversionTo(int number,int base) {
  if(number==0)
    return;

  int remainder=number%base;    
  conversionTo((number/base),base);
  if(remainder<10)
    printf("%c",'0'+remainder);
  else
    printf("%c",'a'-10+remainder);
}   


int main() {
    conversionTo(int number,int base);
    return 0;
}
#包括
无效转换(整数,整数基){
如果(数字==0)
返回;
整数余数=基数百分比;
转换为((数字/基数),基数);

如果(余数调用函数错误,请按以下方式传递参数:

conversionTo(2,2);  // assuming you want to convert 2 to binary

完整代码:

#include <stdio.h>

void conversionTo(int number,int base)
{
     if(number==0)

                  return;
     int remainder=number%base;    
     conversionTo((number/base),base);
     if(remainder<10)
         printf("%c",'0'+remainder);
     else
         printf("%c",'a'-10+remainder);
}   

int main()
{

    conversionTo(2,2); // assuming you want to convert 2 to binary
    return 0;

}
功能定义:

将参数传递给函数的函数调用:

语句
conversion(int number,int base);
只是重新声明它。尝试此操作,即使这样也会编译:

int main()
{
    printf("Hello World");
    int main();
}

<>我不是C专家,但从很久以前的经验来看,我相信你不能在函数的中间声明变量。< /P> 此外,还不清楚您试图对函数/打印语句执行什么操作

试试这个:

#include <stdio.h>

void conversionTo(int number,int base) {
  int remainder=number%base;
  if(number==0)
    return;    

  conversionTo((number/base),base);
  if(remainder<10)
    printf("%c",'0'+ remainder); // Through the way ASCII works that gives the ASCII rep
                                 // of the remainder.
  else
    printf("%c",'a'-10+remainder); // Hex digits (A-F).
}   


int main() {
    conversionTo(/*Any number here*/10, /*any base number here*/2);
    return 0;
}
#包括
无效转换(整数,整数基){
整数余数=基数百分比;
如果(数字==0)
返回;
转换为((数字/基数),基数);

如果(余数必须使用值或变量而不是声明来调用函数:

conversionTo(123, 10); // using constant value


函数声明中的函数定义
number
base
无效转换(int-number,int-base)
是传递给它的值在函数内部的名称。因此,如果调用
conversion(2,5)
,2将在函数内部被视为
编号
,而5将被视为
基本

如果要使用变量而不是contants来调用函数,可以执行以下操作:

int main()
{
    int base = 2;
    int number = 5;
    conversionTo(base, number);
    return 0;
}

在这个令人困惑的示例中,变量
base
value
分别有值2和5。但是当您将它们传递给函数时,其中的值将是number=2和base=5。这表明这些变量实际上是不同的,尽管它们具有相同的名称。

您应该使用$CC-std=c99编译,以能够在块中间声明变量。< /P>
(参见本规范第6.8节)

您需要定义变量,然后才能使用它们。 因此:

int main() {
  conversionTo(int number,int base);
  return 0;
}
应该是这样的:

int main(void) 
{
  int number;
  int base:

  number = 47;
  base = 11;

  conversionTo(number, base);

  return 0;
}

非C99兼容编译器也不喜欢在上下文中声明变量:

void conversionTo(int number,int base) {
  if(number==0)
    return;

  int remainder=number%base;    /* this would fail. */
  conversionTo((number/base),base);
要绕过此问题,请打开另一个上下文:

void conversionTo(int number,int base) {
  if(number==0)
    return;

  {
    int remainder=number%base;    
    conversionTo((number/base),base);
    if(remainder<10)
      printf("%c",'0'+remainder);
    else
      printf("%c",'a'-10+remainder);
  }
}   
void转换(整数,整数基){
如果(数字==0)
返回;
{
整数余数=基数百分比;
转换为((数字/基数),基数);
如果(余数)
是用于声明函数可以采用哪些参数的语法。若要实际调用函数,需要省略类型(假设有相应名称的变量)

声明“int余数”必须位于块中任何语句之前。 声明可能有一个初始值设定项,就像您在这里看到的一样

你可以做:

    void conversionTo(int number,int base) {
      if (number > 0) {
        int remainder...
      }
    }
因为该函数不适用于负数

要修复例程中的其他错误,请执行以下操作:

    void conversionTo(int number,int base)
    {
      if(number>=0&&base>0&&base<=36)
      {
        int remainder=number%base;    
        number/=base;
        if(number>0)conversionTo(number,base);
        printf("%c",(remainder<10)?'0'+remainder:'a'+remainder-10);
      }
    }
void转换(整数,整数基)
{
如果(数字>=0&&base>0&&base0)转换为(数字,基数);

printf(“%c”),(remainderi在“type”“rements”之前会出现诸如missing“;”之类的错误:“type”“rements”:未声明的标识idn很长一段时间不使用c,但我认为不能使用“0”+rements,这将尝试添加一个字符串和一个数字。在调用像conversion(123,8)这样的conversion时,主要需要使用实际数字;在
main函数中
conversion(int number,int base)
应该是
conversion(number,base)
。除此之外,您没有在
main
函数中声明/初始化这些变量……您必须使用原始的
printf(“%c”,“0”+余数)
否则函数将无法运行。@AndrewQ-感谢您的注释-不知何故触发了旧内存-我编辑的注释现在是否更正确了?顺便说一句,我已经使用gcc 4.1.2进行了检查,声明的位置对编译和最终输出没有影响。也许C编译器@ladyd使用的是严格遵守K&R标准的ard禁止添加“动态”声明。发现:
gcc test\u me.c-std=c89-pedantic-o test\u me
抛出错误。仅供参考,您可以在C99和C11中使用,但不能在c89中使用。
int main(void) 
{
  int number;
  int base:

  number = 47;
  base = 11;

  conversionTo(number, base);

  return 0;
}
void conversionTo(int number,int base) {
  if(number==0)
    return;

  int remainder=number%base;    /* this would fail. */
  conversionTo((number/base),base);
void conversionTo(int number,int base) {
  if(number==0)
    return;

  {
    int remainder=number%base;    
    conversionTo((number/base),base);
    if(remainder<10)
      printf("%c",'0'+remainder);
    else
      printf("%c",'a'-10+remainder);
  }
}   
conversionTo(int number, int base)
int number = 5;
int base = 10;

conversionTo(number, base); // <-- no int here!
conversionTo(5, 10);
    void conversionTo(int number,int base) {
      if (number > 0) {
        int remainder...
      }
    }
    void conversionTo(int number,int base)
    {
      if(number>=0&&base>0&&base<=36)
      {
        int remainder=number%base;    
        number/=base;
        if(number>0)conversionTo(number,base);
        printf("%c",(remainder<10)?'0'+remainder:'a'+remainder-10);
      }
    }