【问题标题】:C++ 0xC0000094: Integer division by zeroC++ 0xC0000094:整数除以零
【发布时间】:2013-03-18 16:39:05
【问题描述】:

此代码在 100000 之前运行良好,但如果您输入 1000000,它将开始给出错误 C++ 0xC0000094: Integer division by zero。我确信这与浮点有关。我尝试了 (/fp:precise)、(/fp:strict)、(/fp:except) 和 (/fp:except-) 的所有组合,但没有得到肯定的结果。

#include "stdafx.h"
#include "time.h"
#include "math.h"
#include "iostream"
#define unlikely(x)(x)

int main()
{
    using namespace std;
    begin:
    int k;
    cout<<"Please enter the nth prime you want: ";
    cin>>k;
    int cloc=clock();
    int*p;p=new int [k];
    int i,j,v,n=0;
    for(p[0]=2,i=3;n<k-1;i+=2)
    for(j=1;unlikely((v=p[j],pow(v,2)>i))?!(p[++n]=i):(i%v);++j);
    cout <<"The "<<k<<"th prime is "<<p[n]<<"\nIt took me "<<clock()-cloc<<" milliseconds to find your prime.\n";
    goto begin;
}

【问题讨论】:

  • 说真的?!!!您能否格式化您的代码,使其至少具有可读性?
  • 除以 0 会导致不定式结果。即,您不能将数字除以 0。(en.wikipedia.org/wiki/Division_by_zero)
  • 抱歉,我就是这样将它保存在控制台中的。我希望现在更清楚了。 @Mylleranton 该操作与将某物除为零无关。
  • @Flashbond 无法阅读代码,我看到了“除零”标签,所以我只写了我的评论。对不起。
  • 大约十亿次使用调试器。如果不能调试,就不能开发软件。

标签: divide-by-zero


【解决方案1】:

问题中显示的代码没有初始化p[1] 或为其赋值。在设置j=1for 循环中,p[j] 用于对v 的赋值。结果为 v 的未知值。显然,它恰好为零,这导致表达式i%v 中除以零。

由于此代码未记录、结构不良且不可读,因此正确的解决方案是丢弃它并从头开始。

浮点数与问题无关,虽然使用pow(v, 2) 计算v2 是一个糟糕的选择; v*v 会更好。但是,当整数除以零时,某些系统会打印出误导性消息“Floating exception”。尽管有消息,但这是整数运算中的错误。

【讨论】:

  • 那么,你认为完美工作到100000是正常的吗?
  • OP 最简单的调试工作就会检测到这一点。
  • @Flashbond:是的。如果不初始化内存,则无法保证其内容。您的系统提供 100,000 个元素与提供 1,000,000 个元素可能需要做不同的事情,这可能会导致工作完成后留下不同的数据。
  • @Eric Postpischil 初始化内存难吗?
  • @Flashbond:在使用对象之前,您必须为每个对象分配一个值。特别是,当您使用new 创建int 的数组时,您必须先为数组的每个元素分配一个值,然后才能使用该数组的元素。 (您可以使用库例程,例如 memset 来执行此操作,而不是编写自己的代码。)在某些情况下,人们在 new 之后使用 for 循环为每个循环分配一个值(通常为零)数组中的元素。在其他情况下,他们会像做其他工作一样仔细编写代码来分配值。
猜你喜欢
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 2021-02-26
  • 2014-12-06
相关资源
最近更新 更多