2013-11-28 3 views
0

Когда я скомпилирую следующую C-функцию/программу, я получаю такие ошибки, как "missing ';' before 'type' 'remainder' : undeclared identifier" - что не так с этой функцией?Необъявленный идентификатор в функции C

#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

В 'main function':' conversionTo (int number, int base) 'должно быть' conversionTo (number, base) '. Кроме того, у вас нет этих переменных, объявленных/инициализированных в функции 'main' ... – varnie

+0

Я получаю ошибки, подобные отсутствующим ';' before 'type' 'остаток': uneclared identifier – ladyd

+0

Не использовал C в течение длительного времени, но я думаю, что вы не можете сделать '0' + остаток, это попытается добавить строку и число. В основном вам нужно использовать фактические числа, когда вы вызываете conversionTo like conversionTo (123, 8); –

ответ

1

Вы вызываете вашу функцию неправильно - передать аргументы таким образом:

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

или

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 

Полный код:

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

} 

Есть 3 вещи, когда используя функции:

декларации Функции/прототип - прототип вашей функции: определение

void conversionTo(int ,int); 

Функции:

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

вызов функции, где вы передаете свои аргументы к вашей функции:

conversionTo(2,2); 

Оператор conversionTo(int number,int base); просто повторно объявляет его. Попробуйте это даже это будет компилировать:

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

Я не эксперт C, но из опыта очень давно я верю, что вы не можете объявлять переменные в середине функции.

Также неясно, что вы пытаетесь сделать с операторами функции/печати.

Попробуйте это:

#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

Вы должны использовать оригинал 'printf ("% c ", '0' + остаток);' или функция не будет работать. – AndrewQ

+0

@AndrewQ - спасибо за комментарий - как-то это вызвало старую память - мои отредактированные комментарии более правильные сейчас? –

+0

Btw, я проверил с gcc 4.1.2, и позиция объявления не влияет на компиляцию и окончательный вывод. Возможно, компилятор C @LLDID строго придерживается стандарта K & R, который запрещает добавлять декларацию «на лету». – AndrewQ

1

Вы должны вызвать вашу функцию со значением или переменной, а не декларация:

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

или

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

Ваше определение функции number и base в объявлении вашей функции void conversionTo(int number, int base) - это имена th при значениях, переданных ему, будет внутри функции. Итак, если вы вызовете conversionTo(2,5), 2 будет видна внутри функции number, а 5 будет отображаться как base.

Если вы хотите использовать переменные вместо contants для вызова функции, вы можете сделать это:

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

В этом запутанном примере переменные base и value имеют значение 2 и 5, соответственно.Но по мере того, как вы передаете их функции, значения внутри нее будут иметь номер = 2 и base = 5. Это показывает, что эти переменные на самом деле разные, несмотря на одно и то же имя.

0

Вы должны скомпилировать с помощью $ CC -std = c99, чтобы включить объявление переменных в середине блока.

(смотри раздел 6.8 в спецификации)

2

Вам нужно определяет переменные, то они могут быть использованы. Так что это:

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); 
    } 
} 
1
conversionTo(int number, int base) 

- это синтаксис для определения параметров, которые может выполнять функция. Для того, чтобы на самом деле вызвать функцию, необходимо опустить тип (если у вас есть переменные соответствующего имени)

int number = 5; 
int base = 10; 

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

Или вы можете использовать номера напрямую:

conversionTo(5, 10); 
0

Декларация «ИНТ остаток» должен перед любыми утверждениями в блоке. Объявление может иметь инициализатор, как вы здесь.

Вы можете сделать:

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

Это напечатает 0, если число равно нулю, и только рекурсию, если это необходимо.

Смежные вопросы