En resumen, teóricamente es imposible enviar un mensaje de tamaño variable y recibirlo en un búfer del tamaño perfecto. Tendrá que enviar un primer mensaje con los tamaños de cada cadena y luego un segundo mensaje con las cadenas en sí, o codificar esa metainfo en la carga útil y usar un búfer de recepción estático.
Si debe enviar solo un mensaje, me abstendré de definir un tipo de datos para Pair: en su lugar, crearía un tipo de datos para toda la carga y volcaría todos los datos en un paquete contiguo sin tipo. Luego, en el extremo de recepción puede iterar sobre él, asignando la cantidad exacta de espacio necesaria para cada cadena y rellenándola. Déjame batir un diagrama ASCII para ilustrar. Esta sería su carga:
| ..x1 .. | ..s_len1 .. | .... cadena1 .... | ..x2 .. | ..s_len2 .. | .string2. |. .x3 .. | ..s_len3 ... | ....... string3 ....... | ...
Envía todo en una unidad (por ejemplo, una matriz de MPI_BYTE), entonces el receptor sería descomprimirlo algo como esto:
while (buffer is not empty)
{
read x;
read s_len;
allocate s_len characters;
move s_len characters from buffer to allocated space;
}
Nota sin embargo, que esta solución sólo funciona si la representación de datos de números enteros y caracteres es el mismo en los sistemas de envío y recepción.
Utilice 'char s [0];' para la matriz de longitud variable, no 'char s [1];'. – kennytm
@KennyTM, s [0] da "advertencia C4200: extensión no estándar utilizada: matriz de tamaño cero en struct/union". – Constantin
Ah MSVC. C99 es soportado apropiadamente por gcc, pero no por MSVC. – kennytm