【问题标题】:random number generator error c++ MFC随机数生成器错误 C++ MFC
【发布时间】:2013-04-22 08:26:14
【问题描述】:

当我遇到一些错误时,我正在创建一个随机数生成器,它将 Min、Max、Avg、随机数和冒泡排序的数字保存到一个 excel 文件中,由于某种原因,我无法从 c++ MFC 调用这个函数为下面直接显示,我怎样才能使它工作?

//***************Number generator function*******************
void number_Generator(double dblArray[], int length)
{
    srand((unsigned)time(0));
    double rndDbl;
    int rndInt;
    double rndAvg = 0;
    int counter = 0;
    double temp = 0;

    Final_Avg = rndAvg / counter; // final average to display
    double lDbl=0, hDbl=Random_Cap; 
    int lInt = 0, hInt=1;

    double dblRange=(hDbl-lDbl)+1;
    int intRange=(hInt-lInt)+1;

    for(int index=0; index<Samples_To_Create; index++) 
    {
        rndInt = lInt+int(intRange*rand()/(RAND_MAX + 1.0));
        rndDbl = lDbl+double(dblRange*rand()/(RAND_MAX + 1.0));

        // random number if statement
        if (rndInt == 0){
            rndDbl = -(rndDbl);
        }

        //start of Min/Max if statements
        if (rndMin == 0){
            rndMin = rndDbl;
        }
        else if (rndDbl < rndMin){
            rndMin = rndDbl;
        }

        if (rndMax == 0){
            rndMax = rndDbl;
        }
        else if (rndDbl > rndMax){
            rndMax = rndDbl;
        } //end of Min Max if statements

        temp = rndDbl;
        rndAvg += temp;
        dblArray[counter] = temp;
        counter++;
        }

    }
}

它是从按钮点击处理程序中调用的:

void CECET_MFC_Dialog_Based_IntroDlg::OnBnClickedCreate()
{
    UpdateData(true);

    number_Generator(dblArray, 100); //100 means generate 100 random numbers

    UpdateData(false);
}

公共访问变量作为未声明的标识符出现,即使它们的定义如下所示。

CECET_MFC_Dialog_Based_IntroDlg::CECET_344_MFC_Dialog_Based_IntroDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CECET_344_MFC_Dialog_Based_IntroDlg::IDD, pParent)
, Final_Avg(0)
, rndMax(0)
, rndMin(0)
, Samples_To_Create(0)
, Random_Cap(0)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CECET_MFC_Dialog_Based_IntroDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_EDIT3, Final_Avg);
    DDX_Text(pDX, IDC_EDIT4, rndMax);
    DDX_Text(pDX, IDC_EDIT5, rndMin);
    DDX_Text(pDX, IDC_EDIT2, Samples_To_Create);
    DDX_Text(pDX, IDC_EDIT1, Random_Cap);
}

【问题讨论】:

  • 我看到一堆错误,但对于您的主要问题,由于number_Generator 不是CECET_MFC_Dialog_Based_IntroDlg 的成员,因此必须通过该类的显式实例进行访问。

标签: c++ visual-studio-2010 class visual-studio-2012


【解决方案1】:

正如我在评论中提到的,您需要一个 CECET_MFC_Dialog_Based_IntroDlg 的实例来访问这些字段,因为 number_Generator 不是成员。由于您指出这些字段是公开的,因此最简单的解决方案(尽管不是最干净的)是更改 number_Generator 以接受指针:

void number_Generator(double dblArray[], int length, CECET_MFC_Dialog_Based_IntroDlg *p)
{
    // access the variables via p->Final_Avg, p->rndMin, et cetera
}

然后你可以这样称呼它:

void CECET_MFC_Dialog_Based_IntroDlg::OnBnClickedCreate()
{
    UpdateData(true);

    number_Generator(dblArray, 100, this); //100 means generate 100 random numbers

    UpdateData(false);
}

我在快速检查时注意到number_Generator 中的一些其他语义错误:

  • Final_Avg = rndAvg / counter; // final average to display 完成得太早,rndAvg 和 counter 还没有正确的值。这会导致除以0

  • 不需要counter,请改用dblArray[index]

  • 最好将rndMinrndMax分别初始化为INT_MAXINT_MIN(或者从climits对数据类型进行适当的限制),并去掉if (rndMin == 0)if (rndMax == 0) 检查。

【讨论】:

  • (193) number_Generator(dblArray, 100, this); 'number_Generator' : 函数不接受 3 个参数
  • 听起来你忘记更改声明了。
  • 当然,没问题。请注意,虽然这会起作用,但最好重构代码,这样您就不必这样做了。保持关注点分离。顺便说一句,我注意到还有一些问题,但我认为唯一不是很轻微的问题是您忽略了传递的 length 值并改用 Samples_To_Create
【解决方案2】:

您的void number_Generator(double dblArray[], int length) 函数正在访问类成员,但函数本身不是该类的成员。所以让它成为一个或传递所需的参数......

void CECET_MFC_Dialog_Based_IntroDlg::number_Generator(double dblArray[], int length)
{
   ....
}

【讨论】:

    猜你喜欢
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多