Проблема с массивом.

Тема в разделе "WASM.BEGINNERS", создана пользователем sheef_ad, 22 дек 2009.

  1. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    Есть примерно такой код:
    Код (Text):
    1. ...
    2. hDv dd 8 dup (0)    ;масив для хендлов в дереве
    3. ...
    4.                                              mov esi,0
    5.                 mov ebx,0
    6. nach:
    7.                 mov ebx, hDv[esi]
    8.                 .if ebx==0
    9.                     ...;здесь добавляем item в дерево...
    10.                     mov  hDv[esi], eax  ;...и заносим хендл в масив 
    11.                     ...
    12.                     jmp go
    13.                 .else
    14.                     inc esi
    15.                     jmp nach
    16.  
    17.                 .endif
    18. go:
    В двух словах: По клику добавляется item в дерево и хендл созданого айтима заносим в масив (в hDv[esi]). Если добавляем еще, то смотрим занято ли место в hDv[0], если да, то листаем до hDv[1] (в листинге inc esi) и заносим сюда.
    Проблема в том, что индексы массива почемуто считаются не +1 а +3!!! То есть первый хендл записывается в hDv[0], второй в hDv[3], третий в hDv[6] и т.д. Толи hDv[1] уже чемто занят, толи я незнаю каких то тонкостей...В чем дело не подскажите?
    Отвечу на все уточняющие вопросы.
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Не сказать, что уловил, что происходит, но отмечу, что т.к. размер handle == четыре байта, то надо умножать значение индекса на четыре: 'mov hDv[esi * 4], eax' и читать таким же образом.
     
  3. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    Та вроде нет. Массив создан как DWORD (hDv dd 8 dup (0)) то есть на каждый индекс массива припадает как раз 4 байта. Или я теперь неуловил?

    Я специально ввел проверку индекса таким образом:

    Код (Text):
    1. mov edx,esi
    2.                     add dl,30h
    3.                     mov mas,dl
    4.                     invoke SetWindowText,hKor,addr mas
    этот код разместил перед занесением хендла в массив, так вот он как раз и показывает что индекс с какого то перепугу на 3 добавляется ,а не на 1...
     
  4. dr_godsl

    dr_godsl New Member

    Публикаций:
    0
    Регистрация:
    13 дек 2009
    Сообщения:
    60
    ты бы полностью код выложил, было бы понятнее.
     
  5. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Это же не Си. От того, что ты объявил массив DWORD - ассемблеру не жарко не холодно - в командах надо индексы умножать на 4 или макросы использовать. Такова плата за низкоуровневое программирование.
     
  6. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    Кстати да! Поменял место inc esi - add esi,4 и заработало так как надо (почти). Правда вылезла одна менее существенная проблемка - почему то добавляется 9 элементов, а не 8 (hDv    dd 8 dup (0)). Конечно исправить это нет проблем, но хотелось бы понять логику. Не подскажите почему не 8, а 9 добавляется вопреки 8 обьявленным элементам массива?
     
  7. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    Ладно, забыли. Не хочу вас напрягать мелочами.

    Всем спасибо за помощь. Тема закрыта.
     
  8. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    ты уж определись или у тебя в ESI относительное смещение и тогда ты пишешь
    mov array[ESI],EAX
    ...
    add ESI,4

    или индекс
    но тогда
    mov array[ESI*4],EAX
    ...
    inc esi
     
  9. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    Я понял о чем вы. Но все таки моя проблема остается. Я обращаюсь к регистру как индексу (ваш второй вариант). Но в последнем элементе массива что то не то!!!
    Размещу весь код - может поможет:
    Код (Text):
    1. mov esi,0
    2.                 mov ebx,0
    3. nach:
    4.                 mov ebx, hDv[esi*4]
    5.                 .if ebx==0
    6.  
    7.                                                         ;нижние 4 строчки проверка значения в индексе esi
    8.                     mov edx,esi
    9.                     add dl,30h
    10.                     mov mas,dl
    11.                     invoke SetWindowText,hKor,addr mas
    12.  
    13.                                                         ;добавляем єлемент в дерево
    14.                     mov eax,hParent2
    15.                     mov tvinsert.hParent,eax
    16.                     mov tvinsert.hInsertAfter,TVI_LAST
    17.                     mov tvinsert.item.imask,TVIF_TEXT
    18.                     mov tvinsert.item.pszText,offset dv1
    19.                     invoke SendMessage,hwndTreeView,TVM_INSERTITEM,0,addr tvinsert
    20.  
    21.                                                         ;заносим хендл в массив
    22.                     mov hDv[esi*4], eax    
    23.                     invoke SendMessage,hwndTreeView,TVM_EXPAND, TVE_EXPAND,hParent2
    24.                     jmp go
    25.                 .else
    26.                     inc esi
    27.                    
    28.                     jmp nach
    29.  
    30.                 .endif
    31. go:
    Так вот когда я добавляю элементы, индекс правильно показывает(1,2,3...) до последнего элемента (поидее он должен быть восьмой, но он по факту девятый) но там буква "у" почему то! Убрать бы эту последнюю гадость и все заработало бы так как нужно (то есть добавлялось бы 8 элементов). Но как ее убрать? В чем тут проблема?
     
  10. sheef_ad

    sheef_ad New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2009
    Сообщения:
    101
    Все, кажись догнал. Во всяком случае заработало правильно. Добавил в конце проверку :
    Код (Text):
    1. .if esi<8
    2.                     jmp nach
    3.                     .else
    4.                     jmp go
    5.                     .endif
    И все работает. Не знаю насколько это правильно с точки зрения "корректного кода"... разберусь со временем.
     
  11. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    возьмите в руки отладчик и посмотрите esi должен пробегать значения 0,1,2,3,4,5,6,7
    то есть после 7 вы должны выйти из цикла
    для esi =8 ничего выполнятся не должно