Здравствуйте! Программу пишу в Visual C++ Есть массив тип String заполненный русскими словами. Мне нужно его переслать другому процессу. MPI_Send на сколько я знаю MPI поддерживает тип данных CHAR создал второй массив тип CHAR* и заполнил его с массива String Не получается передать весь массив целиком! Помогите мне решить эту задачу! =)
Не удается передать строку сформированную из стринг массива, если знаете как передать стринговский массив полностью буду рад если скажете как! но пока только такой вариант и то не пашет:
#include <conio.h> #include <stdio.h> #include <iostream> #include <string> #include <math.h> #include <mpi.h> using namespace std; const int nn = 60; //Функция заполнения массива словами void content_mas(string array[],int count) // типа процедура { //Массив забиваем русскими символами //---------------------------------------> char rus[32]; //160 - 175 ; 224 - 190 int j = 160; for (int i = 1; i <= 31; i++) { rus = (char)j; j++; if (j == 175) j = 224; } //---------------------------------------> //Забиваем массив русскими словами указанной длины //---------------------------------------> string s; for (int i = 0; i <= count-1; i++) { //Кол. слов for (int j = 1; j <=5; j++) { //Длина слов s = s + rus[(rand()%8)+1]; } array = s; //Запись слов s = ""; } return; } void longstr(string a[],string *b,int count){ for (int i = 0; i <= count-1; i++){ *b = *b + a+'?'; } } int main(int argc, char *argv[]) { int c; char* m; string b; string a[10000]; MPI_Init(&argc, &argv); int rank, size , d = 0; MPI_Status s; MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); if (rank == 0){ content_mas(a,10); //Забивает массив словами string longstr(a,&b,10); char* message = new char[b.length()]; strcpy(message, b.c_str()); m = message; cout <<m<<endl; c = strlen(m)+1; MPI_Send(&c,1,MPI_INT,1,100,MPI_COMM_WORLD); MPI_Send(&m,c,MPI_CHAR,1,1,MPI_COMM_WORLD); } if (rank == 1){ MPI_Recv(&c,1,MPI_INT,0,100,MPI_COMM_WORLD,&s); cout <<c<<endl; MPI_Recv(&m,c,MPI_CHAR,0,1,MPI_COMM_WORLD,&s); cout <<m<<endl; } MPI_Finalize(); return 0; }
А вот такой вариант вроде как то и работает! Урезал верхушку, она все та же. int main(int argc, char *argv[]) { int c; char* m; string b; string a[10000]; MPI_Init(&argc, &argv); int rank, size , d = 0; MPI_Status s; MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); if (rank == 0){ content_mas(a,10); //Забивает массив словами string longstr(a,&b,10); char* message = new char[b.length()]; strcpy(message, b.c_str()); m = message; cout <<m<<endl; m = "1234567890123456789012345678901234567890";//<<------------- Перед отправкой просто присвоил строку И почти нормально принимает c = strlen(m); MPI_Send(&c,1,MPI_INT,1,100,MPI_COMM_WORLD); MPI_Send(&m,c,MPI_CHAR,1,1,MPI_COMM_WORLD); } if (rank == 1){ MPI_Recv(&c,1,MPI_INT,0,100,MPI_COMM_WORLD,&s); MPI_Recv(&m,c,MPI_CHAR,0,1,MPI_COMM_WORLD,&s); cout <<c<<endl; cout <<m<<endl; } MPI_Finalize(); return 0; }
2 Qaz1312 не мешай C и C++ смотреть страшно! Пишу от балды сам проверяй Code: int main(int argc, char *argv[]) { int rank,size; char buf[]="Hell world"; char recv_buf[1024]; MPI_Status s; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); if(rank==0) { // главная ветвь MPI_Send(buf,sizeof(buf),MPI_CHAR,1,111,MPI_COMM_WORLD); // шлем первой ветви } else { MPI_Recv(recv_buf,sizeof(recv_buf),MPI_CHAR,0,111,MPI_COMM_WORLD,&s); printf("%s",recv_buf); } } MPI_Finalize(); return 0; А если почитать про MPI то рекомендуется данные паковать: MPI_Pack_size MPI_Pack и MPI_Send с типом MPI_BYTE при приеме MPI_Probe MPI_Get_count MPI_Recv MPI_Unpack и вообще сам читай документацию, примеров куча Вопрос ты что программу для кластера пишешь? или решил на зараженные компы ставить MPI ? З.Ы: учи язык - КОД УЖАСЕН!!!!
Да так и я могу переслать, а вот конкретно как в моем коде подскажи, так то я и сам спокойно передаю все. А у меня уже ГОТОВЫЙ массив слов стринговских. Этот массив надо как то передать процессу вот. Мне не до красивостей надо быстро сделать. ЧТо именно не нравится в коде?
а тебе cout не нравится )) в общем что треболось то мне узнать 1) есть массив тип стринг 2) отправить этот массив другому процессу. все.
Что мне не нравится? string b // С++ strcpy, strlen // С ЭТО РАЗНЫЕ ЯЗЫКИ, нельзя работать с объектом класса как с указателем на строку. Выбери один язык! Массив строк на С Code: char mas[1024]; char str[]="stroka"; int i=0; while(i<sizeof(mas)) { if((i+sizeof(str))>sizeof(mas)) break; memcpy(&mas[i],str,sizeof(str)); i+=sizeof(str); } В результате область памяти mas забьется данными вида stroka\0stroka\0stroka\0... и размер буфера будет равен = i Потом после приема разбор этого массива нужно будет произвести тобишь разделить по 0 байту - аналог по функциональности в php функция explode лично я бы заюзал указатели на указатели типа char ** Code: char *start,*next; int len; start=next=mes; printf("%s\n",start); len=i; // размер принятых данных while(len>0) { while(*next++!=0) len--; printf("%s\n",next); } УЧИ ЯЗЫК
Code: #include "mpi.h" #include <stdio.h> int main(int argc, char *argv[]) { int rank, size, i; int buffer[10]; MPI_Status status; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank(MPI_COMM_WORLD, &rank); if (size < 2) { printf("Please run with twoprocesses.\n"); fflush(stdout); MPI_Finalize(); return 0; } if (rank == 0) { //Заполняешь массив MPI_Send(buffer, 10, MPI_CHAR, 1, 123,MPI_COMM_WORLD); } if (rank == 1) { //принимаешь MPI_Recv(buffer, 10, MPI_CHAR, 0, 123, MPI_COMM_WORLD, &status); for (i=0; i<10; i++) { if (buffer[i] != i) printf("Error: buffer[%d] = %d but is expected to be %d\n", i, buffer[i], i); } fflush(stdout); } MPI_Finalize(); return 0; } Что -то типо такого, это вообще основа MPI, что дальше делать будешь не знаю, если элементарный пример не в состоянии написать... а так когда MPI занимался, сайт http://mpi.deino.net/ очень помог