Непонятный индексный глюк.

Тема в разделе "LANGS.C", создана пользователем NoName, 24 окт 2011.

  1. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    BYTE *FullProjectIdent[];
    В памяти указатели размером DWORD.

    Код (Text):
    1. int    i;
    2.        asm cli
    3.  
    4.        for( i = 0; FullProjectIdent[ i ] != NULL; i++ ) ;
    5.        //       SysOutLineOwn( 1, 0, SYSCOLFON_BLACK | SYSCOLTXT_GRAY,
    6.        //                    (i <= 0) ? SysProjectIdent : FullProjectIdent[ i - 1 ] );
    7.  
    8.        if(i > 0) {
    9.          SysDUitoa(Buff, (DWORD)i);
    10.          SysOutLineOwn( 15, 0, SYSCOLFON_BLACK | SYSCOLTXT_GRAY, Buff ); //i = 0x11
    11.  
    12.          SysDUitoa(Buff, (DWORD)FullProjectIdent[i - 1]);
    13.          SysOutLineOwn( 16, 0, SYSCOLFON_BLACK | SYSCOLTXT_GRAY, Buff );
    14.  
    15.          SysDUitoa(Buff, (DWORD)&FullProjectIdent[i - 1]);
    16.          SysOutLineOwn( 17, 0, SYSCOLFON_BLACK | SYSCOLTXT_GRAY, Buff );
    17.  
    18.          SysDUitoa(Buff, (DWORD)FullProjectIdent[16]);
    19.          SysOutLineOwn( 18, 0, SYSCOLFON_BLACK | SYSCOLTXT_GRAY, Buff );
    20.  
    21.          SysDUitoa(Buff, (DWORD)&FullProjectIdent[16]);
    22.          SysOutLineOwn( 19, 0, SYSCOLFON_BLACK | SYSCOLTXT_GRAY, Buff );
    23.  
    24.          SysOutLineOwn( 20, 0, SYSCOLFON_BLACK | SYSCOLTXT_GRAY, (BYTE *)FullProjectIdent[0x11 - 1] );
    25.          //SysOutLineOwn( 21, 0, SYSCOLFON_BLACK | SYSCOLTXT_GRAY, (BYTE *)FullProjectIdent[i - 1] );
    26.  
    27.          SysDUitoa(Buff, (DWORD)i);
    28.          SysOutLineOwn( 22, 0, SYSCOLFON_BLACK | SYSCOLTXT_GRAY, Buff ); //i = 0x11
    29.        }
    30.        asm sti
    Код (Text):
    1.    ;   
    2.    ;             SysOutLineOwn( 20, 0, SYSCOLFON_BLACK | SYSCOLTXT_GRAY, (BYTE *)FullProjectIdent[0x11 - 1] );
    3.    ;   
    4.     push      dword ptr [_FullProjectIdent+64]
    5.     push      7
    6.     push      0
    7.     push      18
    8.     call      _SysOutLineOwn
    9.     add       esp,16
    10.    ;   
    11.    ;             SysOutLineOwn( 1, 0, SYSCOLFON_BLACK | SYSCOLTXT_GRAY, (BYTE *)FullProjectIdent[i - 1] );
    12.    ;   
    13.     push      dword ptr [_FullProjectIdent-4+4*ebx]
    14.     push      7
    15.     push      0
    16.     push      19
    17.     call      _SysOutLineOwn
    18.     add       esp,16
    При использовании в функции SysOutLineOwn адреса в FullProjectIdent[i - 1] ловим нулевой указатель.
    Я непонимаю, может невижу чего-то очевидного :dntknw:

    SysDUitoa(Buff, (DWORD)FullProjectIdent[i - 1]); тоже почему-то показывает нули.

    Адреса &FullProjectIdent[16] и &FullProjectIdent[i - 1] различаются на 17 * 4.

    Код (Text):
    1.    ;   
    2.    ;           for( i = 0; FullProjectIdent[ i ] != NULL; i++ ) ;
    3.    ;   
    4.     xor       ebx,ebx
    5.     jmp short @203
    6. @202:
    7. @204:
    8.     inc       ebx
    9. @203:
    10.     cmp       dword ptr [_FullProjectIdent+4*ebx],0
    11.     jne short @202