c程序,编译和link一切正常,运行时出错!

zyp96 2004-04-03 01:57:00
c程序,编译和link一切正常,运行时出错!
候在最后会跳出一个对话框,提示是某某地址的内存不能写,我用断点设置到最后一句,运行到断点时都不会有错,但是全速运行就会有错这是怎么回事,有人知道该怎么办么?
在调试的时候,要求输入ctr0.c的路径,这个ctr0.c是什么东西,是什么问题呢?
在下面的locals窗口里有这样的一条: mainret CXX0030: Error: expression cannot be evaluated
call stack;它指示到这样的一句:mainCRTStartup() line 206+28 bytes
进入了VC的调试状态,又有跳出一个对话框,说:unhandled exception in comp.exe:0xc0000005:access violation。
点击确定之后,会跳出一个窗口要求输入路径for fclose.c。我找不到这个文件的路径呀,就点了CANCEL;
接下来就到了一个汇编语言的窗口,该怎么调试啊,我发现汇编停留在这样的一句:00402139 mov edx,dword ptr [ecx+0Ch];这也太难了点吧,搞不懂
...全文
45 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyp96 2004-04-04
  • 打赏
  • 举报
回复
正如bideyore所述,唉,怎么会犯这样的错误,搞的我看了两天,看样子对数组的使用还是要特别的小心,谢谢大家。
bideyore 2004-04-03
  • 打赏
  • 举报
回复
呵呵,修改后,我调试通过了!又是这种最不该出的错!楼主和大家都应该引以为戒啊!
bideyore 2004-04-03
  • 打赏
  • 举报
回复
发现一点不对劲:a[8]=a[ic];
a[8]是哪来的?
再看看int a[8]={0,0,0,0,0,0,0,0};这句;
bideyore 2004-04-03
  • 打赏
  • 举报
回复
代码好长啊,看得我头晕也不知道问题在哪,不过我建议楼主不妨去掉某些功能调试,之后再一点点加回去,确定到底是哪部分的毛病。本人很菜,有心无力,只能顶一下了。
zhangfjj 2004-04-03
  • 打赏
  • 举报
回复
数据流呀,
在C中引入了流(stream)的概念,它将数据的输入输出看作是数据的流入流出,这样不管是磁盘文件还是物理设备,都可以看作是一种流的源或目的,视它们是同一种东西,而不管其具体的物理结构。即对它们的操作,就是数据的流入和流出。
scanf()是读取从键盘输入的数据

scanf("%d%d",&a,&b);
输入
21 35<回车>
从键盘输入数据时,并不是输入一个数据就立即赋给了该变量,而是放到输入缓冲区中
而一个流,以回车结束,即当按回车时,表示流结束,此时就可以进行赋值了,那么多数据,是用空格作为数据项的分隔,所以不会出现2-->a,1-->b
而是21-->a,35-->b
你在格式控制串中放入一些'\t','\n'反而会出现一些莫名其妙的错误
zyp96 2004-04-03
  • 打赏
  • 举报
回复
小张的方法我也做了,基本没什么改变,不过他说的在fscanf(fp7,"%d\t%d\t%d\t%d\t%d\t%d\t%d\n",&c[i][0],&c[i][1],&c[i][2],&c[i][3],&c[i][4],&c[i][5],&c[i][6]);之间不应该有\t的控制字符,我觉得这个不对,因为如果那样的话我的大于10的数字岂不要被读成两位数了么?我试过加上\t的这种情况,发现还是可以正确读数的,我用跟踪和调试的方法可以看到读出了正确的数,所以这条我没改。
zhangfjj 2004-04-03
  • 打赏
  • 举报
回复
fscanf(fp7,"%d\t%d\t%d\t%d\t%d\t%d\t%d\n",&c[i][0],&c[i][1],&c[i][2],&c[i][3],&c[i][4],&c[i][5],&c[i][6]);
在读取数据时,fscanf()函数用法与scanf()类似,只是从文件流中读,
所以你在格式控制串中不应该有\t之类的东西
改:
fscanf(fp7,"%d%d%d%d%d%d%d",&c[i][0],&c[i][1],&c[i][2],&c[i][3],&c[i][4],&c[i][5],&c[i][6]);
zhangfjj 2004-04-03
  • 打赏
  • 举报
回复
太长了,我粗粗的看了一下,
有一点
fp7=fopen("f1.txt","rb");//有很多,你自己看,这是以二进制方式打开文件。
你后面读文件时,用的fgets,fprintf之类的函数,我估计是文件打开方式有问题
应该以文本方式打开文件
fp7=fopen("f1.txt","r");
写的时候也应该以文本方式打开
zyp96 2004-04-03
  • 打赏
  • 举报
