Работа с симовольным массивом как целочисленным

Тема в разделе "WASM.A&O", создана пользователем EvilsInterrupt, 9 июл 2005.

  1. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Здрастьте!



    Вопрос такой:

    Есть два массива

    unsigned char a[32];

    unsigned char b[128];



    Мне надо на с++ сделать так, чтобы с начал копировалость с лева на право частями,

    каждая не char а int и так 3 раза, а 4й раз с права налево 1 раз.



    На асме это так:
    Код (Text):
    1. a BYTE  32d dup(?)
    2. b BYTE  128d    dup(?)
    3.  
    4.     mov esi,offset a
    5.     mov edi,offset b
    6.     mov ecx,3d
    7. @@:
    8.     push    ecx
    9.     mov ecx,8d
    10.     rep movsd
    11.     pop ecx
    12.     loop    @B
    13.     sub esi,4d
    14.     mov ecx,8d
    15. @@:
    16.     mov eax,dword ptr[esi]
    17.     mov dword ptr[edi],eax
    18.     sub esi,4d
    19.     add edi,4d
    20.     loop    @B


    Делал так:
    Код (Text):
    1. unsigned char a[32];
    2. unsigned char b[128];
    3. int k=0
    4. for(int i=0;i<=3;i++)
    5. {
    6.     for(int j=0;j<=7;j- -)
    7.     {
    8.         static_cast<int>b[k] = static_cast<int>b[j];
    9.         k++;
    10.     }
    11. }
    12. for(i=0;j>=0;j++)
    13. {
    14.     static_cast<int>b[k] = static_cast<int>b[j];
    15.     k++;
    16. }


    Но меня не поняли! :))) Не удивительно, но почему, но как же на С++ написать такую вещь?
     
  2. letopisec

    letopisec New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    228
    unsigned char b[128]; - это 128 байт в него не влезет 32*4 интов.



    А потому - никак.
     
  3. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    int`ами как кидать из символьного в символьный?
     
  4. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Код (Text):
    1. union
    2. {
    3.     unsigned int    d_word[8];
    4.     unsigned char   b_yte[32];
    5. } a;
    6.  
    7. union
    8. {
    9.     unsigned int    d_word[32];
    10.     unsigned char   b_yte[128];
    11. } b;
    12.  
    13. for(int k = 0;k <= 2;k++)
    14. {
    15.     for(int i = 0;i <= 7; i++)
    16.     {
    17.         b.d_word[j] = a.d_word[i];
    18.         j++;
    19.     }
    20. }
    21. for(int i = 7;i >= 0; i--)
    22. {
    23.     b.d_word[j] = a.d_word[i];
    24.     j++;
    25. }


    Решение нашел, но мне не нравится то, что union, это же из Си, а не с++.

    Наверняка есть методы чисто для с++
     
  5. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348




    А если так?



    *(unsigned int*)(b + index) = *(unsigned int*)(a + index);
     
  6. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    опа, пошел переваривать..
     
  7. K_O_T

    K_O_T New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2003
    Сообщения:
    25
    Если я правильно понял задание, то могу предложить такой вариант
    Код (Text):
    1.  
    2. unsigned char   a[32],
    3.             b[128];
    4.  
    5. for(long i=0; i<3*8; i++)
    6.     ((unsigned long *)b)[i] = ((long *)a)[i%8];
    7.    
    8. for(long i=3*8; i<4*8; i++)
    9.     ((unsigned long *)b)[i] = ((long *)a)[7 - i%8];
    10.  
     
  8. _staier

    _staier New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2003
    Сообщения:
    738
    Адрес:
    Ukraine
    EvilsInterrupt

    думаю использование union даёт наиболее

    элегантный код

    типа так - комбиируя ваше решение с решением K_O_T
    Код (Text):
    1.  
    2.  
    3. union
    4. {
    5. char achar[32];
    6. int  aint[32 /(sizeof(char)*4)];
    7. }a;
    8. union
    9. {
    10. char bchar[128];
    11. int  bint[128 /(sizeof(char)*4)];
    12. }b;
    13.  
    14. for (int i= 0 ;i<3*8;i++)
    15.    b.aint[i]=a.aint[i% 8];
    16. for (int i= 3*8 ;i<4*8; i++)
    17.    b.aint[i]=a.aint[7-i%8];
    18.  
    19.  
    20.  
     
  9. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    дамс... пошел думать