是什么导致我的代码不确定?

时间:2010-11-19 04:29:56

标签: c compiler-construction compiler-errors

我可能在这里疯了,但我一直在重新编译完全相同的代码,并获得不同的答案。我根本没有使用任何随机值。我严格遵守浮点数和一维数组(我想最终将它移植到CUDA)。

在编译器方面是否有可能以相同的方式重做我的相同代码使其根本不起作用?

我只需点击它就可以运行.exe并且运行正常,但是当我点击“编译并运行”(Dev C ++ 4.9.9.2)时,我的图像都没有出现。 ......虽然有时他们这样做。

...有关我如何解决这个问题的任何见解?如果我能提供更多帮助,请告诉我。

非常赞赏。

修改 这是代码块,如果我将它注释掉,一切都运行正常。 (如果我评论这个区块,那就完全确定了) - 这是一个电磁模拟器,如果这有帮助的话:

        //***********************************************************************
    //     Update HZ in PML regions (hzx,hzy)
    //***********************************************************************

    boundaryIndex = 0;
    for (regionIndex = 1; regionIndex < NUMBEROFREGIONS; regionIndex++) {
        xStart = regionData[regionIndex].xStart;
        xStop  = regionData[regionIndex].xStop ;
        yStart = regionData[regionIndex].yStart;
        yStop  = regionData[regionIndex].yStop ;
        for (i = xStart; i < xStop; i++) {
            for (j = yStart; j < yStop; j++) {
                hzx = hz[i*xSize+j] - hzy[boundaryIndex];   // extract hzx
                hzx = dahz[i*xSize+j] * hzx + dbhz[i*xSize+j] * ( ey[i*(xSize+1)+j] - ey[(i+1)*(xSize+1)+j] );    // dahz,dbhz holds dahzx,dbhzx
                hzy[boundaryIndex] = dahzy[boundaryIndex] * hzy[boundaryIndex] + dbhzy[boundaryIndex] * ( ex[i*ySize+j+1] - ex[i*ySize+j] );
                hz[i*xSize+j] = hzx +  hzy[boundaryIndex];  // update hz
                boundaryIndex++;
            }  //jForLoop /
        }  //iForLoop /
    }  //

其中,NUMBEROFREGIONS是常量(8),Xsize是在编译时定义的(这里是128)。

5 个答案:

答案 0 :(得分:4)

一些代码示例会有所帮助!但这是未初始化变量的典型症状。

您没有设置一些重要的变量(索引为0,切换为True等),因此您的程序会在每次运行时选择内存中的任何值。 由于这些是有效的随机值,每次都会得到不同的结果。

答案 1 :(得分:3)

模拟的二维数组是否存在索引错误? ey应该是xSize还是xSize + 1宽?

   dahz[i*xSize+j] * hzx +
   dbhz[i*xSize+j] * ( ey[i*(xSize+1)+j] - 
   ey[(i+1)*(xSize+1)+j] ); 

您的索引将2D数组ey视为xSize + 1宽。数组ex的代码将其视为ySize wide。

 dbhzy[boundaryIndex] * ( ex[i*ySize+j+1] - ex[i*ySize+j] );

答案 2 :(得分:2)

您可能正在调用未定义的行为。 C语言标准有许多未定义的内容。其中一些情况可以由编译器捕获,您可能会被发出诊断信息,其他情况下编译器很难捕获。以下是一些具有未定义行为的事情:

  1. 尝试使用未初始化变量的值:

    int i;
    printf("%d\n", i); // could be anything!
    
  2. 在序列点之间对对象进行多次修改:

    int i = 4;
    i = (i += ++i); // Woah, Nelly!
    
  3. 读取或写入分配的内存块的末尾:

    int *ints = malloc(100 * sizeof (int));
    ints[200] = 0; // Oops...
    
  4. 使用printf等。但是提供了错误的格式说明符:

    int i = 4;
    printf("%llu\n", i);
    
  5. 将值转换为有符号整数类型,但该类型不能表示该值(有人说这是实现定义的,C语言规范似乎不明确):

    signed short i;
    i = 100.0 * 100.0 * 100.0 * 100.0; // probably won't fit
    
  6. 编辑:

    在OP提供代码之前回答。

答案 3 :(得分:1)

您是在调试模式还是发布模式下编译它?其中每一个都有不同的方式来初始化堆和内存。

答案 4 :(得分:1)

正如大家所说,如果没有一些错误的代码,我们无法帮助你。

我最好的解释是你刚才解释的是你在非分配内存上创建指针。

类似这样的事情

APointer *aFunction(){
   YourData yd = something;//local variable creation
   return yd;
}

main(){

APointer *p = aFunction();

}

这里p是指向aFunction中本地变量的东西的指针,并在它离开函数后立即被销毁,这有时会被PURE LUCK指向尚未写入的正确数据结束了,但是这个内存空间最终会被改变,你的指针将会读取不同的随机内容。