MPIで次の構造体を送信しようとしています:
union atributo{
int valor1;
char *valor2;
float valor3;
};
struct estructura{
int *tipo;
union atributo *list;
};
それらが動的ポインターであることは知っていますが、それらを使用する必要があります。静的ポインターが機能する同じ構造体がありますが、これではそれらを機能させることができません。
MPI 構造体は次のとおりです。
MPI_Datatype atributo_MPI;
MPI_Datatype type[1] = { MPI_BYTE };
int blocklen[1] = { (tamChar +1) };
MPI_Aint disp[1];
disp[0]= offsetof(union atributo, valor2);
MPI_Type_create_struct(1, blocklen, disp, type, &atributo_MPI);
MPI_Type_commit(&atributo_MPI);
MPI_Datatype estructura_MPI;
MPI_Datatype type2[2] = { MPI_INT, atributo_MPI };
int blocklen2[2] = { tamEstruct, tamEstruct};
MPI_Aint disp2[2];
disp2[0]= offsetof(struct estructura, tipo);
disp2[1]= offsetof(struct estructura, list);
MPI_Type_create_struct(2, blocklen2, disp2, type2, &estructura_MPI);
MPI_Type_commit(&estructura_MPI);
これは、3 種類のユニオンを送信する方法の例です。
union atributo *atributo2;
atributo2=malloc(sizeof(char) * (tamChar+1));
atributo2[0].valor1= 99999999;
MPI_Send(&atributo2[0], 1, atributo_MPI, 1, 123, MPI_COMM_WORLD);
union atributo *atributo3;
atributo3=malloc(sizeof(char) * (tamChar+1));
for(k=0;k<tamChar;k++){
atributo3[0].valor2[k]= 'A' + ( rand() % ( 'Z' - 'A'));
}
atributo3[0].valor2[k] = '\0';
MPI_Send(&atributo3[0], 1, atributo_MPI, 2, 123, MPI_COMM_WORLD);
union atributo *atributo4;
atributo4=malloc(sizeof(char) * (tamChar+1));
float valor1,valor2;
srand(rdtsc());
valor1=(((float)rand())+1.0)*500000.0;
valor2=(((float)rand())+1.0)*25.0;
atributo4[0].valor3=valor2/valor1;
MPI_Send(&atributo4[0], 1, atributo_MPI, 3, 123, MPI_COMM_WORLD);
ここで受信:
union atributo *atributo3;
atributo3=malloc(sizeof(char) * (tamChar+1));
MPI_Recv(&atributo3[0],1,atributo_MPI,0,MPI_ANY_TAG,MPI_COMM_WORLD,&status);
printf("Valor atributo CHAR %s\n",atributo3[0].valor2); // HERE IT CRASH
UNION を送信しようとすると、float と int では問題なく動作しますが、char の配列では動作しません。
value2 を印刷しようとすると、次のエラーが表示されます。
*** Process received signal ***
Signal: Segmentation fault (11)
Signal code: Address not mapped (1)
Failing at address: 0x7fa02e917678
もちろん、構造体はまだ機能しません。どんな答えでも感謝します。ありがとうございました。