Заблудился в указателях Или в значениях.. Код (Text): //-- это за пределами процедуры (там, наверху файла^)--- int cFmt1=0,cFmt2=0,cFmt3=1,cFmt4=2,cFmt5=2; int cWidth1=120,cWidth2=250,cWidth3=100,cWidth4=80,cWidth5=150; //--это в процедуре-- lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; int* Width = &cWidth1; int* Fmt = &cFmt1; //-------------------------------------------------- for(lvc.iSubItem=0; lvc.iSubItem<=4; lvc.iSubItem++){ lvc.cx = *((int*)Width); //поочередно 120,250,100,80,150 lvc.fmt = *((int*)Fmt); //поочередно 0,0,0,0,0 wsprintf(buffer,"%lu",*((int*)Fmt)); MessageBox(hWnd,buffer,0,0); LoadString(hInstance,lvc.iSubItem+1100,buffer,32); lvc.pszText = (LPSTR)buffer; ListView_InsertColumn(hWndListView, lvc.iSubItem, &lvc); Width++; Fmt++; } Почему из cWidth1-cWidth5 считываются значения нормально(120,250,100,80,150), а из cFmt1-cFmt5 всё время нули? Переменные расположены рядом, одного типа, обращаюсь к ним одинаково. Какая разница??? Пробовал менять местами строки, в которых инициализируются переменные cFmt1...cFmt5 и cWidth1...cWidth5 - тот же эффект. Ширина колонок выставляется правильно, а форматирование - всегда LVCFMT_LEFT
Зайди в код в отладчике (VC или какой компиллер у тебя ?...), нажми просмотр в виде асм-кода. Заодно посмотри память по этим указателям.
В Olly такое увидел: lvc.cx = *((int*)Width); lvc.fmt = *((int*)Fmt); Превратилось в такое: Код (Text): MOV ECX,DWORD PTR DS:[ESI+40D04C] MOV EDX,DWORD PTR DS:[ESI+48D2A0] MOV DWORD PTR SS:[ESP+18],ECX MOV DWORD PTR SS:[ESP+14],EDX почему так далеко друг от друга cWidth1 и cFmt1? В разных местах: 40D04C и 48D2A0 Пошагово выполняю, из 40D04C читается как положено, ширина ячеек, а память в районе 48D2A0 вся сплошь нулями забита. Объявления cWidth1 и cFmt1 следуют друг за другом. Почему в разных секциях оказались? Пока сделал так: Код (Text): int cFmt[]={0,0,1,2,2}; и в цикле lvc.fmt = cFmt[lvc.iSubItem]; Почему рядом стоящие переменные оказались в разных секциях?
А никто не гарантирует, что 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]
S_T_A_S_ Да как-то привык, что masm по порядку кладет, вот и нарвался Оказывается тут вам не секции... Да, переделал на массивы int'ов - все стало на место, спасибо всем.
если хочешь, что бы переменная пошла в секцию (данных) определяё её как static (иначе будет в стэке) но это лучше не делать без особой нужды, т.к. такой код места больше занимает (это справедливо и для masm)
В данном случае за счет предварительной инициализации пытаюсь сократить код (вместо 5 ListView_InsertColumn сделать цикл из 5 повторений) В таком случае static var1=0; - это эквивалент .data static var1; - это эквивалент .data? Так получается?
Да, хотя переменные инициализированные нулями могут поюти и в секцию неинициализированных данных (data?) т.к. при загрузке exe эта секция обнуляется системным загрузчиком.
попробуй объявлять cWidth* так: struct { int cWidth1; int cWidth2; int cWidth3; int cWidth3; }; если не пойдет, можно ещё так: union { int dummy_array[4]; struct { /* структ из первого варианта */ }; };