2014-01-27 2 views
0

Я хочу отправить строковую переменную через MPI, но я не знаю, как это сделать! мой код здесь:Как отправить std :: string в MPI?

static string fourTupX="Hello"; 

теперь я хочу, чтобы отправить его через MPI:

int l=std::strlen(fourTupX.c_str()); 
l++; 
MPI::COMM_WORLD.Send (&l,1,MPI::INT,1,7); 
MPI::COMM_WORLD.Send (&fourTupX, 1, MPI::CHAR, 1, 1); 

и получить его в другую сторону:

int l; 
source=0; 
MPI::COMM_WORLD.Recv (&l,1,MPI::INT , source, 7, status1); 
cout<<l; 
char* myfourTupX=new char[l]; 
MPI::COMM_WORLD.Recv (myfourTupX,l,MPI_CHAR , source, 1, status1); 

, но после приема не существует любая вещь в fourTupx !!! В чем проблема?

+0

Возможный дубликат [как отправить и получить строку с использованием MPI] (http://stackoverflow.com/questions/20620421/how-to-send-and-recieve-string-using-mpi) – fachexot

ответ

7

Вы должны отправить содержимое буфера строки, полученное от c_str(). Вы не должны посылать длину строки первой, как приемник может просто зонд для сообщения первого, а затем выделить нужный размер буфера:

// Sender 

string bla = "blabla"; 
MPI::COMM_WORLD.Send(bla.c_str(), bla.length(), MPI::CHAR, dest, 1); 

// Receiver 

MPI::Status status; 
MPI::COMM_WORLD.Probe(source, 1, status); 
int l = status.Get_count(MPI::CHAR); 
char *buf = new char[l]; 
MPI::COMM_WORLD.Recv(buf, l, MPI::CHAR, source, 1, status); 
string bla1(buf, l); 
delete [] buf; 

Здесь приемник использует Probe зонд для сообщения согласования и Исследует объект status, чтобы узнать, сколько символов в сообщении. Затем он выделяет буфер того же размера, получает сообщение и создает из него объект std::string.

+0

спасибо, я хочу отправить ссылку-лист с командой отправки в MPICH2, есть ли способ сделать это? –

+0

MPI не может этого сделать из коробки. Вы должны взглянуть на [Boost.MPI] (http://www.boost.org/doc/libs/1_55_0/doc/html/mpi.html) или похожую библиотеку-оболочку, которая может автоматически (деактивировать) сериализацию C++ классов контейнеров. Кроме того, привязки MPI C++ устарели в MPI-2.2 и полностью удалены из новейшего стандарта MPI-3.0. –

+0

std :: basic_string :: c_str() и std :: basic_string :: data() return const char * что вызывает недопустимое преобразование. Это так безопасно? – fachexot

2

Как я понимаю, вы отправляете 1 символ, который составляет 1 байт, с начала объекта string. Вам нужно отправить все это.

При отправке объектов вы должны быть осторожны с указателями внутри объекта, вы можете отправлять адрес указателя, но не сам контент. Это может иметь место с объектом string, если он хранит фактический массив символов в куче.

В этом случае я бы скорее послал c_str(), чем сам объект, и размер будет длиной c_str() плюс 1, чтобы включить нулевой символ в конце. Затем вы можете восстановить объект string из массива символов после его получения.

EDIT Измените строку посыла:

MPI::COMM_WORLD.Send (fourTupX.c_str(), l, MPI::CHAR, 1, 1); //it's l, not 1 

Затем он должен работать.

+0

Это +1 , см. [здесь] (http://coliru.stacked-crooked.com/a/5835f95bd39f5cbb). – rubenvb

+1

Спасибо за проверку :) – adrin

+0

спасибо, но когда я это сделаю, я получу правильный ответ и некоторые ** смешные ** персонажи, я поставил свой отредактированный код выше, я не знаю, в чем проблема? –

Смежные вопросы