MPI Помогите решить проблему! Пересылка String массива

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Qaz1312, 15 Feb 2011.

  1. Qaz1312

    Qaz1312 New Member

    Joined:
    13 Feb 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    Здравствуйте! Программу пишу в Visual C++
    Есть массив тип String заполненный русскими словами. Мне нужно его переслать другому процессу.
    MPI_Send на сколько я знаю MPI поддерживает тип данных CHAR
    создал второй массив тип CHAR* и заполнил его с массива String
    Не получается передать весь массив целиком!
    Помогите мне решить эту задачу!
    =)
     
  2. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    461
    Likes Received:
    38
    Reputations:
    1
    код в студию.
     
  3. Qaz1312

    Qaz1312 New Member

    Joined:
    13 Feb 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    Не удается передать строку сформированную из стринг массива, если знаете как передать стринговский массив полностью буду рад если скажете как! но пока только такой вариант и то не пашет:
     
    #3 Qaz1312, 15 Feb 2011
    Last edited: 15 Feb 2011
  4. Qaz1312

    Qaz1312 New Member

    Joined:
    13 Feb 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    #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;
    }
     
    #4 Qaz1312, 15 Feb 2011
    Last edited: 15 Feb 2011
  5. Qaz1312

    Qaz1312 New Member

    Joined:
    13 Feb 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    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;
    }
     
  6. Qaz1312

    Qaz1312 New Member

    Joined:
    13 Feb 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    Мне кто нибудь поможет?
     
  7. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    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 ? :cool:

    З.Ы: учи язык - КОД УЖАСЕН!!!!
     
    _________________________
    #7 Gar|k, 15 Feb 2011
    Last edited: 15 Feb 2011
  8. Qaz1312

    Qaz1312 New Member

    Joined:
    13 Feb 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    нет просто задали прогу написать на MPI
     
  9. Qaz1312

    Qaz1312 New Member

    Joined:
    13 Feb 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    Да так и я могу переслать, а вот конкретно как в моем коде подскажи, так то я и сам спокойно передаю все. А у меня уже ГОТОВЫЙ массив слов стринговских. Этот массив надо как то передать процессу вот. Мне не до красивостей надо быстро сделать. ЧТо именно не нравится в коде?
     
  10. Qaz1312

    Qaz1312 New Member

    Joined:
    13 Feb 2011
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    а тебе cout не нравится ))
    в общем что треболось то мне узнать

    1) есть массив тип стринг
    2) отправить этот массив другому процессу.

    все.
     
    #10 Qaz1312, 15 Feb 2011
    Last edited: 15 Feb 2011
  11. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Что мне не нравится?
    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);
     }
    
    УЧИ ЯЗЫК :p
     
    _________________________
  12. cheater_man

    cheater_man Member

    Joined:
    13 Nov 2009
    Messages:
    651
    Likes Received:
    44
    Reputations:
    7
    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/ очень помог
     
    #12 cheater_man, 17 Feb 2011
    Last edited: 17 Feb 2011