回复
程序功能就是两个文件中的数进行每行每行的比较,如果相同则取出来放到另外一个文件中去,前面一段是先排序,我是按从小到大的排,这样在后面的比较中,只要发现一行中有一个不相同,就马上舍去不比较了。另外如果比较到有相同的也马上就跳出去做另外一行的比较
lxh1010 2004-04-03
  • 打赏
  • 举报
回复
哇!!!
想帮,却无能为力,
帮你顶一下了!!
zyp96 2004-04-03
  • 打赏
  • 举报
回复
这个程序在运行的时候要调用两个文本文件,文件名分别为:比较文件1.txt,和比较文件2.txt,大家可以把两个文件中的内容写为一致的,还有就是每行只能是7个数;可以用我下面的数据添冲:
3 11 12 4 5 6 2
3 11 12 4 5 17 2
3 11 12 4 5 20 2
3 11 12 4 5 25 2
3 11 12 4 6 17 2
3 11 12 4 6 20 2
3 11 12 4 6 25 2
3 11 12 4 17 20 2
3 11 12 4 17 25 2
3 11 12 4 20 25 2
3 11 12 5 6 17 2
3 11 12 5 6 20 2
3 11 12 5 6 25 2
3 11 12 5 17 20 2
3 11 12 5 17 25 2
3 11 12 5 20 25 2
3 11 12 6 17 20 2
3 11 12 6 17 25 2
3 11 12 6 20 25 2
3 11 12 17 20 25 2
3 11 13 4 5 6 2
3 11 13 4 5 17 2
3 11 13 4 5 20 2
3 11 13 4 5 25 2
3 11 13 4 6 17 2
3 11 13 4 6 20 2
3 11 13 4 6 25 2
3 11 13 4 17 20 2
3 11 13 4 17 25 2
3 11 13 4 20 25 2
3 11 13 5 6 17 2
3 11 13 5 6 20 2
3 11 13 5 6 25 2
3 11 13 5 17 20 2
3 11 13 5 17 25 2
3 11 13 5 20 25 2
3 11 13 6 17 20 2
3 11 13 6 17 25 2
3 11 13 6 20 25 2
3 11 13 17 20 25 2
3 11 15 4 5 6 2
3 11 15 4 5 17 2
3 11 15 4 5 20 2
3 11 15 4 5 25 2
3 11 15 4 6 17 2
3 11 15 4 6 20 2
3 11 15 4 6 25 2
3 11 15 4 17 20 2
3 11 15 4 17 25 2
3 11 15 4 20 25 2
3 11 15 5 6 17 2
3 11 15 5 6 20 2
3 11 15 5 6 25 2
3 11 15 5 17 20 2
3 11 15 5 17 25 2
3 11 15 5 20 25 2
3 11 15 6 17 20 2
3 11 15 6 17 25 2
3 11 15 6 20 25 2
3 11 15 17 20 25 2
3 11 23 4 5 6 2
3 11 23 4 5 17 2
3 11 23 4 5 20 2
3 11 23 4 5 25 2
3 11 23 4 6 17 2
3 11 23 4 6 20 2
3 11 23 4 6 25 2
3 11 23 4 17 20 2
3 11 23 4 17 25 2
3 11 23 4 20 25 2
3 11 23 5 6 17 2
3 11 23 5 6 20 2
3 11 23 5 6 25 2
3 11 23 5 17 20 2
3 11 23 5 17 25 2
3 11 23 5 20 25 2
3 11 23 6 17 20 2
3 11 23 6 17 25 2
3 11 23 6 20 25 2
3 11 23 17 20 25 2
3 11 26 4 5 6 2
3 11 26 4 5 17 2
3 11 26 4 5 20 2
3 11 26 4 5 25 2
3 11 26 4 6 17 2
3 11 26 4 6 20 2
3 11 26 4 6 25 2
3 11 26 4 17 20 2
3 11 26 4 17 25 2
3 11 26 4 20 25 2
3 11 26 5 6 17 2
3 11 26 5 6 20 2
3 11 26 5 6 25 2
3 11 26 5 17 20 2
3 11 26 5 17 25 2
3 11 26 5 20 25 2
3 11 26 6 17 20 2
3 11 26 6 17 25 2
3 11 26 6 20 25 2
3 11 26 17 20 25 2
3 12 13 4 5 6 2
3 12 13 4 5 17 2
3 12 13 4 5 20 2
3 12 13 4 5 25 2
3 12 13 4 6 17 2
3 12 13 4 6 20 2
3 12 13 4 6 25 2
3 12 13 4 17 20 2
3 12 13 4 17 25 2
3 12 13 4 20 25 2
3 12 13 5 6 17 2
3 12 13 5 6 20 2
3 12 13 5 6 25 2
3 12 13 5 17 20 2
3 12 13 5 17 25 2
3 12 13 5 20 25 2
3 12 13 6 17 20 2
3 12 13 6 17 25 2
3 12 13 6 20 25 2
3 12 13 17 20 25 2
3 12 15 4 5 6 2
3 12 15 4 5 17 2
3 12 15 4 5 20 2
3 12 15 4 5 25 2
3 12 15 4 6 17 2
3 12 15 4 6 20 2
3 12 15 4 6 25 2
3 12 15 4 17 20 2
3 12 15 4 17 25 2
3 12 15 4 20 25 2
3 12 15 5 6 17 2
3 12 15 5 6 20 2
zyp96 2004-04-03
  • 打赏
  • 举报
