计算器赋值函数中的意外结果

Unexpected result in assignment function for a calculator

提问人:bulug 提问时间:10/24/2023 最后编辑:bulug 更新时间:10/24/2023 访问量:68

问:

我目前正在尝试解决Bjarne Stroustrup的“编程:使用C++的原理和实践”第7章的练习2。

我必须在代码中实现赋值操作。代码有 500 行长,所以我将省略我已经彻底测试过并且我知道不是问题原因的段。

问题出在函数上,更具体地说,如果 i 的值在 之后,则输出正确的值,但返回不同的值。例如:assignment()coutdset_value()

如果我输入:

let c = 3;

代码将按预期输出,但如果我继续进行赋值操作,请键入:"= 3"

c = 2

代码输出 ,与 2 不同。-1.45682e+144

代码如下:

class Token {
public:
    char kind;        // what kind of token
    double value;     // for numbers: a value 
    string name;      // for names: name itself
    Token(char ch) : kind(ch), value(0) {}
    Token(char ch, double val) : kind(ch), value(val) {}
    Token(char ch, string n) : kind(ch), name(n) {}
};

class Variable {
public:
    string name;
    double value;
    Variable(string n, double v) :name(n), value(v) { }
};

void set_value(string s, double d)
// set the Variable named s to d
{
    for (int i = 0; i < var_table.size(); ++i)
        if (var_table[i].name == s) {
            var_table[i].value = d;
            return;
        }
    error("set: undefined variable ", s);
}

double assignment(string name)
{
    Token t = ts.get();
    if (t.kind != '=') error("= missing in declaration of ", name);

    double d = expression(); 
    set_value(name, d);
    return d;
}

ts.get()如果它在输入中找到字符串或双精度,则返回包含 AND 的适当标记,或者仅针对其他可以表示为字符的文字(例如运算符,或者在本例中为 )。kindvaluekind'='

expression()计算并返回它找到的成瘾、减法、乘法、除法和模的任意组合,并且还支持括号 、 和 。它工作得很好。sqrt()pow()

由于我在调用之前已经检查了是否已经通过语句声明了,因此我只调用将名为 的变量的成员更改为 。nameletassignment()set_value()valuesd

var_table是我声明的所有变量。vector

我已经为这个问题解决了几个小时,但无法解决。科学记数法奇怪的数字输出是如此随机,并且以某种方式发生在正常工作和 .set_value()return d;

如果你好奇,可以在这里找到完整的代码 https://collabedit.com/5pa6h

C++ 函数 variable-assignment

评论

3赞 Remy Lebeau 10/24/2023
如果对象是使用输入构造的,则除非稍后对该对象调用,否则该成员将保持未初始化状态。Tokenstringvalueset_value()
3赞 Raymond Chen 10/24/2023
打开编译器警告。“警告:控制达到非无效功能的末尾”。有趣的是,你认为问题发生在 和 之间,因为 和 之间发生了很多事情,也可能出错。跟着它去看看它去哪里。(剧透警报;它被扔掉了。set_value()return dreturn dcoutreturn d
1赞 user12002570 10/24/2023
什么是调试器,它如何帮助我诊断问题?
0赞 bulug 10/25/2023
非常感谢您的回答,我能够解决问题并学到新东西!@RaymondChen
1赞 Raymond Chen 10/25/2023
请发布答案,以帮助将来遇到相同问题的其他人。

答: 暂无答案