要通过MPI在多进程中传递一个自己定义的结构p,这个结构比较复杂,包含一些指针,怎么将它定义为MPI中的一个数据结构类型然后广播给其他进程呢?
结构具体信息如下:
typedef struct wm_pattern_struct
{
struct wm_pattern_struct *next;
unsigned char* psPat;
unsigned psLen;
}WM_PATTERN_STRUCT;
#define HASH_TYPE short
#define SHIFTABLESIZE (256*256)
typedef struct wm_struct {
WM_PATTERN_STRUCT *plist;
WM_PATTERN_STRUCT *msPatArray;
unsigned short *msNumArray;
int msNumPatterns;
unsigned msNumHashEntries;
HASH_TYPE *msHash;
unsigned char* msShift;
HASH_TYPE *msPrefix;
int msSmallest;
}WM_STRUCT;
WM_STRUCT *wmNew();
void wmFree(WM_STRUCT *ps);
int wmAddPattern(WM_STRUCT *ps, unsigned char *P, int m);
int wmPrePatterns(WM_STRUCT *ps);
对应的具体函数
WM_STRUCT *wmNew() {
WM_STRUCT *p = (WM_STRUCT*)malloc(sizeof(WM_STRUCT));
if (!p) {
return 0;
}
else {
p->msNumPatterns = 0;
p->msSmallest = 1000;
return p;
}
}
void wmFree(WM_STRUCT *ps) {
if (ps->msPatArray) {
if (ps->msPatArray->psPat)free(ps->msPatArray->psPat);
free(ps->msPatArray);
}
if (ps->msNumArray)free(ps->msNumArray);
if (ps->msHash)free(ps->msHash);
if (ps->msPrefix)free(ps->msPrefix);
if (ps->msShift)free(ps->msShift);
free(ps);
}
int wmAddPattern(WM_STRUCT *ps, unsigned char *q, int m) {
WM_PATTERN_STRUCT *p;
p = (WM_PATTERN_STRUCT*)malloc(sizeof(WM_PATTERN_STRUCT));
if (!p)
return -1;
p->psPat = (unsigned char*)malloc(m + 1);
memset(p->psPat + m, 0, 1);
memcpy(p->psPat, q, m);
p->psLen = m;
ps->msNumPatterns++;
if (p->psLen < (unsigned)ps->msSmallest)
ps->msSmallest = p->psLen;
p->next = ps->plist;
ps->plist = p;
return 0;
}
static unsigned HASH16(unsigned char *T)
{
return (unsigned short)((*T) << 8 | *(T + 1));
}
void sort(WM_STRUCT *ps)//字符串哈希值从小到大排列
{
int m = ps->msSmallest;
int i, j;
unsigned char *temp;
int flag;
for (i = ps->msNumPatterns - 1, flag = 1; i > 0 & flag; i--) {
flag = 0;
for (j = 0; j < i; j++) {
if (HASH16(&(ps->msPatArray[j + 1].psPat[m - 2])) < HASH16(&(ps->msPatArray[j].psPat[m - 2])))
{
flag = 1;
temp = ps->msPatArray[j + 1].psPat;
ps->msPatArray[j + 1].psPat = ps->msPatArray[j].psPat;
ps->msPatArray[j].psPat = temp;
}
}
}
}
static void wmPreHashedPatternGroups(WM_STRUCT *ps)//计算多少个不同的hash值,且从小到大
{
unsigned sindex, hindex, ningroup;
int i;
int m = ps->msSmallest;
ps->msNumHashEntries = HASHTABLESIZE;
ps->msHash = (HASH_TYPE*)malloc(sizeof(HASH_TYPE)*ps->msNumHashEntries);
if (!ps->msHash) {
printf("No memory in wmPreHashedPatternGroups()\n");
return;
}
for (i = 0; i < (int)ps->msNumHashEntries; i++) {
ps->msHash[i] = (HASH_TYPE)-1;
}
for (i = 0; i < ps->msNumPatterns; i++) {
hindex = HASH16(&ps->msPatArray[i].psPat[m - 2]);
sindex = ps->msHash[hindex] = i;
ningroup = 1;
while ((++i < ps->msNumPatterns) && (hindex == HASH16(&ps->msPatArray[i].psPat[m - 2])))
ningroup++;
ps->msNumArray[sindex] = ningroup;
i--;
}
}
static void wmPreShiftTable(WM_STRUCT *ps) {
int i;
unsigned short m, k, cindex;
unsigned shift;
m = (unsigned short)ps->msSmallest;
ps->msShift = (unsigned char*)malloc(SHIFTABLESIZE * sizeof(char));
if (!ps->msShift)
return;
for (i = 0; i < SHIFTABLESIZE; i++) {
ps->msShift[i] = (unsigned)(m - 2 + 1);
}
for (i = 0; i < ps->msNumPatterns; i++) {
for (k = 0; k < m - 1; k++) {
shift = (unsigned short)(m - 2 - k);
cindex = ((ps->msPatArray[i].psPat[k] << 8) | ps->msPatArray[i].psPat[k + 1]);//B为2
if (shift < ps->msShift[cindex])
ps->msShift[cindex] = shift;//k=m-2时,shift=0
}
}
}
//建立Prefix表
static void wmPrepPrefixTable(WM_STRUCT *ps) {
int i;
ps->msPrefix = (HASH_TYPE*)malloc(sizeof(HASH_TYPE)*ps->msNumPatterns);
if (!ps->msPrefix) {
printf("No memory in wmPrepPrefixTable()\n");
return;
}
for (i = 0; i < ps->msNumPatterns; i++) {
ps->msPrefix[i] = HASH16(ps->msPatArray[i].psPat);
}
}