发信人: riffle()
整理人: yangcs(2000-01-25 11:47:10), 站内信件
|
emsclas.h
/* author : *** */ // ***
/*--------------------------------------------------------------*/
#ifndef INTEREMSMEMARRAY
#define INTEREMSMEMARRAY
class EMSMEMARRAY
{
private:
unsigned int uiMaxData;
unsigned int uiDataSize;
unsigned int uiEMSHandle;
protected:
char *GetEmsAddr( void );
public:
EMSMEMARRAY( unsigned int uiDataNum, unsigned int uiDataLen );
~EMSMEMARRAY( void );
char &operator[]( unsigned int uiIndex );
EMSMEMARRAY &operator=( EMSMEMARRAY &sEmsmemArray );
};
/*--------------------------------------------------------------*/
#endif
emsclas.cpp
/* author : *** */ // ****
/*--------------------------------------------------------------*/
#include <STDIO.H>
#include <STDLIB.H>
#include <MEM.H>
#include "EMSCLAS.H"
#include "EMSMEM.H"
/*--------------------------------------------------------------*/
static void InsufficientEMS( void );
/*--------------------------------------------------------------*/
/****************************************************************/
static void InsufficientEMS( void )
{
printf( "\nEMS memory allocation error!\n" );
}
/****************************************************************/
/****************************************************************/
/*-- 取EMS内存地址 程序开始 ----------------------------------*/
char *EMSMEMARRAY::GetEmsAddr( void )
{
char *sTempStr;
// 计算总页数
unsigned int uiLogicPages = ( ( uiMaxData * uiDataSize ) >> 14 ) & 3 ;
// 映射各逻辑页
for( int i = uiLogicPages; i > 0; i-- )
GetLogicPageAddress( i, uiEMSHandle );
// 取逻辑页0的物理地址
sTempStr = GetLogicPageAddress( 0, uiEMSHandle );
if ( sTempStr == NULL )
{
// 失败,则无法纠正该错误,应强行退出程序
InsufficientEMS();
exit( 2 );
}
return sTempStr;
}
/*-- 取EMS内存地址 程序结束 ----------------------------------*/
/****************************************************************/
/****************************************************************/
/*-- 构造函数,给定数据块数及数据块大小,分配EMS内存 程序开始 */
EMSMEMARRAY::EMSMEMARRAY( unsigned int uiDataNum, unsigned int uiDataL en )
{
unsigned int uiBufLength;
unsigned long ulMaxLen = uiDataNum;
unsigned long ulMaxSize = uiDataLen;
char *caTempBuf;
uiMaxData = uiDataNum;
uiDataSize = uiDataLen;
uiEMSHandle = 0;
// 计算总的内存需求
ulMaxLen = ulMaxLen * ulMaxSize;
uiBufLength = ulMaxLen;
// 合法检查
if ( ( ulMaxLen < 65000L ) && ( ulMaxLen > 0 ) )
{
AllocateEMS( uiBufLength, uiEMSHandle );
printf( "allocated ems handle = %d, %d %d\n", uiEMSHandle,
uiMaxData,
uiDataSize );
caTempBuf = GetEmsAddr();
// 若分配成功,将每个数据块的第一字节赋初值'C'。
if ( caTempBuf != NULL )
for( int i = 0; i < uiMaxData; i++ )
{
caTempBuf[ i * uiMaxData ] = 'C';
if ( uiDataSize > 1 )
caTempBuf[ i * uiMaxData + 1 ] = '\0';
}
}
}
/*-- 构造函数,给定数据块数及数据块大小,分配EMS内存 程序结束 */
/****************************************************************/
/****************************************************************/
EMSMEMARRAY::~EMSMEMARRAY( void )
{
// 释放EMS句柄
FreeEMS( uiEMSHandle );
printf( "free ems handle = %d\n", uiEMSHandle );
}
/****************************************************************/
/****************************************************************/
char &EMSMEMARRAY::operator[]( unsigned int uiIndex )
{
char *caTempBuf = GetEmsAddr();
return caTempBuf[ uiIndex * uiDataSize ];
}
/****************************************************************/
/****************************************************************/
/*-- 重载'='的函数 程序开始 ----------------------------------*/
EMSMEMARRAY &EMSMEMARRAY::operator=( EMSMEMARRAY &sEmsmemArray )
{
unsigned int uiBufLength;
unsigned long ulMaxLen = sEmsmemArray.uiMaxData;
unsigned long ulMaxSize = sEmsmemArray.uiDataSize;
char *sTempStr;
char *sThisStr;
//释放本身原来申请的EMS句柄
FreeEMS( uiEMSHandle );
printf( "free ems handle = %d\n", uiEMSHandle );
uiMaxData = sEmsmemArray.uiMaxData;
uiDataSize = sEmsmemArray.uiDataSize;
uiEMSHandle = 0;
// 计算总的内存需求
ulMaxLen = ulMaxLen * ulMaxSize;
uiBufLength = ulMaxLen;
// 合法检查
if ( ( ulMaxLen < 65000L ) && ( ulMaxLen > 0 ) )
{
AllocateEMS( uiBufLength, uiEMSHandle );
printf( "allocated ems handle = %d\n", uiEMSHandle );
}
// 在堆中申请数据块大小的内存
sTempStr = new char[ uiDataSize + 1 ];
if ( sTempStr != NULL )
{
for( int i = 0; i < uiMaxData; i++ )
{
// 拷贝源EMS内存数据到 sTempStr
memcpy( sTempStr, &sEmsmemArray[ i ], uiDataSize );
// 重新映射本身的地址
sThisStr = GetEmsAddr();
// 拷贝源数据
memcpy( &sThisStr[ i * uiDataSize ], sTempStr, uiDataSize );
}
// 释放堆中的内存
delete sTempStr;
}
return *this;
}
/*-- 重载'='的函数 程序结束 ----------------------------------*/
/****************************************************************/
/****************************************************************/
/****************************************************************/
-- ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.96.185.27]
|
|