C++中的函数通过引用调用时,变量在main中超出范围

Variables out of scope in main when called by reference by a function in C++

本文关键字:变量 main 中超 范围 调用 函数 引用 C++      更新时间:2023-10-16

我做了以下代码,其输出应该在以原点为中心的单位圆上随机均匀地生成一个点:

#include "unif.h"
#include <iostream>
#include <cmath>
using namespace std;
void point_on_circle(double& x, double& y)
{
 double r;
do
    {
    double x = unif(-1.,1.);
    double y = unif(-1.,1.);
    double r = x*x + y*y;
    }
    while (r >=1.0);
    x = x / sqrt(r);
    y = y / sqrt(r);
}
int main()
{
 cout << "Pair of points on the circle found is " << x << " and " << y << endl;
 cout << "Let's verify: x^2+y^2=" << x*x+y*y << endl;
    return 0;
}

标题"unif.h"只是一个包含函数void unif(double x,double y)的文件,该函数在区间(x,y)中产生均匀的随机数,并且它工作得很好(已经测试过)。问题是,当我构建程序时,它(当然)会给我主要的错误:

"错误:没有在此作用域中声明"x"

这是清楚的,因为x当然是在main之外定义的,而从来没有在main()中定义过。我不知道如何告诉编译器,函数point_on_circle找到的x和y的值应该在main中"携带"。如何修复此代码?提前感谢

在您的主方法中,您既没有声明名为x的变量,也没有声明y的变量此外,您在使用变量rpoint_on_circle(double& x, double& y)函数中也存在范围界定问题。

请查看C++范围

因为你在do-while循环中定义了x,所以你不能在循环之外使用它,因为这些定义隐藏了参数x和y。在循环之前定义它:

void point_on_circle(double& x, double& y)
{
    double r;
    do
    {
        x = unif(-1.,1.);
        y = unif(-1.,1.);
        r = x*x + y*y;
    }while (r >=1.0);
    x = x / sqrt(r);
    y = y / sqrt(r);
}

您有一些问题。1) 您需要在main中声明x和y。2) 你从来没有真正调用过point_on_circle。完全3) 最后,正如其他人所指出的,在do循环中屏蔽参数x和y。

话虽如此,看起来你正试图在单位圆上找到一个随机点。考虑到这一点,我会完全取消do循环,只做以下操作:

void point_on_circle(double& x, double& y)
{
    double r;
    x = unif(-1.,1.);
    y = unif(-1.,1.);
    r = x*x + y*y;
    x = x / sqrt(r);
    y = y / sqrt(r);
}

它给出了完全相同的结果,同时避免了(潜在的)无休止的循环,当然也避免了无用的额外处理。