【问题标题】:decoding the runtime error (SIGFPE)解码运行时错误 (SIGFPE)
【发布时间】:2015-03-02 17:46:25
【问题描述】:

这是 spoj.com (http://www.spoj.com/problems/PRIC/) 上的问题。我们必须检查序列的数字是否:ai=( a(i-1)+1234567890 ) mod 2^31 是否为素数,第一个数字是 1。 我的代码如下(请尽量忽略笨拙。)基于eratosthenes的筛子。

问题:我们必须为 i=33,333,333 的序列打印“prime(1) or not(0)”,我的代码对于 i(代码中的 c3)值高达 8000 左右以及之后(例如 c3>19000 )它开始给出 SIGFPE 错误。现在我用谷歌搜索了这个错误,它与除法/模减 0 有关。但是为什么该代码适用于 c3 值高达 9000 但不能超过此值?

【问题讨论】:

  • 你试过在调试器中运行程序吗?如果您使用调试符号进行编译,gdb 通常会为您提供故障跟踪 :)
  • 我不知道这是什么意思,你能指出一个有用的链接吗?
  • 如果您想查找信息,为什么不使用网络搜索?我们为什么要为你做?为什么我们必须为您搜索链接?如果您想编写代码,则需要花时间学习如何调试。
  • 也许prime2[j] 为零。
  • @BLUEPIXY 您似乎是对的好先生,请看我的回答 :)

标签: c++ c sigfpe


【解决方案1】:

根据您的编译器和开发环境,您应该阅读调试器的概念。 This answer 有使用gdb 的指南。如果您使用的是 Visual Studio、Code::Blocks 或任何其他 IDE,请查看调试功能。例如如何设置断点或步入/退出/跳过函数调用,例如观察或更改变量等。(我提到这些事情是为了给你谷歌搜索词的重要提示,眨眼眨眼轻推) .

编辑

复制粘贴代码并保存它,用gcc -g 编译调试符号和-lm 链接数学库,我通过gdb 运行它,它给了我这个输出:

Program received signal SIGFPE, Arithmetic exception.
0x0000000000400707 in sieve (prime=0x6626a0) at t.c:43
43        if (a%prime2[j]==0){

这告诉您查看第 43 行,使用模运算的 if 语句。这似乎是你做模零的地方。

请注意,当我从 Stackoverflow 复制粘贴您的代码时,我得到的文档中的第 43 行可能不是您文档中的第 43 行。

EDIT2

嘿,我的回答未被接受! - 为什么会这样:)?

【讨论】:

  • 这真的很丰富。酷 :) 让我在我的代码中检查一下
  • 研究使用调试器。您在 C 中拥有的运行时环境没什么好说的。在我看来,在使用 C 开发时,您需要从工具中获得的所有帮助。
  • @user2657257 请采纳 Morten 的出色建议并在调试器中重现问题,而不是仅仅应用修复程序。你会惊讶于你将释放的新力量!
  • 知道了.. 真的很愚蠢的错误 :) 谢谢.. 它应该是 j

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多