文件.exe已停止工作[已关闭]

file.exe has stopped working [closed]

提问人:user2470358 提问时间:6/11/2013 最后编辑:Wilbur Vandrsmithuser2470358 更新时间:6/11/2013 访问量:152

问:

我对编程很陌生,具有 C 和 C++ 的基本知识。我一直在尝试在用于图像分析的 .dat 文件上运行代码。

基本上,这个 .dat 文件具有集群的 x 和 y 位置以及它们的半径。使用此代码,我尝试将我的图像(缩放像素后尺寸为 200mm x 300mm)划分为 5mm x 5mm 的网格,并找到半径=1 的点数和半径=100 的点数。

这是我的代码:

#include<stdio.h>
int main()
{ 
    int i=0,g,h,ng[350][250],ns[350][250],ntot[350][250];
    float a[6001],b[6001],c[6001];
    FILE *fres1, *fres2;

    for(g=5;g<=350;g=g+5)
    { 
        for(h=5;h<=250;h=h+5)
        {
            ng[g][h]=0;
            ns[g][h]=0;
            ntot[g][h]=0;   
        } 
    }

    fres1 = fopen("trial_final_1.dat","r+"); 
    fres2 = fopen("result_boxes.dat","w");

    if(fres1 == NULL)
    {
        printf("Error!! Cannot open file \n" );
        return 1;
    } 
    else
    {
        printf("File opened successfully, kindly check your folder for result_boxes file :) \n");
        fprintf(fres2,"x(mm)        y(mm)       no. of glass beads        no. of stain-less steel balls     total no. of balls \n");
        while(!feof(fres1))
        {
            fscanf(fres1,"%f %f %f",&a[i],&b[i],&c[i]);           
            g = ((a[i]/5) + 1)*5;
            h = ((b[i]/5) + 1)*5;
            if(c[i] == 100)
            {
                ng[g][h] = ng[g][h]+1;  
            }
            else
            {
                ns[g][h] = ns[g][h] + 1;
            }
            ntot[g][h] = ntot[g][h] + 1;
            ++i;
        }  
        g = 5;
        h = 5;
        for(g=5;g<=350;g=g+5)
        { 
            for(h=5;h<=250; h=h+5)
            {
                fprintf(fres2,"%d       %d            %d                        %d                            %d\n",g,h,ng[g][h],ns[g][h],ntot[g][h]);  

            }
        }
    }

    fclose(fres1);
    fclose(fres2);
    return 0;    

}

我的输入.dat文件(即“trial_final_1.dat”)包含以下数据:

150.505951 0.797619 100.000000
172.327438 5.976130 100.000000
137.538651 11.089217 100.000000
151.304276 10.139803 100.000000
137.008926 13.175000 100.000000
120.400734 13.943015 1.000000
136.759262 14.199074 100.000000

在运行我的代码时,最初我得到输出“文件已成功打开,请检查您的文件夹是否有result_boxes文件:)”,但在此之后我收到一条消息,说该文件.exe已停止工作。请帮我解决此问题。我也尝试过使用 代替 ,但两种情况下的输出都保持不变。while(fscanf(fres1,"%f %f %f",&a[i],&b[i],&c[i])!=EOF )while(!feof(fres1))

C 数组 feof

评论

0赞 xaxxon 6/11/2013
在调试器中运行它,以便查看它崩溃的位置。这意味着您可能使用了不属于您的内存。就像您的文件比您为 a/b/c 或类似的东西分配的 6001 个元素大。
2赞 xaxxon 6/11/2013
此外,有了这样毫无意义的变量名称,没有人会想要阅读你的代码。删除一些垂直空格,修剪重现错误不需要的部分,提供有意义的变量名称并更新您的问题。
0赞 user2470358 6/11/2013
嘿,下次提问时我会牢记您的建议.....谢谢你的时间:)

答:

1赞 paddy 6/11/2013 #1

您没有对数组进行任何边界检查。快速浏览一下代码就会发现,您已经超出了 的边界,并且使用以下循环:ngnsntot

for(g=5;g<=350;g=g+5)
{ 
    for(h=5;h<=250; h=h+5)
    {
        ...
    }
}

上面的问题是你用的是 而不是 ,或者你的数组维度是一个元素太小了。<=<

在写入文件句柄之前,您也不会检查它是否有效,也不会检查您的调用是否成功。例如:fres2fscanf

fscanf(fres1,"%f %f %f",&a[i],&b[i],&c[i]);           
g = ((a[i]/5) + 1)*5;
h = ((b[i]/5) + 1)*5;

如果上述调用失败,则可能是对 或 使用未初始化的值,然后继续将其用作数组索引,而无需进行任何边界检查。这是灾难的根源,而且它可能总是会发生,因为您的循环会在您尝试读取之前检查 EOF。a[i]b[i]

至少你应该这样做:

if( 3 != fscanf(fres1,"%f %f %f",&a[i],&b[i],&c[i]) ) break;

还有一件事......您认为当达到 6001 值时会发生什么?i

评论

0赞 user2470358 6/11/2013
非常感谢您如此快速的回复.....阵列维度达不到要求.....该程序现在运行良好......谢谢你的时间:)