2014-10-24 2 views
0

Я пытаюсь отправить некоторые данные от рабочих хозяину (ранжированному 0) в программе MPI в C++. Цель состоит в том, чтобы передать 2 строки и целое число. Для этого я создал структуру.Отправить struct с char [] в MPI

структура

Это называется слово и определяется следующим образом:

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 и попробую на примере. С этим, как это выше, я не могу избавиться от Ошибка сегментации ошибок.

Отправка часть - Рабочие

я начала путем создания и заполнения пример-структуру, а затем отправка размер структуры первого и самого-структуру, во-вторых. Как это:

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); 

принимающую часть - Master

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); 
} 

Я боролся с этим в течение нескольких часов, и я видел много примеров и еще вопросы по этому поводу, но я не мог выяснить, в чем проблема.

ответ

0

Это ошибочное программирование. У вас есть нераспределенный и неинициализированный указатель, и вы пытаетесь подталкивать данные к этому. У вас есть два варианта: Либо вы определяете структуру, как:

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); 
+0

У моей предыдущей структуры в вопросе возникла ошибка. Я пытался кое-что попробовать, и в этом причина. Я исправил его, чтобы иметь '[str_size]'. Но это не так. –

+0

@ gd.silva, поэтому одна часть, которую вы уже исправили, проверьте, если вы передаете правильный размер при приеме, проверьте мои измененные и –

+0

Да, я передаю правильный размер. Переменная 'size' такая же, как' sizeof (word_col) ', потому что я делаю это' sizeof' перед отправкой. –