【问题标题】:how to save the conditional statement of an if command as a string?如何将if命令的条件语句保存为字符串?
【发布时间】:2020-11-19 18:31:27
【问题描述】:

我有一个数值算法。我为 R^2 中的点创建了一组 x 和 y 坐标。然后,我使用一个规则来查看哪些点适合我的目的,一个简单的 if 语句如下所示:

int N = 0;
for (int i1 = -xN; i1 < xN + 1; i1++)
{
    for (int i2 = -yN; i2 < yN + 1; i2++)
    {
        double x = dist(0) * i1;
        double y = dist(1) *i2;
        
        if (sqrt(pow(x, 2) + pow(y, 2)) > 0.8 && abs(x) < 3.1 && abs(y) < 3.91)
        {
            Points.row(N) = trans(vec{ x, y});
            N = N + 1;
        }
    
    }
}

由于我在每个示例中更改了规则(即 sqrt(pow(x, 2) + pow(y, 2)) > 0.8 && abs(x)

ofstream myfile;
myfile.open("resultEXAMPLE2D01.txt");
myfile << "xN = [" << xN << "];" << endl;
myfile << "N = [" << output.N << "];" << endl;
myfile << "% Condition is " << cond << endl;
myfile.close();

在这种情况下,“cond”应该是“sqrt(pow(x, 2) + pow(y, 2)) > 0.8 && abs(x)

【问题讨论】:

  • C++ 是一种编译语言,这意味着字符串“sqrt(pow(x,2)+[...]”实际上并不存在于编译的可执行文件中的任何位置(运行“字符串”实用程序上的可执行文件,如果你想验证);而是被编译成机器代码调用相关数学函数的地址。所以如果你想让你的程序将该字符串写入文件,你需要在您的程序中单独/明确地包含该字符串。
  • 能否扭转物流局面? IE。与其尝试将编译后的条件存储到字符串中(这是不可能的,正如 Jeremy 上面解释的那样),为什么不将字符串存储在表示条件的程序中,然后添加一个解析器来在执行期间分析字符串?这当然会慢得多,也很难实现,但至少是可能的。
  • JeremyFriesner 感谢您的澄清。 @Yunnosch 它也会帮助我。所以我首先将条件定义为一个字符串,然后尝试将其更改为一个布尔变量,该变量可以针对每个 x 和 y 进行评估。你能解释一下吗?
  • 不能针对不同的 x,y 计算布尔变量。您需要一个解析器将字符串“理解”为逻辑表达式。解析器是要实现的复杂事物。太复杂了,这里就不解释了。您可能需要阅读一些内容并寻找教程。可能StackOverflow对基本原理有一些疑问,或者在实现的时候具体问题。核心的变量是字符串。
  • 我只是想到了一个替代方案。您可以决定以一种中间格式存储逻辑表达式,这种格式易于处理逻辑并易于转换为字符串表示形式以供输出。根据您对可能用例的了解,这可能是最好的方法。需要支持多少和哪些操作符,sqrt、pow、&lt;&gt;&amp;&amp;abs、....还有什么?如果您可以枚举它们,那么您就更接近于一个简单的解决方案。这样就不再需要一个完整的解析器了。

标签: c++ string char boolean


【解决方案1】:

看起来你需要Stringification。您可以在此处阅读更多信息:

因此,您可以定义宏并将您的条件传递给它。在宏中,您可以放置​​您的计算代码,使用传递的条件,还可以将您的条件字符串化(将 #cond 用于 cond 参数)以输出到某处(文件、控制台等)。

示例如下:

int N = 0;

#define Calculate(cond) \
{ \
    N = 0; \
    for (int i1 = -xN; i1 < xN + 1; i1++) \
    { \
        for (int i2 = -yN; i2 < yN + 1; i2++) \
        { \
            double x = dist(0) * i1; \
            double y = dist(1) *i2; \
            \
            if (cond) \
            { \
                Points.row(N) = trans(vec{x, y}); \
                N = N + 1; \
            } \
     \
        } \
    } \
    \
    std::cout << "Condition: " << #cond << std::endl; \
}


int main()
{
    Calculate(sqrt(pow(x, 2) + pow(y, 2)) > 0.8 && abs(x) < 3.1 && abs(y) < 3.91)
    Calculate(x > 0)

    return 0;
}

程序输出:

Condition: sqrt(pow(x, 2) + pow(y, 2)) > 0.8 && abs(x) < 3.1 && abs(y) < 3.91
Condition: x > 0

【讨论】:

  • 我想我会在这里扩大魔法并制作两个宏(它们都使用相同的单个宏来定义条件)。一个用于评估条件的宏(但不是用于完整计算的循环),一个用于输出它的宏。所以我并不完全高兴,但这种方法是有效的,我错过了。我很感激。
  • 嗯,也许实际上需要在 a/宏中进行计算才能实现 OP 想要的......但是你已经得到了我的支持,不能再拥有它了,因为它比一开始我以为... ;-)
  • @Yunnosch,实际上,您可以从另一个宏中“调用”一个宏。或者将所有需要的代码放在一个中。或者创建宏ComputeAndPrint,从中调用另外两个转发相同参数的宏
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多