我正在创建一个随机数生成器,当我遇到一些错误时,会将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);
}
答案 0 :(得分:0)
您的void number_Generator(double dblArray[], int length)
函数正在访问类成员,但函数本身不是该类的成员。所以把它作为一个或传递所需的参数....
void CECET_MFC_Dialog_Based_IntroDlg::number_Generator(double dblArray[], int length)
{
....
}
答案 1 :(得分:0)
正如我在评论中提到的,由于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]
。
最好将rndMin
和rndMax
初始化为INT_MAX
和INT_MIN
(或climits
对数据类型的适当限制),分别取消if (rndMin == 0)
和if (rndMax == 0)
支票。