首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一个程序出现异常了.

2012-02-10 
一个程序出现错误了...此为一个作业题,文末分割线处两条free语句如果注释掉,程序不会报错,但是如果加上的

一个程序出现错误了...
此为一个作业题,文末分割线处两条free语句如果注释掉,程序不会报错,但是如果加上的话会出现如下错误:

  Windows 已在 project 5.exe 中触发一个断点。 project5是这个工程的名字

  其原因可能是堆被损坏,这说明 project 5.exe 中或它所加载的任何 DLL 中有 Bug。

  原因也可能是用户在 project 5.exe 具有焦点时按下了 F12。

  输出窗口可能提供了更多诊断信息。

用的是IDE, VS2010.

下面是代码..
#include <stdio.h>
#include <stdlib.h>
struct Activity{
int happy;
int begin;
int end;
int last;
int NO;
};
typedef Activity* Activities;
struct HappyRecord{
int happiest;
int pre;
int num;
int suc;
};
void swap( Activities a1 , Activities a2 )
{
int tmp;
Activity Tmp;
Tmp = *a1;
*a1 = *a2;
*a2 = Tmp;
}
int main()
{
int N , i , j , k , Result=0 , Latest=0 , Tmp=0 , flag=0 , index=0;
HappyRecord* H[2];
Activities ArrAct;
//HappyRecord H[2][5];// <debug>

scanf( "%d" , &N );
while( N > 0 )
{
ArrAct = ( Activities ) malloc ( sizeof( struct Activity ) *N );

for( i=0 ; i<N ; i++ )// <init>
{
scanf( "%d%d%d" , &ArrAct[ i ].happy , &ArrAct[ i ].last , &ArrAct[ i ].end );
ArrAct[ i ].begin = ArrAct[ i ].end - ArrAct[ i ].last;
Latest = ( Latest < ArrAct[ i ].end )? ArrAct[ i ].end : Latest ;
ArrAct[ i ].NO = i+1 ;
}

for( i=0 ; i<N ; i++ )// <按第一个关键字begin排序>
for( j=0 ; j<N-i-1 ; j++ )
if( ArrAct[ j ].begin > ArrAct[ j+1 ].begin )
swap( &ArrAct[ j ] , &ArrAct[ j+1 ] );
for( i=0 ; i<N ; i++ )// <按第二个关键字end排序>
for( j=0 ; j<N-i-1 ; j++ )
if( ArrAct[ j ].begin == ArrAct[ j+1 ].begin && ArrAct[ j ].end > ArrAct[ j+1 ].end )
swap( &ArrAct[ j ] , &ArrAct[ j+1 ] );


H[0] = ( HappyRecord* ) malloc ( sizeof( struct HappyRecord ) * Latest );
H[1] = ( HappyRecord* ) malloc ( sizeof( struct HappyRecord ) * Latest );
for( i=0 ; i<Latest ; i++ )// <init>
{
H[0][i].happiest = 0;
H[1][i].happiest = 0;
}

for( j=0 ; j<N ; j++ )// <updating H>
{
for( k=0 ; k <= ArrAct[ j ].begin ; k++ )
if( ( Tmp = H[ flag ][ k ].happiest + ArrAct[ j ].happy ) > H[ flag ][ k+ArrAct[ j ].last ].happiest )
{
H[1-flag][ k + ArrAct[ j ].last ].happiest = Tmp;
H[1-flag][ k + ArrAct[ j ].last ].pre = k;
H[1-flag][ k + ArrAct[ j ].last ].num = ArrAct[ j ].NO;
}
for( k=0 ; k <= Latest ; k++ )
{
H[ flag ][ k ].happiest = H[ 1- flag ][ k ].happiest;
H[ flag ][ k ].pre = H[1-flag][ k ].pre ;
H[ flag ][ k ].num = H[1-flag][ k ].num ;
}
flag = 1-flag;
}

for( i=0 ; i<=Latest ; i++ )
if( Result < H[0][ i ].happiest )
{
Result = H[0][ i ].happiest ;
index = i;
}
printf( "%d\n" , Result );
for( i = index ; i != 0 ; i = H[0][ i ].pre )
H[0][ H[0][ i ].pre ].suc = i;
for( i = 0 ; i!=index ; i = H[0][ i ].suc )
printf( "%d " , H[0][H[0][ i ].suc].num );
printf( "\n" );
---------------------------------------------------------------------
free( H[0] );
free( H[1] );
---------------------------------------------------------------------
scanf( "%d" , &N );
}
return 0;
}


[解决办法]

for( j=0 ; j<N ; j++ )// <updating H>
{
for( k=0 ; k <= ArrAct[ j ].begin ; k++ )
if( ( Tmp = H[ flag ][ k ].happiest + ArrAct[ j ].happy ) > H[ flag ][ k+ArrAct[ j ].last ].happiest )


{
H[1-flag][ k + ArrAct[ j ].last ].happiest = Tmp;
H[1-flag][ k + ArrAct[ j ].last ].pre = k;
H[1-flag][ k + ArrAct[ j ].last ].num = ArrAct[ j ].NO;
}
for( k=0 ; k <= Latest ; k++ )
{
H[ flag ][ k ].happiest = H[ 1- flag ][ k ].happiest;
H[ flag ][ k ].pre = H[1-flag][ k ].pre ;
H[ flag ][ k ].num = H[1-flag][ k ].num ;
}
flag = 1-flag;
}

其他没细看,就这两个地方就足够了
[解决办法]
for( k=0 ; k <= ArrAct[ j ].begin ; k++ ) //貌似应该不是<= 应该是<
if( ( Tmp = H[ flag ][ k ].happiest + ArrAct[ j ].happy ) > H[ flag ][ k+ArrAct[ j ].last ].happiest )
{
H[1-flag][ k + ArrAct[ j ].last ].happiest = Tmp;
H[1-flag][ k + ArrAct[ j ].last ].pre = k;
H[1-flag][ k + ArrAct[ j ].last ].num = ArrAct[ j ].NO;

热点排行
Bad Request.