一个调试与直接运行结果不一样的怪异问题

时间:2022-11-24 23:04:36
编了一小段C程序。用三维数组存储多个二维数组,并记录存储进的二维数组的数目。代码本身逻辑性应该没错。但是令人震惊的是调试结果和预期很近,直接运行结果却大相径庭。大致如下:
void main()
{
/*变量定义省去注明
          其中groups变量用于记录符合要求的矩阵数memery为三维数组formatrix为二维数组
         */
while (trips) {
/*生成随机数经过处理写入二维数组
                  .....................
                   */
Isdifferent=judge(&groups,memery,formatrix);//判断是否符合条件
if (Isdifferent) {
 a=groups; 
for(j=0;j<3;j++){
for(k=0;k<4;k++){
memery[groups-1][j][k]=formatrix[j][k]//将符合要求矩阵存入三维数组
}
}   
}
断点一! trips--; 
    
}

/*结果打印*/
printf("have groups: %d\n",groups);
            for(i=0;i<groups;i++){
for(j=0;j<3;j++){
for(k=0;k<4;k++)
{
printf(" %d",memery[i][j][k]);  
}
printf("\n");
}
printf("\n\n");
断点二!}
}
在两断点处调试,会发现结果输出groups个符合要求矩阵。一般来说trips设为100,结果显示groups值为十几,并后跟相应个数二维矩阵。
然而直接运行时,居然输出groups为1,且只跟一个矩阵!
调试很久不知原因,急盼高手指点,小弟在此先谢了!

7 个解决方案

#1


Isdifferent=judge(&groups,memery,formatrix);//判断是否符合条件 
if   (Isdifferent)   { 
  a=groups;   
for(j=0;j <3;j++){ 
for(k=0;k <4;k++){ 
memery[groups-1][j][k]=formatrix[j][k]//将符合要求矩阵存入三维数组 

}     

groups怎么没有增加啊 调试一下看 group的值的变化看看

#2


在judge函数里我把group的地址传入,进行了相应的,符合要求就自加的操作。

#3


随即数生成以及judge判断的问题?

不知道你这些地方是怎么实现的?

看看你的随机数的算法

在断点的时候由于时间差距比较大可能和直接执行产生的随即数有很大的差别导致judge的判断Isdifferent在绝大多数情况下为假而没有产生矩阵

#4


可以把随机生成的数据打印出来看看

#5


  while (trips) {
  srand( (unsigned)time( NULL ) );
for(i=0; i<3; i++){
p[i].x= (rand() % 1000) + 1 ;
p[i].y= (rand() % 600) + 1  ;
}
  ..........
  知道原因了,确实是调试的时候,好像是断点运行时间间隔超出一秒,才产生一组不同的随机数种子,然后不同的种子就产生不同的随机数。而在直接运行时一秒内程序早跑完了,这大概就是为什么调试运行能产生不同矩阵,直接运行产生的矩阵就完全相同的原因了。谢谢楼上几位提醒。
  但是还有一点不明的是,怎么解决这个问题。
  

#6


http://topic.csdn.net/u/20071125/13/863070c3-42cf-4f9c-b81c-f9da4e9bf6d8.html?65599397

#7


帮顶!!

#1


Isdifferent=judge(&groups,memery,formatrix);//判断是否符合条件 
if   (Isdifferent)   { 
  a=groups;   
for(j=0;j <3;j++){ 
for(k=0;k <4;k++){ 
memery[groups-1][j][k]=formatrix[j][k]//将符合要求矩阵存入三维数组 

}     

groups怎么没有增加啊 调试一下看 group的值的变化看看

#2


在judge函数里我把group的地址传入,进行了相应的,符合要求就自加的操作。

#3


随即数生成以及judge判断的问题?

不知道你这些地方是怎么实现的?

看看你的随机数的算法

在断点的时候由于时间差距比较大可能和直接执行产生的随即数有很大的差别导致judge的判断Isdifferent在绝大多数情况下为假而没有产生矩阵

#4


可以把随机生成的数据打印出来看看

#5


  while (trips) {
  srand( (unsigned)time( NULL ) );
for(i=0; i<3; i++){
p[i].x= (rand() % 1000) + 1 ;
p[i].y= (rand() % 600) + 1  ;
}
  ..........
  知道原因了,确实是调试的时候,好像是断点运行时间间隔超出一秒,才产生一组不同的随机数种子,然后不同的种子就产生不同的随机数。而在直接运行时一秒内程序早跑完了,这大概就是为什么调试运行能产生不同矩阵,直接运行产生的矩阵就完全相同的原因了。谢谢楼上几位提醒。
  但是还有一点不明的是,怎么解决这个问题。
  

#6


http://topic.csdn.net/u/20071125/13/863070c3-42cf-4f9c-b81c-f9da4e9bf6d8.html?65599397

#7


帮顶!!