LWHLOVECD 2021-05-11 15:46 采纳率: 0%
浏览 24

MPI中自定义数据结构有指针的怎么处理

要通过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);

    }
}

  • 写回答

2条回答 默认 最新

  • 快乐鹦鹉 2021-05-11 15:59
    关注

    放到共享内存里啊,要不就要将结构内容形成一个二进制串,接收和发送方确定编码规则后交换

    评论

报告相同问题?

悬赏问题

  • ¥15 mmocr的训练错误,结果全为0
  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