En bref, il est théoriquement impossible d'envoyer un message de taille variable et la recevoir dans un tampon de la taille parfaite. Vous devrez soit envoyer un premier message avec les tailles de chaque chaîne et ensuite un deuxième message avec les chaînes elles-mêmes, soit encoder ce métainfo dans la charge utile et utiliser un tampon de réception statique. Si vous ne devez envoyer qu'un seul message, je renoncerais à définir un type de données pour Pair: à la place, je créerais un type de données pour l'ensemble de la charge utile et déverserais toutes les données dans un paquet contigu, non typé. Ensuite, à la réception, vous pouvez itérer dessus, en allouant la quantité exacte d'espace nécessaire pour chaque chaîne et en la remplissant. Laissez-moi monter un diagramme ASCII pour illustrer. Ce serait votre charge utile:
| ..x1 .. | .._lang1 .. | .... chaîne1 .... | ..x2 .. | ..sllen2 .. | .string2. |. .x3 .. | ..s_len3 .. | ....... string3 ....... | ...
Vous envoyez le tout en une seule unité (par exemple un tableau de MPI_BYTE), alors le récepteur serait le déballer quelque chose comme ceci:
while (buffer is not empty)
{
read x;
read s_len;
allocate s_len characters;
move s_len characters from buffer to allocated space;
}
Notez cependant que cette solution ne fonctionne que si la représentation des données de nombres entiers et caractères est le même sur les systèmes d'envoi et de réception.
Utilisez 'char s [0];' pour le tableau de longueur variable, pas 'char s [1];'. – kennytm
@KennyTM, s [0] donne "avertissement C4200: extension non standard utilisée: tableau de taille nulle en struct/union". – Constantin
Ah MSVC. C99 est correctement pris en charge par gcc, mais pas par MSVC. – kennytm