int*

Тема в разделе "WASM.ZEN", создана пользователем cresta, 28 мар 2005.

  1. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Заблудился в указателях :dntknw: Или в значениях..


    Код (Text):
    1. //-- это за пределами процедуры (там, наверху файла^)---
    2. int  cFmt1=0,cFmt2=0,cFmt3=1,cFmt4=2,cFmt5=2;
    3. int  cWidth1=120,cWidth2=250,cWidth3=100,cWidth4=80,cWidth5=150;
    4.  
    5. //--это в процедуре--
    6. lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
    7. int* Width = &cWidth1;
    8. int* Fmt = &cFmt1;
    9. //--------------------------------------------------
    10. for(lvc.iSubItem=0; lvc.iSubItem<=4; lvc.iSubItem++){
    11.     lvc.cx = *((int*)Width);    //поочередно 120,250,100,80,150
    12.     lvc.fmt = *((int*)Fmt);    //поочередно 0,0,0,0,0
    13.     wsprintf(buffer,"%lu",*((int*)Fmt));
    14.     MessageBox(hWnd,buffer,0,0);
    15.     LoadString(hInstance,lvc.iSubItem+1100,buffer,32);
    16.     lvc.pszText = (LPSTR)buffer;
    17.     ListView_InsertColumn(hWndListView, lvc.iSubItem, &lvc);
    18.     Width++;
    19.     Fmt++;
    20.     }




    Почему из cWidth1-cWidth5 считываются значения нормально(120,250,100,80,150), а из cFmt1-cFmt5 всё время нули? Переменные расположены рядом, одного типа, обращаюсь к ним одинаково. Какая разница???

    Пробовал менять местами строки, в которых инициализируются переменные cFmt1...cFmt5 и cWidth1...cWidth5 - тот же эффект.



    Ширина колонок выставляется правильно, а форматирование - всегда LVCFMT_LEFT :dntknw:
     
  2. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Зайди в код в отладчике (VC или какой компиллер у тебя ?...), нажми просмотр в виде асм-кода. Заодно посмотри память по этим указателям.
     
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    В Olly такое увидел:



    lvc.cx = *((int*)Width);

    lvc.fmt = *((int*)Fmt);



    Превратилось в такое:


    Код (Text):
    1. MOV ECX,DWORD PTR DS:[ESI+40D04C]
    2. MOV EDX,DWORD PTR DS:[ESI+48D2A0]
    3. MOV DWORD PTR SS:[ESP+18],ECX
    4. MOV DWORD PTR SS:[ESP+14],EDX




    почему так далеко друг от друга cWidth1 и cFmt1? В разных местах: 40D04C и 48D2A0 :dntknw:

    Пошагово выполняю, из 40D04C читается как положено, ширина ячеек, а память в районе 48D2A0 вся сплошь нулями забита. Объявления cWidth1 и cFmt1 следуют друг за другом. Почему в разных секциях оказались?



    Пока сделал так:


    Код (Text):
    1. int cFmt[]={0,0,1,2,2};
    2. и в цикле
    3. lvc.fmt = cFmt[lvc.iSubItem];




    Почему рядом стоящие переменные оказались в разных секциях?
     
  4. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    А никто не гарантирует, что



    int cFmt1=0,cFmt2=0,cFmt3=1,cFmt4=2,cFmt5=2;



    будут располагаться строго друг за другом, они могут быть и в регистрах быть, и даже в одном и том же месте памяти.

    нужно использовать массив:



    int fmt[5] = {0, 0, 1, 2, 2};

    int * p_fmt = fmt; // &fmt[0]
     
  5. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    S_T_A_S_



    Да как-то привык, что masm по порядку кладет, вот и нарвался :) Оказывается тут вам не секции... Да, переделал на массивы int'ов - все стало на место, спасибо всем.
     
  6. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    если хочешь, что бы переменная пошла в секцию (данных) определяё её как static (иначе будет в стэке)

    но это лучше не делать без особой нужды, т.к. такой код места больше занимает (это справедливо и для masm)
     
  7. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    В данном случае за счет предварительной инициализации пытаюсь сократить код (вместо 5 ListView_InsertColumn сделать цикл из 5 повторений)

    В таком случае

    static var1=0; - это эквивалент .data

    static var1; - это эквивалент .data?

    Так получается?
     
  8. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Да, хотя переменные инициализированные нулями могут поюти и в секцию неинициализированных данных (data?) т.к. при загрузке exe эта секция обнуляется системным загрузчиком.
     
  9. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Пусть идут куда хотят, лишь бы не менялись значения :)
     
  10. rgo

    rgo New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    87
    попробуй объявлять cWidth* так:

    struct {

    int cWidth1;

    int cWidth2;

    int cWidth3;

    int cWidth3;

    };



    если не пойдет, можно ещё так:

    union {

    int dummy_array[4];

    struct {

    /* структ из первого варианта */

    };

    };
     
  11. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    rgo

    Это всё вариации на тему массивов. Самое наглядное и простое - массив int-ов (см.ответ 2 или 3).
     
  12. rgo

    rgo New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    87
    cresta

    да.