die Saiten Unter der Annahme, dass Sie speichern in der lines
Array kann eine veränderliche Größe haben, können Sie zuerst ein int-Array von Größen der einzelnen Strings übertragen und dann jede Saite einzeln übertragen,
/* Create an Array with length of each line
Broadcast it from process 0 */
int lin_siz[linesCount];
if (p_rank == 0)
for (i=0; i < linesCount; i++)
lin_siz[i] = strlen(lines[i])+1;
MPI_Bcast(&lin_siz, linesCount, MPI_INT, 0, MPI_COMM_WORLD);
/* Broadcast each line */
for (i=0; i < linesCount; i++)
MPI_Bcast(&lines[i], lin_siz[i], MPI_CHAR, 0, MPI_COMM_WORLD);
MPI_Bcast
kann nur übertragen Elemente, die zusammenhängend im Speicher sind - in diesem Fall das int-Array mit Größen, lin_siz
und jede Zeile in lines
gespeichert. Dies ist möglicherweise keine sehr elegante Lösung und besser ist sicherlich möglich, aber es funktioniert.
Es wurde mit der folgenden Array getestet
char **lines;
lines = malloc(linesCount * sizeof(char*));
if (p_rank == 0){
for (i=0; i<linesCount-2; i++)
lines[i] = "This is a test.";
lines[i++] = "More testing.";
lines[i++] = "Even more..";
}
mit p_rank
MPI_Comm_rank(MPI_COMM_WORLD, &p_rank)
mit einem Standardprozessor rank erhalten werden. Und erfolgreich am Ende als
/* Print */
printf("Process rank %d:\n", p_rank);
for (i=0; i < linesCount; i++)
printf("%s\n", lines[i]);
Ich kann den gesamten Testfall buchen, wenn Sie Probleme bei der Umsetzung meiner Antwort haben.
Strings können ein bisschen speziell sein, aber sie sind nur eine Reihe von Zeigern. Schauen Sie sich [diese Frage] an (https://stackoverflow.com/questions/9507987/mpi-sending-array-of-array). Es gibt auch dieses [(nicht richtig beantwortete) Duplikat] (https://stackoverflow.com/questions/19744458/sending-string-array-mpi-c) – Zulan