Tóm lại, về mặt lý thuyết không thể gửi một thông điệp có kích thước thay đổi và nhận nó vào bộ đệm có kích thước hoàn hảo. Bạn sẽ phải gửi một tin nhắn đầu tiên với các kích thước của mỗi chuỗi và sau đó một thông điệp thứ hai với các chuỗi, hoặc mã hóa metainfo đó vào tải trọng và sử dụng bộ đệm nhận tĩnh.
Nếu bạn chỉ gửi một tin nhắn, sau đó tôi sẽ bỏ định nghĩa một kiểu dữ liệu cho Pair: thay vào đó, tôi sẽ tạo một datatype cho toàn bộ tải trọng và đổ tất cả dữ liệu vào một gói không liên tục. Sau đó, ở đầu nhận, bạn có thể lặp lại nó, phân bổ số lượng không gian chính xác cần thiết cho mỗi chuỗi và điền vào nó. Hãy để tôi roi lên một sơ đồ ASCII để minh họa. Đây sẽ là trọng tải của bạn:
| ..x1 .. | ..s_len1 .. | .... string1 .... | ..x2 .. | ..s_len2 .. | .string2. |. .x3 .. | ..s_len3 .. | ....... string3 ....... | ...
Bạn gửi toàn bộ nội dung dưới dạng một đơn vị (ví dụ: mảng MPI_BYTE), sau đó người nhận sẽ giải nén nó một cái gì đó như thế này:
while (buffer is not empty)
{
read x;
read s_len;
allocate s_len characters;
move s_len characters from buffer to allocated space;
}
Lưu ý tuy nhiên rằng giải pháp này chỉ hoạt động nếu biểu diễn dữ liệu số nguyên và ký tự là như nhau trên các hệ thống gửi và nhận.
Sử dụng 'char s [0];' cho mảng có độ dài biến, không phải 'char s [1];'. – kennytm
@KennyTM, s [0] đưa ra "cảnh báo C4200: phần mở rộng không chuẩn được sử dụng: mảng có kích cỡ bằng không trong cấu trúc/liên kết". – Constantin
Ah MSVC. C99 được hỗ trợ tốt bởi gcc, nhưng không được hỗ trợ bởi MSVC. – kennytm