c++ - 在 MPI 中使用 char[] 发送结构

标签 c++ c struct char mpi

我正在尝试在 C++ 的 MPI 程序中将一些数据从工作程序发送到主程序(排名为 0)。目标是传递 2 个字符串和一个整数。为此,我创建了一个结构。

结构体

它被称为单词,定义如下:

struct word
{
    char word_name[str_size];
    char url[str_size];
    int counter;
};

/* Some important variables to the question */

MPI_Datatype mpi_word_type;
const int str_size = 200;

之前我曾通过 char * 尝试过此操作,但它不起作用,因为进程不共享相同的内存空间。

现在,如果我将变量从 char[] 更改为简单的 char 并尝试使用示例,我就可以发送结构。如上所述,我无法摆脱段错误错误。

发送部分 - worker

我首先创建并填充一个示例结构,然后首先发送该结构的大小,然后发送该结构本身。像这样:

word word_col;
std::string tmp = "somename";
strcpy(word_col.word_name, tmp.c_str());

std::string tmp2 = "someurl";
strcpy(word_col.url, tmp2.c_str());

word_col.counter = 10;

int size = sizeof(word_col);
MPI::COMM_WORLD.Send(&size, 1, MPI::INT, 0, 1);
MPI::COMM_WORLD.Send(&word_col, size, mpi_word_type, 0, 1);

接收部分-主控

const int nitems = 3;
int blocklengths[3] = { str_size, str_size, 1 };
MPI_Datatype types[3] = { MPI::CHAR, MPI::CHAR, MPI::INT };
MPI_Aint offsets[3];

offsets[0] = (MPI_Aint) offsetof(struct word, word_name);
offsets[1] = (MPI_Aint) offsetof(struct word, url);
offsets[2] = (MPI_Aint) offsetof(struct word, counter);

MPI_Type_create_struct(nitems, blocklengths, offsets, types, &mpi_word_type);
MPI_Type_commit(&mpi_word_type);

...

for(...)
{
    word word_col;
    int size;

    MPI::COMM_WORLD.Recv(&size, 1, MPI::INT, MPI::ANY_TAG, 1, status);
    MPI::COMM_WORLD.Recv(&word_col, size, mpi_word_type, MPI::ANY_TAG, 1, status);
}

我已经为此苦苦挣扎了几个小时,并且看到了很多示例和其他与此相关的问题,但我无法弄清楚这里的问题是什么。

最佳答案

这是错误的编程。您有未分配和未初始化的指针,并且您正在尝试将数据推送到该指针。 您有两个选择: 您可以将结构定义为:

const int str_size = 200;
struct word
{
    char word_name[str_size]; // fixed sized char array
    char url[str_size]; // fixed sized char array
    int counter;
};

或者,

const int str_size = 200;
struct word
{
    char *word_name; /
    char *url;
    int counter;
    Word() {
      word_name = new char[str_size];
      url = new char[str_size];
    }
    ~Word() {
      delete [] word_name;
      delete [] url;
    }
};

这个想法是你需要为这些变量分配内存 另外,在接收时,您使用了:

MPI::COMM_WORLD.Recv(&word_col, size, mpi_word_type, MPI::ANY_TAG, 1, status);

不应该像下面这样吗?

MPI::COMM_WORLD.Recv(&word_col, sizeof(word_col), mpi_word_type, MPI::ANY_TAG, 1, status);

关于c++ - 在 MPI 中使用 char[] 发送结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26545482/

相关文章:

c - Makefile:将多个c文件制作成多个二进制文件

c - 为什么#error 指令在这里没有给出预期的结果?

c - C/C++中通过指针访问多维静态数组

c# - 结构 - 现实生活中的例子?

c++ - 没有命名类型

c++ - 错误消息 : "setw is not defined" using g++

c++ - 在着色器中同时在同一纹理单元中使用不同的纹理类型

c++ - C++新手尝试从文件中读取同一主题的两件事

c - scanf() 在 malloc 结构成员中不起作用

c++ - 确定用作参数的结构数组的大小