слишком мало аргументов для функции и не может использоваться как функция ---- начало C - PullRequest
3 голосов
/ 18 мая 2011

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

#include <stdio.h>
//Function Declarations
double obtainTemp (void);
**double convertTemp (double tempF, double tempR, double tempC, double tempK);**
void printResult (double tempF, double tempR, double tempC, double tempK);

int main (void)
{
    //Local Declarations
    double tempF;
    double tempR;
    double tempC;
    double tempK;
    double fahrenheit;
    double rankine;
    double celsius;
    double kelvin;

    //Calling the functions
    fahrenheit = obtainTemp ();
    rankine = convertTemp (tempR);
    celsius = convertTemp (tempC);
    kelvin = convertTemp (tempK);

    //will print it by...
    printResult (tempF, tempR, tempC, tempK);

    int temp;
    printf("Press anything to exit: ");
    scanf("%d", &temp);

    return 0;
}//main

//============obtainTemp===============
double obtainTemp (void)
{
       //Local Declarations
       double tempF;
       printf("Enter temperature: ");
       scanf("%lf", &tempF);

       return tempF;
}

//============convertTemp==============
int convertTemp (double tempF, double tempR, double tempC, double tempK);
{

       //Statements
       tempR = (tempF - 32) + 491.67;
       tempC = (tempF - 32) * 100/180;
       tempK = tempC + 273.16;

       return tempF, tempR, tempC, tempK;
}

//============printResult===============
void printResult (double tempF, double tempR, double tempC, double tempK)
{
     //Statements
     printf("The temperature is %lf degrees fahrenheit\n", tempF);
     printf("The value of %lf in rankine is %lf\n", tempF, tempR);
     printf("The value of %lf in celsius is %lf\n", tempF, tempC);
     printf("The value of %lf in kelvin is %lf\n", tempF, tempK);
     return;
}

Эта функция имеет слишком мало аргументов, и компилятор говорит, что я не могу использовать ее как функцию. почему?

double convertTemp (double tempF, double tempR, double tempC, double tempK);

Извините, я новичок ... я был бы очень признателен за вашу помощь:)

Ответы [ 5 ]

4 голосов
/ 18 мая 2011

Ошибка довольно очевидна, вы вызываете функцию не так, как она должна быть.Функция принимает 4 параметра, а вы передаете только один.

Но это только ваша ПЕРВАЯ ошибка.ВТОРОЕ, аргументы функции в том виде, в каком они объявлены прямо сейчас, создадут локальную копию параметров:

double convertTemp (double tempF, double tempR, double tempC, double tempK);

Это означает, что внутри тела функции изменения любой из этих переменныхне распространяется на переменные, объявленные в main, которые вы использовали для вызова convertTemp().Я говорю, что во время вызова функции в стеке создаются еще 4 переменные, а их значения копируются из переменных, которые вы отправили в функцию.

Существует два подхода к решению этой проблемы:

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

    void convertTemp (double * tempF, double * tempR, double * tempC, double *tempK);

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

void convertTemp (double* tempF, double* tempR, double* tempC, double* tempK)
{
       //Statements
       *tempR = (*tempF - 32) + 491.67;
       *tempC = (*tempF - 32) * 100/180;
       *tempK = *tempC + 273.16;
}

Обратите внимание, что новая сигнатура функции не возвращает никакого значения (т. Е. void ).В этом нет необходимости, поскольку вы будете работать непосредственно с переменными, передаваемыми main().

On main(), вам следует вызывать такую ​​функцию:

fahrenheit = obtainTemp();
convertTemp(&fahrenheit, &rankine, &celsius, &kelvin);
  • Второй подход , поскольку вы новичок, и вам, вероятно, будет легче его понять, это объявить 3 функции, по одной на каждое преобразование, которое вам нужно сделать:

double convertR(double value)
{
  return (value - 32) + 491.67;
}

double convertC(double value)
{
  return (value - 32) * 100/180;
}

double convertK(double value)
{
  return value + 273.16;
}

Затем на main() вы бы назвали их как:

fahrenheit = obtainTemp();
rankine = convertR(fahrenheit);
celsius = convertC(fahrenheit);
kelvin = convertK(fahrenheit);

printResult(fahrenheit, rankine, celsius, kelvin);
2 голосов
/ 18 мая 2011

Вы должны указать число аргументов, которое требуется функции. convertTemp требует 4 аргумента, tempF, tempR, tempC, tempK. В своем вызове вы передаете только один аргумент convertTemp.

