Undeclared identifier in C function

荒凉一梦 提交于 2019-12-10 11:58:11

问题


When I compile the following C function / program I get errors like "missing ';' before 'type' 'remainder' : undeclared identifier" - what is wrong with this function?

#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;
}

回答1:


I'm not a C expert, but from experience very long ago I believe you cannot declare variables in the middle of a function.

Also, it's unclear what you are trying to do with the function / print statements.

Try this:

#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;
}



回答2:


You need to defines variables, then they can be used. So this:

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

should become this:

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

  number = 47;
  base = 11;

  conversionTo(number, base);

  return 0;
}

Also non C99 compliant compilers do not like having variables declared in the middle of a context:

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

  int remainder=number%base;    /* this would fail. */
  conversionTo((number/base),base);

To get around this open another context:

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);
  }
}   



回答3:


You have to invoke your function with a value or variable, not a declaration:

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

or

int number = 123, base = 10; // variable declaration
conversionTo(number, base);  // using variable



回答4:


You are calling your function wrong - pass the arguments this way:

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

or

int number = 123, base = 10;
conversionTo(number, base); // note this is not the same number and base as in the definition of your conversionTo function

Full code:

#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;

}

There are 3 things when using functions:

Function declaration / prototype - the prototype of your function is:

void conversionTo(int ,int );

Function definition:

void conversionTo(int number,int base /* Parameter list*/) 
{
    // your functionality
}

Function call where you pass your arguments to your function:

conversionTo(2,2);

The statement conversionTo(int number,int base); simply re-declares it. Try this even this will compile:

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



回答5:


conversionTo(int number, int base)

is the syntax for declaring which parameters the function can take. To actually call the function, you need to omit the type (assuming you have variables of the respective name)

int number = 5;
int base = 10;

conversionTo(number, base); // <-- no int here!

Or you can use numbers directly:

conversionTo(5, 10);



回答6:


Your function definition number and base in your function declaration void conversionTo(int number, int base) are the names that the values passed to it will have inside the function. So, if you call conversionTo(2,5), 2 will be seen inside the function as number, while 5 will be seen as base.

If you want to use variables instead of contants to call the function, you could do that:

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

In this confusing example, the variables base and value have value 2 and 5, respectively. But as you pass them to the function, the values inside it will be number = 2 and base = 5. This shows that those variables are actually different, despite of having the same name.




回答7:


You should compile with $CC -std=c99, to enable declaring variables in the middle of a block.

(see section 6.8 in the specification)




回答8:


The declaration "int remainder" must come before any statements in a block. A declaration may have an initializer as you have here.

You could do:

    void conversionTo(int number,int base) {
      if (number > 0) {
        int remainder...
      }
    }

since the function will not work with negative numbers.

To fix the other bugs in the routine:

    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);
      }
    }

This will print a 0 if number is zero and only recurse if needed.



来源:https://stackoverflow.com/questions/20267400/undeclared-identifier-in-c-function

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!