回复
谢谢大家!下面是代码,如vpp(vc++)所述,确实用到了比较大的数组;不过我试过改小10倍,还是不行,还请大家多帮我分析一下,我想得出分析的过程,以后自己碰到了也好自己解决。
#include <stdio.h>
#define SEEK_SET 0
void main(void)
{
int a[8]={0,0,0,0,0,0,0,0};
int b[8]={0,0,0,0,0,0,0,0};
int c[8001][7];
int d[8001][7];

int i,o=0;
int j,p=0;
int k,q=0;
int ic,ici;
FILE *fp1,*fp2,*fp7,*fp8,*fp9;
fp7=fopen("比较文件1.txt","rb");
if (fp7==NULL)
{
puts("比较文件1.txt文件打开有错误");
goto end_e;
}
else
printf("比较文件1.txt打开正确\n");

fp8=fopen("比较文件2.txt","rb");
if (fp8==NULL)
{
puts("比较文件2.txt文件打开有错误");
goto end_e;
}
else
printf("比较文件2.txt打开正确\n");

fp1=fopen("f1.txt","w");
if (fp1==NULL)
{
puts("f1.txt文件打开有错误");
goto end_e;
}
else
printf("f1.txt打开正确\n");

fp2=fopen("f2.txt","w");
if (fp2==NULL)
{
puts("f2.txt文件打开有错误");
goto end_e;
}
else
printf("f2.txt打开正确\n");


for(ici=0;ici<65535;ici++)
{
for(ic=0;ic<7;ic++)
{
if((feof(fp7))!=0) //if is file end,return 1
{
printf("比较文件1.txt文件排序完成\n");
goto f8paixu;
}
else
fscanf(fp7,"%d\t",&a[ic]);
}
printf("%d\t%d\t%d\t%d\t%d\t%d\t%d\n",a[0],a[1],a[2],a[3],a[4],a[5],a[6]);
for(ic=1;ic<7;ic++)
{if (a[0]>a[ic])
{
a[8]=a[ic];
a[ic]=a[0];
a[0]=a[8];
}
}
for(ic=2;ic<7;ic++)
{if (a[1]>a[ic])
{
a[8]=a[ic];
a[ic]=a[1];
a[1]=a[8];
}
}
for(ic=3;ic<7;ic++)
{if (a[2]>a[ic])
{
a[8]=a[ic];
a[ic]=a[2];
a[2]=a[8];
}
}
for(ic=4;ic<7;ic++)
{if (a[3]>a[ic])
{
a[8]=a[ic];
a[ic]=a[3];
a[3]=a[8];
}
}
for(ic=5;ic<7;ic++)
{if (a[4]>a[ic])
{
a[8]=a[ic];
a[ic]=a[4];
a[4]=a[8];
}
}
for(ic=6;ic<7;ic++)
{if (a[5]>a[ic])
{
a[8]=a[ic];
a[ic]=a[5];
a[5]=a[8];
}
}
fprintf(fp1,"%d\t%d\t%d\t%d\t%d\t%d\t%d\n",a[0],a[1],a[2],a[3],a[4],a[5],a[6]);
}

f8paixu: for(ici=0;ici<8000;ici++)
{
for(ic=0;ic<7;ic++)
{
if((feof(fp8))!=0) //if is file end,return 1
{
printf("比较文件2.txt文件排序完成\n");
goto start;
}
else
fscanf(fp8,"%d\t",&a[ic]);
}
printf("%d\t%d\t%d\t%d\t%d\t%d\t%d\n",a[0],a[1],a[2],a[3],a[4],a[5],a[6]);
for(ic=1;ic<7;ic++)
{if (a[0]>a[ic])
{
a[8]=a[ic];
a[ic]=a[0];
a[0]=a[8];
}
}
for(ic=2;ic<7;ic++)
{if (a[1]>a[ic])
{
a[8]=a[ic];
a[ic]=a[1];
a[1]=a[8];
}
}
for(ic=3;ic<7;ic++)
{if (a[2]>a[ic])
{
a[8]=a[ic];
a[ic]=a[2];
a[2]=a[8];
}
}
for(ic=4;ic<7;ic++)
{if (a[3]>a[ic])
{
a[8]=a[ic];
a[ic]=a[3];
a[3]=a[8];
}
}
for(ic=5;ic<7;ic++)
{if (a[4]>a[ic])
{
a[8]=a[ic];
a[ic]=a[4];
a[4]=a[8];
}
}
for(ic=6;ic<7;ic++)
{if (a[5]>a[ic])
{
a[8]=a[ic];
a[ic]=a[5];
a[5]=a[8];
}
}
fprintf(fp2,"%d\t%d\t%d\t%d\t%d\t%d\t%d\n",a[0],a[1],a[2],a[3],a[4],a[5],a[6]);
}
start: fclose(fp7);
fclose(fp8);
fclose(fp1);
fclose(fp2);

fp7=fopen("f1.txt","rb");
if (fp7!=NULL)
printf("f1.txt打开正确\n");
else
{
printf("f1.txt打开不正确,请检查是否有f1.txt文件存在\n");
goto end_e;
}

fp8=fopen("f2.txt","rb");
if (fp8!=NULL)
printf("f2.txt打开正确\n");
else
{
printf("f2.txt打开不正确,请检查是否有f2.txt文件存在\n");
goto end_e;
}

fp9=fopen("相同的数字.txt","w");
if (fp9!=NULL)
printf("相同的数字.txt准备写入成功\n");
else
{
printf("相同的数字.txt写入准备不成功,请检查该磁盘的容量或是否打开写保护\n");
goto end_e;
}
for(i=0;i<8000;i++)
{ if((feof(fp7))!=0)
{
printf("比较文件1读入成功!\n");
c[i][0]=0;c[i][1]=0;c[i][2]=0;c[i][3]=0;c[i][4]=0;c[i][5]=0;c[i][6]=0;c[i][7]=0;
if (o==0)
o=i;
}
else
{
fscanf(fp7,"%d\t%d\t%d\t%d\t%d\t%d\t%d\n",&c[i][0],&c[i][1],&c[i][2],&c[i][3],&c[i][4],&c[i][5],&c[i][6]);
}
}
for(i=0;i<8000;i++)
{ if((feof(fp8))!=0)
{
printf("比较文件2读入成功!\n");
d[i][0]=0;d[i][1]=0;d[i][2]=0;d[i][3]=0;d[i][4]=0;d[i][5]=0;d[i][6]=0;d[i][7]=0;
if (p==0)
p=i;
}
else
{
fscanf(fp8,"%d\t%d\t%d\t%d\t%d\t%d\t%d\n",&d[i][0],&d[i][1],&d[i][2],&d[i][3],&d[i][4],&d[i][5],&d[i][6]);
}
}
fseek(fp7,0,SEEK_SET);
fseek(fp8,0,SEEK_SET);
fseek(fp9,0,SEEK_SET);
for(i=0;i<o;i++)
{
for(j=0;j<p;j++)
{
for(k=0;k<7;k++)
{
if(c[i][k]!=d[j][k])
{
goto next;
}
else
{
if(k==6)
fprintf(fp9,"%d\t%d\t%d\t%d\t%d\t%d\t%d\n",c[i][0],c[i][1],c[i][2],c[i][3],c[i][4],c[i][5],c[i][6]);
goto bijiao;
}
}
next: k=0;
// printf("%d\t%d\t%d\t%d\t%d\t%d\t%d\n",c[i][0],c[i][1],c[i][2],c[i][3],c[i][4],c[i][5],c[i][6]);
}
bijiao: printf("第%d次比较成功\n",i);
}
printf("比较文件1中有%d行数,比较文件2中有%d行数\n",o,p);

end_e: fclose(fp7);
fclose(fp8);
fclose(fp9);
}
zhouqingyuan 2004-04-03
  • 打赏
  • 举报
回复
检查一下你的指针的使用,
大约是指针指到不该指的地方了。
bideyore 2004-04-03
  • 打赏
  • 举报
回复
这样现象的问题多了,帖代码啊。
vpp 2004-04-03
  • 打赏
  • 举报
回复
可能是数组越界等问题,最好能把代码贴一下!否则很难判断是什么问题的

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