Скорее всего, вам нужно написать три версии convertTemp. convertFahrenheitToRankine, convertFahrenheitToCelsius и convertFahrenheitToKelvin. Каждая из этих функций должна принимать в качестве входных данных один двойной аргумент, который представляет собой температуру в градусах Фаренгейта, и каждая из них должна выводить преобразование из Фаренгейта в тип единицы измерения, для которого она преобразуется.

2 голосов
/ 18 мая 2011

Эта функция имеет слишком мало аргументов,

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

double convertTemp (double tempF, double tempR, double tempC, double tempK);

Но вы передаете только одинздесь.

rankine = convertTemp (tempR);
celsius = convertTemp (tempC);
kelvin = convertTemp (tempK);

Я предлагаю вам закомментировать большую часть вашего кода и инициализировать ваши двойные значения, как это.

#include <stdio.h>
//Function Declarations
//double obtainTemp (void);
//**double convertTemp (double tempF, double tempR, double tempC, double tempK);**
void printResult (double tempF, double tempR, double tempC, double tempK);

int main (void)
{
    //Local Declarations
    double tempF = 0.0;
    double tempR = 0.0;
    double tempC = 0.0;
    double tempK = 0.0;
//    double fahrenheit;
//    double rankine;
//    double celsius;
//    double kelvin;

    //Calling the functions
//    fahrenheit = obtainTemp ();
//    rankine = convertTemp (tempR);
//    celsius = convertTemp (tempC);
//    kelvin = convertTemp (tempK);
//
    //will print it by...
    printResult (tempF, tempR, tempC, tempK);

    int temp;
//    printf("Press anything to exit: ");
//    scanf("%d", &temp);

    return 0;
}//main

//============obtainTemp===============
//double obtainTemp (void)
//{
//       //Local Declarations
//       double tempF;
//       printf("Enter temperature: ");
//       scanf("%lf", &tempF);
//
//       return tempF;
//}
//
//============convertTemp==============
//int convertTemp (double tempF, double tempR, double tempC, double tempK);
//{
//
//       //Statements
//       tempR = (tempF - 32) + 491.67;
//       tempC = (tempF - 32) * 100/180;
//       tempK = tempC + 273.16;
//
//       return tempF, tempR, tempC, tempK;
//}
//
//============printResult===============
void printResult (double tempF, double tempR, double tempC, double tempK)
{
     //Statements
     printf("The temperature is %f degrees fahrenheit\n", tempF);
     printf("The value of %f in rankine is %f\n", tempF, tempR);
     printf("The value of %f in celsius is %f\n", tempF, tempC);
     printf("The value of %f in kelvin is %f\n", tempF, tempK);
     return;
}

Это должно компилироваться с минимальными предупреждениями о неиспользуемых переменных.Далее раскомментируйте и исправьте самую простую вещь, затем следующую простую вещь и так далее.Попробуйте скомпилировать без предупреждений.

2 голосов
/ 18 мая 2011

В C вы должны сопоставить количество аргументов с объявлением вашей функции.Если вы хотите поддерживать переменное число аргументов в вашей функции, вы используете stdarg .Итак, ваш компилятор говорит вам, что:

rankine = convertTemp(tempR);

Не имеет 4 аргументов, но ваше объявление имеет.

0 голосов
/ 18 мая 2011

Вам нужно вызвать convertTemp с 4 параметрами из вашей основной функции, а не с одним.Я думаю .. но я не уверен, что вы хотите вернуть все 3 значения одновременно.Если это так, вы должны переопределить вашу функцию, чтобы использовать указатели вместо фиксированных значений.

int convertTemp (double tempF, double *tempR, double *tempC, double *tempK);
{
   //Statements
   *tempR = (tempF - 32) + 491.67;
   *tempC = (tempF - 32) * 100/180;
   *tempK = *tempC + 273.16;

   return 0; // return 0 for ok? in your function declaration you said it to be and double instead of a int
}

, тогда вам нужно вызывать их из вашего основного типа:

//Calling the functions
fahrenheit = obtainTemp ();
if (convertTemp (fahrenheit, &tempR, &tempC,&tempK) == 0) {
    printResult (fahrenheit, tempR, tempC, tempK);
}

с &Оператор в frond переменной мы говорим компилятору дать адрес памяти функции, а не значение самой переменной.Теперь функция имеет адреса и может dereference указатели (адреса памяти), чтобы она могла изменять содержимое переменных в основной функции:)

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