我想在我的项目中使用MPI。为了将我的数据发送到另一个处理器,我首先必须将粒子数据存储在列表中。
这些列表可以有不同的大小。所以基本上我想保存这个结构的数据:
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
。有人明白为什么吗?