Использование процедуры в C - PullRequest
1 голос
/ 15 сентября 2010
#include <stdio.h>

double IncomeTAX(double i)
{
    double tax;

    if(i <= 120000)        
        tax = 0;    
    else        
        tax = (i - 120000) * 15/100;    

    return tax;
}


int main(void)
{    
    double a, b;

    printf  ("Enter the annual income: ");
    scanf   ("%lf", &b);

    a = IncomeTAX(b);

    printf ("Income Tax is %.2lf\n", a);    
}

Когда я пытаюсь запустить программу таким образом, она работает, но когда я разделяю процедуру, программа компилируется, но выдает ненужное значение. Но если я изменил тип данных в процедуре с 'double' на 'long', программа сработает, даже если процедура скомпилирована отдельно.

Может кто-нибудь сказать мне, в чем причина этого?

Ответы [ 5 ]

5 голосов
/ 15 сентября 2010

Если под «отделить процедуру» вы подразумеваете «поместить функцию IncomeTAX () в другой файл исходного кода», чем, возможно, вы не можете объявить ее перед использованием. Поместите это перед main():

extern double IncomeTAX(double);

Обычно это будет заголовок файла IncomeTAX.h.

Причина, по которой вам нужно это объявление, заключается в том, что в противном случае C по умолчанию будет использовать int; что вызывает проблемы, поскольку он может иметь размер, отличный от double.

3 голосов
/ 15 сентября 2010

В отсутствие прототипа компилятор пытается помочь и угадать правильные типы возвращаемого значения и аргументы функций.

Иногда он угадывает (особенно, когда типы не int).

Решение: всегда используйте прототипы для своих функций и создавайте заголовочные файлы, если вы собираетесь разделять функции.

2 голосов
/ 15 сентября 2010

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

FWIW, есть что-то поэтическое в функции IncomeTax, возвращающей double ...

#include <stdio.h>

double IncomeTAX(double i);

int main(void)
{    
    double a, b;

    printf  ("Enter the annual income: ");
    scanf   ("%lf", &b);

    a = IncomeTAX(b);

    printf ("Income Tax is %.2lf\n", a);    
}
0 голосов
/ 15 сентября 2010

Я предполагаю, что под "отделением процедуры" вы подразумеваете перемещение процедуры в отдельный файл.

В этом случае проблема, вероятно, связана с тем, что вы не объявляете свою процедуру перед ее использованием. Если вы не объявите свою процедуру, компилятор будет считать, что все аргументы имеют тип int.

Что вам нужно сделать, это объявить вашу процедуру следующим образом, где-то перед тем, как ее вызвать.

double IncomeTAX(double i);

Обычное соглашение - добавить его в заголовочный файл; например, если ваша IncomeTAX() процедура определена в tax.c, вы объявите ее в tax.h, а затем в файле, который включает main(), вы добавите:

#include "tax.h"
0 голосов
/ 15 сентября 2010

Где у вас 15/100 - ошибка. Эти два числа являются целыми числами и поэтому возвращают целое число 0. Замените на 0,15 / 0,15f.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...