将结构中的数据存储在C

时间:2017-01-16 10:11:27

标签: c struct

我想在我的项目中使用MPI。为了将我的数据发送到另一个处理器,我首先必须将粒子数据存储在列表中。

Five lists of different size

这些列表可以有不同的大小。所以基本上我想保存这个结构的数据:

typedef struct {
        double    x[DIM];
        double    v[DIM];
        double    a[DIM];
        double    m;
} Particle;

进入此列表'plist'。另外,我想在plistSize

中保存列表的大小
typedef struct{
    double **plist;
    int plistSize;
} ParticleList;

我仍然是C的新手,所以这个任务对我来说有点困难。

到目前为止,我做了以下事情:

#include <stdlib.h>
#include <stdio.h>

#define DIM 2

typedef struct{
    double **plist;
    int plistSize;
} ParticleList;

typedef struct {
        double                x[DIM];
        double                v[DIM];
        double                a[DIM];
        double                 m;
} Particle;

void sendPar(int *n, int npr, Particle *p){

    // Allocate memory for ParticleList
    ParticleList *pl = malloc(sizeof(pl)*npr);

    // Allocate memory for plistSize -> Does not work
    //for(int k=0; k<npr; k++){
    //    pl->plistSize[k] = malloc(sizeof(int*));
    //}

    // Allocate memory for every list
    for(int k=0; k<npr; k++){
        pl->plist[k] = malloc(sizeof(double*) * n[k]);
    }

    // Write data into list.
    for(int k=0; k<npr; k++){
        for(int l=0; l<n[k]; l++){
            int i = 0;
            for(int d=0; d<DIM; d++){
                pl->plist[k][i] = p[k].x[d];
                i++;
            }
            for(int d=0; d<DIM; d++){
                pl->plist[k][i] = p[k].v[d];
                i++;
            }
            for(int d=0; d<DIM; d++){
                pl->plist[k][i] = p[k].a[d];
                i++;
            }
            pl->plist[k][i] = p[k].m;
        }
   // pl->plistSize[k] = n[k];
    }

    // Free memory
    free(pl);
}

int main(){
    // Number of processors
    int npr = 3;

    // Number of particles
    int np = 3;

    // Allocate memory for particles
    Particle *p = malloc(sizeof(p)*np);
    for(int k=0; k<np; k++){
        for(int d=0; d<DIM; d++){
            p[k].x[d] = 1000*k+100*d;
            p[k].v[d] = 10000*k+1000*d;
            p[k].a[d] = 10*k+d;
        }
        p[k].m = 100000+k;
    }

    // Size of lists, in this case every list has same length
    int n[npr];
    n[0] = 10;
    n[1] = 10;
    n[2] = 10;

    sendPar(n, npr, p);

    // Free memory
    free(p);
}

我遇到了seg错误。可能我在这里做错了什么:

// Allocate memory for ParticleList
ParticleList *pl = malloc(sizeof(pl)*npr);

// Allocate memory for every list
for(int k=0; k<npr; k++){
    pl->plist[k] = malloc(sizeof(double*) * n[k]);
}

此外,我无法为plistSize分配内存。我收到错误warning: assignment makes integer from pointer without a cast。有人明白为什么吗?

0 个答案:

没有答案