未初始化的变量

时间:2016-09-21 21:26:40

标签: c function variables

我正在尝试编写两个函数,一个接受输入,另一个计算加速度。编译器告诉我我的变量是未初始化的,但它们应该有来自输入的值。我做错了什么。

#include <stdio.h>
#include <stdlib.h>

void input_instructions(double vi, double vf);
double compute_acceleration(double vi, double vf);

int main()
{
    double vi;
    double vf;
    double acc;
    double t;


    input_instructions(vi, vf);

    acc = compute_acceleration(vi,vf);

    t = (vf - vi)/acc;

    printf("The constant acceleration of the cyclist is %.2f and it will take him %.2f minutes/seconds/"
            "to come to rest with an initial velocity of 10mi/hr.\n", acc, t);
}

void input_instructions(double vi, double vf)
{
    printf("This program will calculate the rate of accleration and the time it takes/"
            "the cyclist to come to rest\n");
    printf("Enter inital velocity=>");
    scanf("%lf", &vi);
    printf("Enter final velocity");
    scanf("%lf", &vf);
}

double compute_acceleration(double vi, double vf)
{
    double t = 1;
    double a = (vf-vi)/t;
    return (a);
}

4 个答案:

答案 0 :(得分:3)

哇,这里发生了很多不好的事情。除了在main()中声明的未初始化变量之外(是的,编译器是正确的)C通过参数按值传递。 vi和vf参数存储在堆栈中。然后你的scanf获取该堆栈变量的地址,为其赋值,函数返回,并且指定的值消失了 - 噗!

void input_instructions(double vi, double vf)
{
    printf("Enter inital velocity=>");
    scanf("%lf", &vi);
    printf("Enter final velocity");
    scanf("%lf", &vf);

    // function returns and input parameter values are gone.
 }

您希望将指针传递给变量,如下所示:

void input_instructions(double *vi, double *vf)
    {
        printf("This program will calculate the rate of accleration and the time it takes/"
                "the cyclist to come to rest\n");
        printf("Enter inital velocity=>");
        scanf("%lf", vi);
        printf("Enter final velocity");
        scanf("%lf", vf);

并从main()调用如下:

   input_instructions(&vi, &vf);

请参阅examples

答案 1 :(得分:1)

您正在读取input_instructions函数中的变量,因此无法传入&#34;&#34;传入&#34;。而且由于它们的内存在函数内部被旋转,因此它们无法在其外部访问。

一个选项是将变量vi和vf更改为全局变量,方法是在main之外声明它们,不要在input_functions的签名中使用它们,其余的可能没问题。

#include <stdio.h>
#include <stdlib.h>

/* Prototypes */
void input_instructions();
double compute_acceleration(double new_vi, double new_vf);

/* Globals */
double vi;
double vf;

int main()
{

在这种情况下,由于您正在传递全局变量,因此您甚至不一定需要接受compute_acceleration函数上的参数。我通常不会推荐全局变量,但这似乎是你正在处理的问题中最少的。

另一种选择是将main中的变量vi和vf初始化为0,然后通过引用将它们传递给input_instructions,以便函数可以更改它们的值。

例如:

 void input_instructions(double *i, double *f);
 double compute_acceleration(double x, double y);


 int main()
 {
     double vi = 0;
     double vf = 0;
     double acc = 0;
     double t = 0;


     input_instructions(&vi, &vf);
     acc = compute_acceleration(vi,vf);

我更改了变量的名称,以帮助理解变量的内存位置存在的位置,并显示在示例中,main中的vi实际上是与被调用方法中的vi不同的变量。

答案 2 :(得分:0)

将vi,vf,acc和t声明为全局变量(在main之外)。

#include <stdio.h>
#include <stdlib.h>

void input_instructions();
double compute_acceleration();
double vi;
double vf;
double acc;
double t;
int main()
{



    input_instructions();

    acc = compute_acceleration();

    t = (vf - vi)/acc;

    printf("The constant acceleration of the cyclist is %.2f and it will take him %.2f minutes/seconds/"
            "to come to rest with an initial velocity of 10mi/hr.\n", acc, t);
}

void input_instructions()
{
    printf("This program will calculate the rate of accleration and the time it takes/"
            "the cyclist to come to rest\n");
    printf("Enter inital velocity=>");
    scanf("%lf", &vi);
    printf("Enter final velocity");
    scanf("%lf", &vf);
}

double compute_acceleration()
{
    double t = 1;
    double a = (vf-vi)/t;
    return (a);
}

或者你可以使用指针并将它们传递给'input_instructions'函数。

答案 3 :(得分:0)

void input_instructions(double vi, double vf)
{
.
.
}

变量vivf是函数的局部变量,并且与main()函数中类似命名的变量无关。换句话说,它们有function-scope,并且在函数返回后它们不再存在。

你应该做的是:

input_instructions(&vi,&vf); // pass the address in the main()

并将函数重写为:

void input_instructions(double *vi, double *vf) // Using pointers
{
    printf("This program will calculate the rate of accleration and the time it takes/"
            "the cyclist to come to rest\n");
    printf("Enter inital velocity=>");
    scanf("%lf", vi); // Hmm, you're changing the value in the main()
    printf("Enter final velocity");
    scanf("%lf", vf); // Note no '&' since we're dealing with pointers.
}

此处使用函数的正式参数main()vfvi *vf*vi进行持久更改{ {1}}。