C++ 在C+中传递值+;-处理1:exc错误访问
我对以下代码有问题:C++ 在C+中传递值+;-处理1:exc错误访问,c++,function,C++,Function,我对以下代码有问题: void mc_duurtijd(int multiproject) { double random_getal[MULTIPROJECT][PROJECTEN][ACTIVITEITEN][RUNS]; double stochastische_duurtijd_berekenen[MULTIPROJECT][SCENARIO][PROJECTEN][ACTIVITEITEN][RUNS]; std::random_device rd;
void mc_duurtijd(int multiproject)
{
double random_getal[MULTIPROJECT][PROJECTEN][ACTIVITEITEN][RUNS];
double stochastische_duurtijd_berekenen[MULTIPROJECT][SCENARIO][PROJECTEN][ACTIVITEITEN][RUNS];
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_real_distribution<> dis(0, 1);
for (int p=0;p<PROJECTEN;p++)
{
for (int i=1;i<n_p[multiproject][p]-1;i++)
{
for (int r = 0; r < RUNS; r++)
{
random_getal[multiproject][p][i][r]=dis(gen);
}
}
}
for (int s=0;s<SCENARIO;s++)
{
for (int p=0;p<PROJECTEN;p++)
{
for (int i=1;i<n_p[multiproject][p]-1;i++)
{
for (int r=0;r<RUNS;r++)
{
stochastische_duurtijd_berekenen[multiproject][s][p][i][r]=bepaal_stochatische_duurtijd(random_getal[multiproject][p][i][r],multiproject,s, p, i, r);
}
}
}
}
for (int s=0;s<SCENARIO;s++)
{
for (int p=0;p<PROJECTEN;p++)
{
for (int i=1;i<n_p[multiproject][p]-1;i++)
{ stochastische_duurtijd[multiproject][s][p][i]=0.0;
for (int r=0;r<RUNS;r++)
{
stochastische_duurtijd[multiproject][s][p][i]+=stochastische_duurtijd_berekenen[multiproject][s][p][i][r];
}
stochastische_duurtijd[multiproject][s][p][i]=stochastische_duurtijd[multiproject][s][p][i]/RUNS;
}
}
}
for (int s=0;s<SCENARIO;s++)
{
for (int p=0;p<PROJECTEN;p++)
{
for (int i=1;i<n_p[multiproject][p]-1;i++)
{
stochastische_duurtijd[multiproject][s][p][i]=floor(stochastische_duurtijd[multiproject][s][p][i]/scale+0.5)*scale;
}
}
}
void berekeningen_initieel(int multiproject)
{
mc_duurtijd(multiproject);
bereken_CP_per_project_stochastisch(multiproject);
bereken_CP_max_stochastisch(multiproject);
for (int s=0;s<SCENARIO;s++)
{
bereken_backward_stochastisch(multiproject, s);
}
for (int s=0;s<SCENARIO;s++)
{
bereken_slack_stochastisch(multiproject);
}
toekennen_activiteitID(multiproject);
}
int main()
{
mp =0;
scale=0.000000000001;
srand(time(NULL)); // the random seed is initialized to a value representing the current time (calling time) to generate a different value every time the program is run.
inlezen_data();
print_output();
for (int multi =0; multi<MULTIPROJECT;multi++)
{
berekeningen_initieel(multi);
maak_planning(multi);
bereken_doelfunctie(multi);
print_evaluatie(multi);
}
return 0;
}
void mc_duurtijd(int多项目)
{
双随机[多项目][PROJECTEN][ACTIVITEITEN][RUNS];
双重随机性[MULTIPROJECT][SCENARIO][PROJECTEN][ACTIVITEITEN][RUNS];
std::随机_装置rd;
标准:mt19937 gen(rd());
一致实分布dis(0,1);
对于@Nick指出的(int p=0;p),我还确认这很可能是因为数组对于函数来说太大了。但是有一个解决方法。您可以将数组声明移动到函数外部,如下所示:
#define MULTIPROJECTEN 420
#define SCENARIO 4
#define PROJECTEN 3
#define ACTIVITEITEN 32
#define RUNS 100
double random_getal[MULTIPROJECT][PROJECTEN][ACTIVITEITEN][RUNS];
double stochastische_duurtijd_berekenen[MULTIPROJECT][SCENARIO][PROJECTEN][ACTIVITEITEN][RUNS];
void mc_duurtijd(int multiproject) { ... }
void berekeningen_initieel(int multiproject) { ... }
int main() { ... }
几乎所有的C执行环境都使用堆栈来存储本地变量和嵌套函数调用的返回地址。堆栈的大小通常是可配置的;通常限制在1个MiB左右
给定MULTIPROJECTEN=420;PROJECTEN=3;ACTIVITEITEN=32;RUNS=100 mc_duurtijd中的随机数据大小约为32 MiB。尝试执行该程序会导致堆栈溢出
对大缓冲区使用动态内存分配(即malloc)。尝试将值写入日志(或控制台)。您需要进行一些调试并缩小问题范围。堆栈溢出不是一个讨论板。若要对OP执行迭代调试,请邀请他们到聊天室。谢谢,但我无法运行该函数,因为发生错误xc_错误访问。这可能是由于数组的大小和维数造成的吗?数组double random_getal[MULTIPROJECT][PROJECTEN][ActiviteItem][RUNS];MULTIPROJECTEN=420;PROJECTEN 3;ActiviteItem=32;RUNS=100。当我通过设置MULTIPROJECTEN=5来减小数组的大小时,它正在工作。但我真的需要这么大的大小..我怀疑(for)(int I=1;i@LightningRacisinObrit下一次可以吗