【发布时间】:2021-03-09 00:42:52
【问题描述】:
在我的程序编译时出现分段错误(核心转储)。我无法检测到程序的问题。我正在粘贴我的代码。如果有人遇到问题,请回复。
#include<bits/stdc++.h>
using namespace std;
typedef long double ld;
int main()
{
int a,b,c;
cin>>a>>b>>c;
ld dp[101][101][101];
for(int i=100;i>=0;i--)
{
for(int j=100;j>=0;j--)
{
for(int k=100;k>=0;k--)
{
if(i==100 || j==100 || k==100)
{
dp[i][j][k] = 0;
}
else
{
long double cnt = i+j+k;
dp[i][j][k] = 1 + (1.0*i/cnt)*dp[i+1][j][k] + (1.0*j/cnt)*dp[i][j+1][k] + (1.0*k/cnt)*dp[i][j][k+1];
}
}
}
}
cout<<dp[a][b][c];
return 0;
}
【问题讨论】:
-
1.0*i/cnti = j = k = 0时最后一次迭代会发生什么? -
也看看为什么不Declare large array on Stack。
-
两个建议:1) 请在调试器中运行您的应用程序,获取堆栈回溯:xspdf.com/resolution/51890324.html 这是关键。请使用回溯更新您的帖子。 2)考虑将
ld dp[101][101][101];改为new或malloc()(动态分配)。我怀疑“崩溃”可能只是stack overflow -
“我的程序在编译时出现分段错误(核心转储)。” -- 值得怀疑。您更有可能正在执行某种“构建和运行”操作,并且您在运行程序时遇到了崩溃。发送到
std::cerr的调试器或诊断消息应该使您能够找到触发崩溃的行。由此,请构建一个关注问题的minimal reproducible example。 (如果崩溃似乎发生在任何行运行之前,请尝试修剪main中的所有内容,但dp的定义。) -
有人给出了一个答案,指出了一个特定的原因,而您编辑了这个问题,使他们的答案不再有效。因此,显然,您的意图是在每次获得答案时继续编辑您的代码,直到它被完全调试。使用 SO 作为一种以这种方式迭代调试代码的方法,至少会惹恼一些人。
标签: c++ algorithm dynamic-programming