【问题标题】:Trouble with simple functions简单功能的麻烦
【发布时间】:2015-10-08 16:26:42
【问题描述】:

我正在编写代码来调用与力、质量和加速度方程有关的函数。函数被正确调用,但输入没有按应有的方式相乘。我的第一个函数的输出是一个疯狂的小数字,第一个函数的输出总是 0。 这是我的代码。任何反馈都会非常有帮助。谢谢。

#include <iostream>
#include <cstdlib>

using namespace std;

void displayMenu();
double force(double);
double secondForce(double,double);

int main(int argc, char** argv) 
{
    int menuOption;
    displayMenu();
    system("PAUSE");
    return 0;
}

void displayMenu(void)
{
    int menuOption;
    double weight, accel;
    cout << "           Main Menu" << endl;
    cout << "Enter 1 for Force calculation with acceleration = 9.8m/s^2.\n";
    cout << "Enter 2 for Force calculation with user defined acceleration.\n";
    cout << "Enter 3 to quit the program.\n";
    cin >> menuOption;
        if(menuOption==1)
        {
            cout << "Enter a mass.\n";
            cin >> weight;
            cout << "The force is ";
            cout << force(weight);  
            cout << "N.";
            }
        else if(menuOption==2){
            cout << "Enter a mass.\n";
            cin >> weight;
            cout << "Enter an acceleration.\n";
            cin >> accel;
            cout << "The force is ";
            cout << secondForce(weight, accel);
            cout << "N.";
        }
}

double force(double weight)
{
    double force, mass;
    force=(mass*(9.8));
    return force;
}

double secondForce(double secondMass, double secondWeight)
{
    double secondForce, mass, acceleration;
    secondForce=(mass*acceleration);
    return secondForce;

}

【问题讨论】:

  • 您使用massacceleration 而不用任何值初始化它们。您可能正在与随机垃圾相乘。

标签: c++ function output


【解决方案1】:

您在函数中使用了未初始化的变量。在你的程序中使用这些未初始化的变量是undefined behavior

force=(mass*(9.8)); << mass has a garbage value
secondForce=(mass*acceleration); << mass and acceleration have a garbage value

我想你应该有

double force(double weight)
{
    return weight * 9.8;
}

double secondForce(double secondMass, double secondAccel)
{
   return secondMAss * secondAccel;
}

【讨论】:

  • 我认为第二句话不是 100% 正确,因为未初始化的 unsigned char 不会导致未定义的行为,而只会导致未指定的值。 (这并不重要。)
  • @ChristianHackl 它在哪里说出来的?
  • 我的意思是“使用未初始化的变量是未定义的行为”对于所有类型都是正确的,但 unsigned char
  • @ChristianHackl 是的,我想知道在哪里调用。我以前没见过。
  • 对不起,我误解了你的评论。一些来源(在其中搜索“unsigned char”):ibm.com/developerworks/library/pa-ctypes3stackoverflow.com/questions/6725809/trap-representation/6725981。我相信§3.9.1/1 是 C++ 的官方保证:“对于无符号窄字符类型,值表示的每个可能的位模式代表一个不同的数字。这些要求不适用于其他类型。” i> 没有陷阱表示 -> 读取时没有 UB。
【解决方案2】:

问题是您在计算中使用了未定义的变量。在下面查看我的嵌入式 cmets:

double secondForce(double secondMass, double secondWeight)
{
    double secondForce, mass, acceleration;
    secondForce=(mass*acceleration); //what is the value of mass and acceleration here??
    return secondForce;
}

附带说明:考虑在 gdb 之类的调试器中单步执行您的代码,以便查看程序的执行方式。对于大型程序来说,试图通过它进行推理是非常困难的。在您的示例中,有经验的程序员很容易发现它。

【讨论】:

  • 虽然我当然同意学习使用调试器是一个绝妙的主意,但我想知道它如何可能有助于解决这个特定问题。 OP 会看到变量显然包含奇怪的随机值,并一直想知道为什么。
  • 他们至少会看到变量有奇怪的数据,并将问题缩小到一行代码。是什么让您认为 OP 无法将奇怪的数据值与未初始化的变量相关联?
  • 是什么让我这么想?好吧,在大学软件工程课程中担任助教的经历......以及我自己的过去,当我开始学习 C 时。
  • 好的,但您同意他们至少可以将范围缩小到一行代码?
  • 我尝试按照其他一些 cmets 的建议将这些变量定义为 0.0,但答案仍然保持不变?如何让用户定义这些变量是什么,然后在我的函数中正确使用这些值?
【解决方案3】:

您将数据乘以垃圾值

double force(double weight)
{
double force, mass;
force=(mass*(9.8));
return force;
}

double secondForce(double secondMass, double secondWeight)
{
double secondForce, mass, acceleration;
secondForce=(mass*acceleration);
return secondForce;
}

massacceleration 这里的值是多少?这些变量未初始化。您必须先为它们分配一些值。

【讨论】:

  • 再说你最后一句话:更好的办法是初始化它们。首先让它们未初始化,然后为它们分配一些东西,这是 C++ 中完全不需要的旧 C 主义。
【解决方案4】:

您应该启用编译器警告并注意它们。例如,即使在最低警告级别下,MSVC 也会这样说:

warning C4700: uninitialized local variable 'mass' used
warning C4700: uninitialized local variable 'mass' used
warning C4700: uninitialized local variable 'acceleration' used

在 C++ 中,使用未初始化的变量绝不是一个好主意。与其他语言不同,C++ 中的大多数变量不会自动初始化为 0 值。当要访问变量中包含的值时,这会导致您的程序禁止未指定或未定义的行为。

安全无误。 初始化!例如:

double force = 0.0;
double mass = 0.0;

请注意,该语言还允许您先初始化,然后分配,然后使用变量。例如:

double force;
force = 0.0;
cout << force;

但那是一种糟糕的风格。当你可以一步完成所有事情时,为什么要让一个变量未初始化,然后再分配一些东西?首先保持变量未初始化也会阻止您将其设为const

确保所有变量的正确初始化将使您的程序的行为定义和一致。但是,您还会遇到其他问题,因为您将 0 mass 相乘,结果始终为 0,而且肯定不是您想要的。但是,确定性行为是修正错误数学的良好起点。

【讨论】:

  • 我尝试在函数中将这些变量定义为 0.0,但答案仍然保持不变?如何让用户定义这些变量是什么,然后在我的函数中正确使用这些值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 2022-01-24
  • 2017-01-30
  • 2022-10-18
  • 1970-01-01
相关资源
最近更新 更多