📄 ho.c
字号:
/**
*
* 文 件 名:ho.c
*
* 描 述:
*
* 创 建 者:
*
* 创建日期:
*
* 备 注:
*
*
* * 维护历史 *
*
* <日期> <修改者>
* <修改内容...>
*
**/
#include <stdlib.h>
#include <memory.h>
#include "ho.h"
/*====================+ Definition +=====================*/
/*
*
* 名称:DOID
* 描述:记录已销毁对象的OID。
* 备注:DOID,Destroyed Object's ID。
*/
typedef struct TAG_DOID
{
MLDSN msn;
OBJID oid;
}DOID;
/*
*
* 名称:TARRDOID
* 描述:DOID数组结构体。
*/
typedef struct TAG_ARRDOID
{
SI32 neo; /* 存在的对象个数,即没有销毁的对象个数。eo - existent object */
DOID* pad; /* 指向元素类型为DOID的数组,这个数组动态分配。ad - the array of DOID */
SI32 lad; /* pad所指数组的空间长度,以元素为单位。lad - the length of array of DOID */
SI32 nwe; /* pad所指数组中已填写过的元素个数。nwe - the number of written element */
OBJID oid; /* 传给CRT函数的OID。*/
}TARRDOID;
/*
*
* 名称:STP_GLAD
* 描述:宏,DOID数组空间增长步长,以数组元素为单位。
* 备注:STP - step,LAD - the length of array of DOID,GLAD - the growth of LAD。
*/
#define STP_GLAD 10
/*====================+ Variable(s) +====================*/
static TARRDOID gs_tad = {0, NULL, 0, 0, OID_};
/*=================+ __CreateObject__ +==================*/
/**
*
* 名称:__CreateObject__
* 描述:创建对象。
* 参数:Msn --- [IN] 模序号,指定创建哪个模的对象;
* IQCty --- [IN] 输入队列缓冲;
* OQCty --- [IN] 输出队列缓冲;
* NumCR --- [IN] 来访者数量;
* ppObj --- [OUT] 输出创建的对象;
* pExotic --- [IN] 在外面为IC分配的空间,适用于创建静态对象(如函数内的局部对象)。
* 返回:成功返回P结果,失败返回N结果。
* 备注:1. NumCR必须大于0;
* 2. ppObj和pExotic不能都为NULL或非NULL;
* 3. 如果pExotic不是NULL,表示IC空间已在外面分配好了。
*/
FRESULT __CreateObject__(MLDSN Msn, BYTKTY IQCty, BYTKTY OQCty, SI32 NumCR, OBJECT** ppObj, BYTE* pExotic)
{
/* extern FRESULT CRT_xxx(OBJID* pOID, BYTKTY IQCty, BYTKTY OQCty, SI32 NumCR, OBJECT** ppObj, BYTE* pExotic); */
extern FRESULT CRT_car(OBJID* pOID, BYTKTY IQCty, BYTKTY OQCty, SI32 NumCR, OBJECT** ppObj, BYTE* pExotic);
extern FRESULT CRT_ship(OBJID* pOID, BYTKTY IQCty, BYTKTY OQCty, SI32 NumCR, OBJECT** ppObj, BYTE* pExotic);
extern FRESULT CRT_amphicar(OBJID* pOID, BYTKTY IQCty, BYTKTY OQCty, SI32 NumCR, OBJECT** ppObj, BYTE* pExotic);
FRESULT fr;
OBJID oidbak;
EM_OIOIC* pem;
SI32 idd; /* DOID的指标。idd - the index of DOID */
if((NumCR < 1) || (NULL == ppObj && NULL == pExotic) || (ppObj != NULL && pExotic != NULL))
return FR_N_INVALIDARG;
oidbak = gs_tad.oid;
for(idd = 0; idd < gs_tad.nwe; idd++)
{
if((Msn == (gs_tad.pad+idd)->msn) && ((gs_tad.pad+idd)->oid != 0))
{
gs_tad.oid = (gs_tad.pad+idd)->oid;
break;
}
}
switch(Msn)
{
/*case MSN_XXX:
* fr = CRT_xxx(&gs_tad.oid, IQCty, OQCty, NumCR, ppObj, pExotic);
* break;*/
case MSN_CAR:
fr = CRT_car(&gs_tad.oid, IQCty, OQCty, NumCR, ppObj, pExotic);
break;
case MSN_SHIP:
fr = CRT_ship(&gs_tad.oid, IQCty, OQCty, NumCR, ppObj, pExotic);
break;
case MSN_AMPHICAR:
fr = CRT_amphicar(&gs_tad.oid, IQCty, OQCty, NumCR, ppObj, pExotic);
break;
default:
fr = FR_N;
break;
}
if(!NFR(fr))
{
if(idd < gs_tad.nwe)
{
gs_tad.oid = oidbak;
(gs_tad.pad+idd)->oid = 0;
}else if((MSKSO & gs_tad.oid) < (MSKSO & oidbak))
{
gs_tad.oid = oidbak;
pem = (EM_OIOIC*)GetEMofBN(*ppObj, MSN_OIOIC);
if(pem->IQ.Dtrm != NULL)
free(pem->IQ.Dtrm);
if(pem->OQ.Dtrm != NULL)
free(pem->OQ.Dtrm);
if(NULL == pExotic)
{
free(*ppObj);
*ppObj = NULL;
}
return FR_N_LACKOID;
}
gs_tad.neo++;
}else
{
gs_tad.oid = oidbak;
}
return fr;
}
/*=================+ __DestroyObject__ +=================*/
/*
*
* 名称:__DestroyObject__
* 描述:销毁对象。
* 参数:pObj --- [IN] 指向对象。
* 返回:TRUE - 成功,FALSE - 失败。
* 备注:静态对象(如函数内的局部对象)也须用此函数销毁。
*/
BOOL __DestroyObject__(OBJECT* pObj)
{
DOID* ptr;
SI32 idd; /* DOID的指标。idd - the index of DOID */
EM_OIOIC* pem;
if(NULL == pObj)
return FALSE;
pem = (EM_OIOIC*)GetEMofBN(pObj, MSN_OIOIC);
if(NULL == gs_tad.pad)
{
if(gs_tad.neo-1 > 0)
{
gs_tad.pad = (DOID*)calloc(STP_GLAD, sizeof(DOID));
if(NULL == gs_tad.pad)
return FALSE;
gs_tad.pad->msn = pObj->MSN;
gs_tad.pad->oid = pObj->OID;
gs_tad.lad = STP_GLAD;
gs_tad.nwe = 1;
}else if(0 == gs_tad.neo-1)
{
gs_tad.oid = OID_;
}else
{
return FALSE;
}
}else
{
for(idd = 0; idd < gs_tad.nwe; idd++)
{
if((pObj->MSN == (gs_tad.pad+idd)->msn) && (0 == (gs_tad.pad+idd)->oid))
{
(gs_tad.pad+idd)->oid = pObj->OID;
break;
}
}
if(idd == gs_tad.nwe)
{
if(idd == gs_tad.lad)
{
ptr = (DOID*)calloc(gs_tad.lad + STP_GLAD, sizeof(DOID));
if(NULL == ptr)
return FALSE;
memcpy(ptr, gs_tad.pad, gs_tad.nwe*sizeof(DOID));
free(gs_tad.pad);
gs_tad.pad = ptr;
gs_tad.lad += STP_GLAD;
}
(gs_tad.pad+gs_tad.nwe)->msn = pObj->MSN;
(gs_tad.pad+gs_tad.nwe)->oid = pObj->OID;
gs_tad.nwe++;
}
}
if(pem->IQ.Dtrm != NULL)
free(pem->IQ.Dtrm);
if(pem->OQ.Dtrm != NULL)
free(pem->OQ.Dtrm);
gs_tad.neo--;
if(gs_tad.pad != NULL && 0 == gs_tad.neo)
{
free(gs_tad.pad);
gs_tad.pad = NULL;
gs_tad.lad = 0;
gs_tad.nwe = 0;
gs_tad.oid = OID_;
}
return TRUE;
}
/*=============+ Global object pointer(s) +==============*/
OBJECT* g_pCar = NULL;
OBJECT* g_pShip = NULL;
OBJECT* g_pAmphicar = NULL;
/* ... */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -