여기에 여러 페이지를 읽었으며 이전과 비슷한 질문이 게시되어 사용 가능한 솔루션을 찾을 수없는 것 같습니다.MPI_Send/Recv C++ std :: string 분할 오류
이 코드는 처음부터 끔찍한 코드를 제공하지만 우리는 그것을 사용해야합니다 :/나는 모든 것을 해결할 것을 요구하지 않습니다. 단지 MPI_Send와 Recv만으로는 부족합니다.
마스터 :
string parent; //Is initialised to a random sequence of characters before I try the send
int parentSize = parent.size()+1;
for (int i = 1; i < processes; i++)//Send current parent to slaves
{
MPI_Send(&parentSize, sizeof(int), MPI_INT, i, MSIZE, MPI_COMM_WORLD); //This works fine
MPI_Send(&parent, parent.size(), MPI_BYTE, i, MSEND, MPI_COMM_WORLD);
}
노예 :
int parentSize;
MPI_Recv(&parentSize, sizeof(int), MPI_INT, 0, MSIZE, MPI_COMM_WORLD, &status); //Works fine
MPI_Recv(&parent, parentSize, MPI_BYTE, 0, MSEND, MPI_COMM_WORLD, &status); //Gives a segfault when I try to cout parent
내가 메모리의 잘못된 양을 할당하는 건가요? 크기() 문자열 (28) 및 null 종결 자 +1에 대한 문자 수를 반환합니다 믿습니다?
저는 MPI에 익숙하지 않지만'std :: string :: size()'가 string + null terminator의 길이를 반환하지 않는다고 말할 수 있습니다. 단지 문자 수를 반환합니다. 'std :: string'은 널 터미네이터의 개념을 추상화하기로되어 있습니다 (전혀 사용하지 않는다면 확실하지 않습니다). http://www.cplusplus.com/reference/string/string/ –
characters는 길이이고 NULL 종결자를 설명하기 위해 수동으로 1을 더합니다. 내가 읽은 문서는 그들이 동의어라고 말했습니다. – T3CHN0CR4T
오 derp, 그건 완전히 내 머리 xD 갔다. 난 기술적으로 *'std :: string'과 c-strings (''char *'/ NULL terminator)가 동의어가 아니기 때문에 주어진 답은 더 좋은 아이디어라고 생각한다. IIRC,'std :: string'은 C- 문자열로 표현 될 수 있지만, 다른 메타 데이터를 저장할뿐만 아니라 과도하게 할당 할 수도 있습니다. –