簡體   English   中英

隨機數生成器錯誤C ++ MFC

[英]random number generator error c++ MFC

我正在創建一個隨機數生成器,當遇到一些錯誤時,它會將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);
}

您的void number_Generator(double dblArray[], int length)函數正在訪問類成員,但是該函數本身不是該類的成員。 因此,使其成為一個或傳遞所需的參數。

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

正如我在評論中提到的那樣,由於number_Generator不是成員,因此您需要CECET_MFC_Dialog_Based_IntroDlg的實例才能訪問這些字段。 由於您指示字段是公共的,所以最簡單的解決方案(盡管不是最干凈的)是將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 Final_Avg = rndAvg / counter; // final average to display還為時過早,rndAvg和計數器還沒有正確的值。 這導致被0

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

  • 最好分別將rndMinrndMax初始化為INT_MAXINT_MIN (或從climits獲取數據類型的適當限制),並擺脫if (rndMin == 0)if (rndMax == 0)檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM