Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 4 из 4 ПерваяПервая ... 2 3 4
Показано с 31 по 36 из 36

Тема: /cc (ZCMD/DC_CMD)

  1. #31
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Исправлен краш, возникавший при использовании стандартного компилятора Pawn (до этого я использовал при тестировании только модифицированный компилятор от Zeex). Суть в том, что если использовать #emit сразу же после блока if, то созданные с помощью #emit инструкции почему-то попадают в тот блок.
    Иными словами, код
    PHP код:
            if(i==0)
                
    SendClientMessageToAll(0str);
            
    #emit    push.c        str
            #emit    push.c        0xFFFFFFFF
            #emit    push.c        8 
    превращается компилятором в
    PHP код:
        if(i==0)
        {
            
    SendClientMessageToAll(0str);
            
    #emit    push.c        str
            #emit    push.c        0xFFFFFFFF
            #emit    push.c        8
        

    Zeex уже знает об этом баге, но ещё не исправил его в своей версии компилятора.

    Проблема проявлялась только при использовании стандартного компилятора, т.к. только при его использовании компилировался блок if. Решена она была следующим образом: после блока if я добавил "i = 100;" - это действие не имеет никакого смысла (т.к. переменная i уже создаётся с изначальным значением 100), но позволяет отделить #emit от if.
    PHP код:
        if(i==0)
            
    SendClientMessageToAll(0str);
        
    100;
        
    #emit    push.c        str
        #emit    push.c        0xFFFFFFFF
        #emit    push.c        8 
    Это ещё можно исправить таким образом:
    PHP код:
        if (== 0)
        {
            
    SendClientMessageToAll(0str);
        } {} 
    Не будет генерироваться лишних инструкций.

    Что было:
    PHP код:
        zero.pri
        push
    .pri
        push
    .c 8
        sysreq
    .c 2    SendClientMessageToAll
        stack c
    l.4
        
    const.pri 64
        stor
    .s.pri fffffffc

        push
    .c 4
        push
    .c ffffffff
        push
    .c 8 
    Что стало:
    PHP код:
        zero.pri
        push
    .pri
        push
    .c 8
        sysreq
    .c 2    SendClientMessageToAll
        stack c
    l.4
        push
    .c 4
        push
    .c ffffffff
        push
    .c 8 
    Последний раз редактировалось VVWVV; 23.11.2016 в 15:10.

  2. Пользователь сказал cпасибо:
    Geebrox (28.11.2016)
  3. #32
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от VVWVV Посмотреть сообщение
    Это ещё можно исправить таким образом:
    PHP код:
        if (== 0)
        {
            
    SendClientMessageToAll(0str);
        } {} 
    Или так:
    PHP код:
    { if(== iSendClientMessageToAll(0str); } 
    ИМХО, более эстетичный способ, но да, суть всё та же: нужен пустой локальный блок, чтобы обойти баг с наименьшими потерями.

    Обновил 1-й пост.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  4. #33
    Аватар для HarrWe
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.05.2016
    Сообщений
    144
    Репутация:
    11 ±
    Пытался реализовать подобное для SendClientMessage, но в итоге так ничего и не вышло, и пару вопросов возникло,
    PHP код:
    // передать параметры для SendClientMessageToAll
    #emit    push.c        str
    #emit    push.c        0xFFFFFFFF
    #emit    push.c        8 
    Что это за аргумент #emit push.c 8?

    PHP код:
    static const str[] = "";
    new 
    100;
    #if __Pawn < 0x030A
        
    { if(== iSendClientMessage(playerid,0,str); }
    #endif
        #emit    push.c        playerid
        #emit    push.c        0xFFFFFFFF
        #emit    push.c        str

    do{
        
    #emit    sysreq.c    SendClientMessage
    }while(--i);

    #emit    stack        12 

  5. #34
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Общий размер аргументов функции в байтах: 2 * (cellbits / charbits).
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  6. Пользователь сказал cпасибо:
    HarrWe (12.07.2017)
  7. #35
    Аватар для HarrWe
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.05.2016
    Сообщений
    144
    Репутация:
    11 ±
    Окей, но работать всё равно не хочет. Что не так?

    PHP код:
    static const str[] = "";
    new 
    100;


    #if __Pawn < 0x030A
        
    { if(== iSendClientMessage(playerid0str); }
    #endif


    #emit    push.c        playerid
    #emit    push.c        0xFFFFFFFF
    #emit    push.c        str
    #emit    push.c        8


    do{
        
    #emit    sysreq.c    SendClientMessage
    }while(--i);


    #emit    stack        12 

  8. #36
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Вы не знаете самых основ #emit и ждёте, что всё сделают за вас, вот что не так. Изучите теорию, потом уже пытайтесь адаптировать чужой код. На оффе есть несколько хороших уроков.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  9. Пользователь сказал cпасибо:
    HarrWe (12.07.2017)
 

 
Страница 4 из 4 ПерваяПервая ... 2 3 4

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •