C编程:参数传递和返回值

时间:2015-09-21 21:47:42

标签: c

我希望能得到一些我认为非常简单的C编程任务的输入。我已经坚持了几天,我认为问题是基本参数传递的问题。

  1. 我的conv_to_cent.c程序中包含main()
  2. 此程序调用库函数convert_to_cent并传入参数double fahr。库函数应该采用华氏温度值并将其转换为摄氏温度。
  3. 库函数成功接收传入的值,成功执行计算,将结果存储在名为cent的变量中,然后尝试使用return cent返回。
  4. 这看起来很简单,但我的函数返回的值与函数中计算的值不匹配。
  5. 有谁知道会导致这个问题的原因或知道我做错了什么?非常感谢您的帮助。
  6. 以下是我的来源及其所在的3个文件:

    conv_to_cent.c

    #include <stdio.h>
    
    int main()
    {
        double fahr;
        fahr = 83.0;
        printf ("%3.1f degrees Fahrenheit is %3.1f degrees centigrade.\n",
             fahr, convert_to_cent(fahr));
        return 0;
    }
    

    cent_convert_header.h

    double convert_to_cent (double fahr);
    

    cent_convert.c

    #include <stdio.h>
    #include <cent_convert_header.h>
    
    double convert_to_cent(double fahr)
    {
        double cent;
        printf ("output from cent_convert: fahr passed in: %3.1f \n", fahr);
    
        /* perform the calculation to centigrade */
        cent = (5/(double)9) * (fahr-32);
        printf ("output from cent_convert: calculated value for cent is: %3.1f \n", cent);
    
        /* return the calculated value */
        return cent;
    }
    

    输出

    output from cent_convert: fahr passed in: 83.0
    output from cent_convert: calculated value for cent is: 28.3
    output from main: 83.0 degrees Fahrenheit is 83.0 degrees centigrade.
    

2 个答案:

答案 0 :(得分:2)

正如@WeatherVane在评论中建议的那样, conv_to_cent.c 文件缺少 cent_convert_header.h 的包含。这会导致编译器假定convert_to_cent返回int,而不是printf,因此事情就会中断。

详细说明可以发生的事情(虽然这是纯粹的推测,因为你有一个未定义的行为):我最好的猜测为什么你得到的结果是你做的从浮点堆栈中读取fahr的第二个参数。浮点堆栈似乎多次包含printf,因此对于第一个和第二个convert_to_cent参数,它的值都被检索。同时,编译器将一些幻像返回值从printf推送到int作为printf,但由于对var q = from t1 in db.Table1 from t2 in db.Table2.Where(x => x.ColA == t1.ColA && x.ColB == t1.ColB) select t1; 的调用不包含整数,因此永远不会读取此值-specifier。

答案 1 :(得分:1)

除了转换例程中缺少的标题#include之外,您还希望做的一件事就是用简单的{{1} 包装您的头文件}(#ifndef)调用用于标识头文件的唯一标签。目的是防止在编译时多次包含头文件。 (如果查看任何标准头文件,您将看到它完成)

要防止多重包含,您只需检查该标头是否存在唯一的现有定义,如果不存在,则创建#if not defined并包含标题内容。例如,使用您的#define文件:

<强> cent_convert.h

cent_convert.h

注意:保留所有资金包括系统的定义,只是让你的小写确保没有冲突。另外,给定义值#ifndef _cent_convert_h_ #define _cent_convert_h_ 1 #include <stdio.h> double convert_to_cent (double fahr); #endif /* _cent_convert_h_ */ (或某个正数)。虽然不是100%要求,但他们在技术上应该测试1

剩余的文件流不受影响:

<强> cent_convert.c

TRUE

<强> f2c.c

#include "cent_convert.h"

double convert_to_cent(double fahr)
{
    double cent;

    printf ("output from cent_convert: fahr passed in: %3.1f \n", fahr);

    /* perform the calculation to centigrade */
    cent = (5/(double)9) * (fahr-32);

    printf ("output from cent_convert: calculated value for cent is: %3.1f \n",
            cent);

    /* return the calculated value */
    return cent;
}