有如下一个静态结构体数组,占有内存太大,想改为动态分配内存的,不知咋改?
typedef struct {
int status; //状态
char hzcftab[10]; //繁体汉字部分
char jxmtab[20]; //简拼部分
char hzctab[50]; //简体汉字词
char pytab[80]; //拼音汉字码
char pywbtab[80]; //拼音58码
} KYTAB; //字词典KYTAB Kytab[26][10000]={0}; //字典
void LoadHZCDictionary( LPTSTR lpStr,BOOL dickind)
{
int wPYHead=0;
static int i=0,nPre=0;
UINT j,k;
int sflag=0;
char szPY[80],szHZ[50],szJXM[20],szFHZ[10],szPYWB[80];
char *p; //
p=*Kytab; //指针指向数组首地址 switch(dickind)
{
case 1:
for(j=0,k=0;j<strlen(lpStr);j++)//按间隔号*读入词典文件
{
if(*(lpStr+j)=='*')
{
switch(sflag)
{
case 0: szHZ[k]=_T('\0'); break;
case 1: szPYWB[k]=_T('\0'); break;
case 2: szPY[k]=_T('\0'); break;
}
sflag++;
k=0;
}
else
{
if(sflag==0) szHZ[k++]=*(lpStr+j);
if(sflag==1) szPYWB[k++]=*(lpStr+j);
if(sflag==2) szPY[k++]=*(lpStr+j);
if(sflag==3) szJXM[k++]=*(lpStr+j);
}
}
szJXM[k]=_T('\0');
// _stscanf(lpStr,"%s %s %s %s",szHZ,szPYWB,szPY,szJXM);
break;
case 0: //读入字典
sflag=0;
for(j=0,k=0;j<strlen(lpStr);j++)
{
if(*(lpStr+j)=='*')
{
switch(sflag)
{
case 0: szHZ[k]=_T('\0'); break;
case 1: szPYWB[k]=_T('\0'); break;
case 2: szPY[k]=_T('\0'); break;
case 3: szJXM[k]=_T('\0'); break;
default: break;
}
sflag++;
k=0;
}
else
{
if(sflag==0) szHZ[k++]=*(lpStr+j);
if(sflag==1) szPYWB[k++]=*(lpStr+j);
if(sflag==2) szPY[k++]=*(lpStr+j);
if(sflag==3) szJXM[k++]=*(lpStr+j);
if(sflag==4) szFHZ[k++]=*(lpStr+j);
}
}
szFHZ[k]=_T('\0');
//_stscanf(lpStr,"%s*%s*%s*%s*%s",szHZ,szPYWB,szPY,szJXM,szFHZ);
break;
default:
break;
}
wPYHead=tolower(szPY[0]) - 'a';
if(wPYHead != nPre)
{ Dicnumber[nPre]=i;
i=Dicnumber[wPYHead];
}
//将读入的信息存到字典中
if (_tcslen(szHZ)<=2)
{
strcpy(Kytab[wPYHead][i].pytab,szPY);
strcpy(Kytab[wPYHead][i].hzctab,szHZ);
strcpy(Kytab[wPYHead][i].jxmtab,szJXM);
strcpy(Kytab[wPYHead][i].pywbtab,szPYWB);
}
else
{
if (_tcslen(szHZ)==4)
{
strcpy(Kytab[wPYHead][i].CYpytab,szPY);
strcpy(Kytab[wPYHead][i].CYhzctab,szHZ);
strcpy(Kytab[wPYHead][i].CYjxmtab,szJXM);
strcpy(Kytab[wPYHead][i].CYpywbtab,szPYWB);
}
if (_tcslen(szHZ)==6)
{
strcpy(Kytab[wPYHead][i].CYpytabS,szPY);
strcpy(Kytab[wPYHead][i].CYhzctabS,szHZ);
strcpy(Kytab[wPYHead][i].CYjxmtabS,szJXM);
strcpy(Kytab[wPYHead][i].CYpywbtabS,szPYWB);
}
if (_tcslen(szHZ)==8)
{
strcpy(Kytab[wPYHead][i].CYpytabSS,szPY);
strcpy(Kytab[wPYHead][i].CYhzctabSS,szHZ);
strcpy(Kytab[wPYHead][i].CYjxmtabSS,szJXM);
strcpy(Kytab[wPYHead][i].CYpywbtabSS,szPYWB);
}
if (_tcslen(szHZ)>8)
{
strcpy(Kytab[wPYHead][i].CYpytabWYS,szPY);
strcpy(Kytab[wPYHead][i].CYhzctabWYS,szHZ);
strcpy(Kytab[wPYHead][i].CYjxmtabWYS,szJXM);
strcpy(Kytab[wPYHead][i].CYpywbtabWYS,szPYWB);
}
} if(dickind==0)
strcpy(Kytab[wPYHead][i].hzcftab,szFHZ);
Kytab[wPYHead][i].status=1;
nPre=wPYHead;
i++;
return;
}
typedef struct {
int status; //状态
char hzcftab[10]; //繁体汉字部分
char jxmtab[20]; //简拼部分
char hzctab[50]; //简体汉字词
char pytab[80]; //拼音汉字码
char pywbtab[80]; //拼音58码
} KYTAB; //字词典KYTAB Kytab[26][10000]={0}; //字典
void LoadHZCDictionary( LPTSTR lpStr,BOOL dickind)
{
int wPYHead=0;
static int i=0,nPre=0;
UINT j,k;
int sflag=0;
char szPY[80],szHZ[50],szJXM[20],szFHZ[10],szPYWB[80];
char *p; //
p=*Kytab; //指针指向数组首地址 switch(dickind)
{
case 1:
for(j=0,k=0;j<strlen(lpStr);j++)//按间隔号*读入词典文件
{
if(*(lpStr+j)=='*')
{
switch(sflag)
{
case 0: szHZ[k]=_T('\0'); break;
case 1: szPYWB[k]=_T('\0'); break;
case 2: szPY[k]=_T('\0'); break;
}
sflag++;
k=0;
}
else
{
if(sflag==0) szHZ[k++]=*(lpStr+j);
if(sflag==1) szPYWB[k++]=*(lpStr+j);
if(sflag==2) szPY[k++]=*(lpStr+j);
if(sflag==3) szJXM[k++]=*(lpStr+j);
}
}
szJXM[k]=_T('\0');
// _stscanf(lpStr,"%s %s %s %s",szHZ,szPYWB,szPY,szJXM);
break;
case 0: //读入字典
sflag=0;
for(j=0,k=0;j<strlen(lpStr);j++)
{
if(*(lpStr+j)=='*')
{
switch(sflag)
{
case 0: szHZ[k]=_T('\0'); break;
case 1: szPYWB[k]=_T('\0'); break;
case 2: szPY[k]=_T('\0'); break;
case 3: szJXM[k]=_T('\0'); break;
default: break;
}
sflag++;
k=0;
}
else
{
if(sflag==0) szHZ[k++]=*(lpStr+j);
if(sflag==1) szPYWB[k++]=*(lpStr+j);
if(sflag==2) szPY[k++]=*(lpStr+j);
if(sflag==3) szJXM[k++]=*(lpStr+j);
if(sflag==4) szFHZ[k++]=*(lpStr+j);
}
}
szFHZ[k]=_T('\0');
//_stscanf(lpStr,"%s*%s*%s*%s*%s",szHZ,szPYWB,szPY,szJXM,szFHZ);
break;
default:
break;
}
wPYHead=tolower(szPY[0]) - 'a';
if(wPYHead != nPre)
{ Dicnumber[nPre]=i;
i=Dicnumber[wPYHead];
}
//将读入的信息存到字典中
if (_tcslen(szHZ)<=2)
{
strcpy(Kytab[wPYHead][i].pytab,szPY);
strcpy(Kytab[wPYHead][i].hzctab,szHZ);
strcpy(Kytab[wPYHead][i].jxmtab,szJXM);
strcpy(Kytab[wPYHead][i].pywbtab,szPYWB);
}
else
{
if (_tcslen(szHZ)==4)
{
strcpy(Kytab[wPYHead][i].CYpytab,szPY);
strcpy(Kytab[wPYHead][i].CYhzctab,szHZ);
strcpy(Kytab[wPYHead][i].CYjxmtab,szJXM);
strcpy(Kytab[wPYHead][i].CYpywbtab,szPYWB);
}
if (_tcslen(szHZ)==6)
{
strcpy(Kytab[wPYHead][i].CYpytabS,szPY);
strcpy(Kytab[wPYHead][i].CYhzctabS,szHZ);
strcpy(Kytab[wPYHead][i].CYjxmtabS,szJXM);
strcpy(Kytab[wPYHead][i].CYpywbtabS,szPYWB);
}
if (_tcslen(szHZ)==8)
{
strcpy(Kytab[wPYHead][i].CYpytabSS,szPY);
strcpy(Kytab[wPYHead][i].CYhzctabSS,szHZ);
strcpy(Kytab[wPYHead][i].CYjxmtabSS,szJXM);
strcpy(Kytab[wPYHead][i].CYpywbtabSS,szPYWB);
}
if (_tcslen(szHZ)>8)
{
strcpy(Kytab[wPYHead][i].CYpytabWYS,szPY);
strcpy(Kytab[wPYHead][i].CYhzctabWYS,szHZ);
strcpy(Kytab[wPYHead][i].CYjxmtabWYS,szJXM);
strcpy(Kytab[wPYHead][i].CYpywbtabWYS,szPYWB);
}
} if(dickind==0)
strcpy(Kytab[wPYHead][i].hzcftab,szFHZ);
Kytab[wPYHead][i].status=1;
nPre=wPYHead;
i++;
return;
}
解决方案 »
- ALT控件利用VARIANT传递结构
- 基于socket的C++远程连接?
- 我经过签名的.CAB包,安装时为什么还会提示"未知发行商"?
- 怎样给一个listctrl的一个列加浮选框?
- 关于CTreeCtrl的最简单的问题
- 请问怎么得到一个非程序文件相关联程序文件的路径,比如一个文本文件,怎么得到记事本的路径?
- LVITEM *pListView= (LVITEM*)pNMHDR; 为什么不能实现
- 在线等待,如何在主进程中结束另一个进程,
- MFC属性页 怎样重载OnCancel
- 能谈谈要从C到VC学习需要有什么准备?VC与C的优劣对比?
- 如何在一 worker 线程中使用或者实现 定时器 功能?
- ado的recordset在open时说SQL语句太长了,该怎么办?
typedef struct {
CString StrNumber;
int Duration;
int Degree;
int International;
int GAT;
int Inside;
int City;
int Total;
CString Type;
CString Address;
} pData;//链表所存结构
CTypedPtrArray<CPtrArray, pData*> m_dataList;//链表 da=new pData;
da->StrNumber=strNumber;
da->Duration=0;
da->Degree=0;
da->International=0;
da->GAT=0;
da->Inside=0;
da->City=0;
da->Total=0;
da->Type=strType;
da->Address=strLocation;
m_dataList.Add(da);
int status; //状态
char hzcftab[10]; //繁体汉字部分
char jxmtab[20]; //简拼部分
char hzctab[50]; //简体汉字词
char pytab[80]; //拼音汉字码
char pywbtab[80]; //拼音58码
} *table; //字词典使用的时候,
table= new XXX[100];使用完要
delete []table;
table = NULL;
KYTAB **ppKytab = new KYTAB*[26];
for(int i=0;i<26;i++)
{
ppKytab[i] = new KYTAB[1000];
}
int **p = new int*[num1];
for(int i=0; i<num1; ++i)
p[i] = new int[num2];
这个要释放
for(int m=0;m<num1;m++)
delete[] p[m];
delete[] p;
//new
ppKyTab=(KYTAB**)new BYTE[26*sizeof(KYTAB*)];
if(NULL!==ppKyTab)
{
for(int index=0;index<26;++index)
ppKyTab[index]=new KYTAB[10000];
}//delete
for(int index=0;index<26;++index)
delete[] ppKyTab[index];delete ppKeyTab;