Как сделать диапазон в if

Статус
В этой теме нельзя размещать новые ответы.

x330122

Участник
Сообщения
357
Реакции
152
Привет народ. Как сделать так чтобы проверка шла по диапазону цифр ? Ну вот допустим есть 10 и 20,
и если переданное значение стоит между ними, то срабатывает код.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
@fl0wer, кыш отсюда, умник! Ему всё правильно написали
Только вместо '<=' должно быть просто '<':
PHP:
переданное значение стоит между ними
т.е. крайние значения проверке не должны соответствовать
 

fl0wer

Участник
Сообщения
19
Реакции
3
Оскорбление других участников
@fl0wer, кыш отсюда, умник! Ему всё правильно написали
Только вместо '<=' должно быть просто '<':
PHP:
переданное значение стоит между ними
т.е. крайние значения проверке не должны соответствовать
<cut>
Ты что ли не читал статью? [Урок] Мини-уроки
9 пункт тебя должен заинтересовать, прочитаешь - умничка.

С чего вы вдруг решили, что можете указывать диапазон "двойным сравнением"?
Никогда не было и вот опять!
Там невооруженным глазом видно, что if( ( 10 <= i ) <= 20 )
И то что в первых скобочках по условиям матеши вернет либо 1, либо 0.
 
Последнее редактирование модератором:

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #7
@fl0wer, не удержался зачекать.
Lysis выдал именно то, что я вписал:
upload_2018-4-10_9-24-46.png


Специально вдобавок зачекал опкод, который сгенерировал с интервалом, и вручную написанная та же проверка, что и в теме у Кайло.
И что-то оно даже близко не совпадает:
C-подобный:
// Моя проверка на интервал
0xb88: load.s.alt 0xfffffffc            ; i
0xb90: sleq                           
0xb94: push.pri                       
0xb98: const.pri 0x14                   ; 20
0xba0: sgeq                           
0xba4: pop.alt                         
0xba8: and                             
0xbac: jzer 0xbcc                       ; +0x20
0xbb4: break                           

// Пример из темы Kailo, адаптированный под мой пример
0xbe8: load.s.pri 0xfffffffc            ; i
0xbf0: const.alt 0xa                    ; 10
0xbf8: and                             
0xbfc: const.alt 0x14                   ; 20
0xc04: xchg                           
0xc08: sgeq                           
0xc0c: push.pri                       
0xc10: load.s.pri 0xfffffffc            ; i
0xc18: sgrtr                           
0xc1c: pop.alt                         
0xc20: and                             
0xc24: jzer 0xc44                       ; +0x20
Так что Вы обладаете, скорее всего, устаревшей или непроверенной информацией.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
Целиком и полностью согласен.

У меня больше десятка опубликованных плагинов написанных на SourcePawn.
И что самое смешное все используют такое условие проверки и все эти условия работают.
Да, неоптимально, может быть. Но там используются только переменные.
<cut>
 
Последнее редактирование модератором:

fl0wer

Участник
Сообщения
19
Реакции
3
@fl0wer, не удержался зачекать.
Lysis выдал именно то, что я вписал:
Посмотреть вложение 29792

Специально вдобавок зачекал опкод, который сгенерировал с интервалом, и вручную написанная та же проверка, что и в теме у Кайло.
И что-то оно даже близко не совпадает:
C-подобный:
// Моя проверка на интервал
0xb88: load.s.alt 0xfffffffc            ; i
0xb90: sleq                    
0xb94: push.pri                
0xb98: const.pri 0x14                   ; 20
0xba0: sgeq                    
0xba4: pop.alt                  
0xba8: and                      
0xbac: jzer 0xbcc                       ; +0x20
0xbb4: break                    

// Пример из темы Kailo, адаптированный под мой пример
0xbe8: load.s.pri 0xfffffffc            ; i
0xbf0: const.alt 0xa                    ; 10
0xbf8: and                      
0xbfc: const.alt 0x14                   ; 20
0xc04: xchg                    
0xc08: sgeq                    
0xc0c: push.pri                
0xc10: load.s.pri 0xfffffffc            ; i
0xc18: sgrtr                    
0xc1c: pop.alt                  
0xc20: and                      
0xc24: jzer 0xc44                       ; +0x20
Так что Вы обладаете, скорее всего, устаревшей или непроверенной информацией.
Я опирался на опыт плюсах. Кто же знал, что в закосе под плюсы сделают это условие по-другому.
По хорошему этот код должен работать как я описал выше, хотя бы чисто логически.
Или они специально так сделали? То пожалуй надо создать issues в сурсмоде.

Решил проверить, и в правду сурсмод рассматривает это как двойное сравнение.
В сурсмоде 1 и 2 тест совпадают.
В плюсах же верен тоько 2 вариант (который я написал).
C-подобный:
#include < sourcemod >

/*
    Test 1
    10 <= 9 <= 20 | false
    10 <= 10 <= 20 | true
    10 <= 20 <= 20 | true
    10 <= 21 <= 20 | false
    Test 2
    9 >= 10 && 9 <= 20 | false
    10 >= 10 && 10 <= 20 | true
    20 >= 10 && 20 <= 20 | true
    21 >= 10 && 21 <= 20 | false
    Test 3
    (10 <= 9) <= 20 | true
    (10 <= 10) <= 20 | true
    (10 <= 20) <= 20 | true
    (10 <= 21) <= 20 | true
*/

public OnPluginStart( )
{
    for( int i = 1; i <= 3; i++ )
    {
        PrintToServer( "Test %d", i );

        for( int j = 9; j <= 21; j++ )
        {
            switch( j )
            {
                case 9, 10, 20, 21: { }

                default:
                    continue;
            }

            switch( i )
            {
                case 1: PrintToServer( "10 <= %d <= 20 | %s", j, 10 <= j <= 20 ? "true" : "false" );
                case 2: PrintToServer( "%d >= 10 && %d <= 20 | %s", j, j, j >= 10 && j <= 20 ? "true" : "false" );
                case 3: PrintToServer( "(10 <= %d) <= 20 | %s", j, ( 10 <= j ) <= 20 ? "true" : "false" );
            }
        }
    }
}

#include <iostream>
#include <string>

/*
    Test 1
    10 <= 9 <= 20 | true
    10 <= 10 <= 20 | true
    10 <= 20 <= 20 | true
    10 <= 21 <= 20 | true
    Test 2
    9 >= 10 && 9 <= 20 | false
    10 >= 10 && 10 <= 20 | true
    20 >= 10 && 20 <= 20 | true
    21 >= 10 && 21 <= 20 | false
    Test 3
    (10 <= 9) <= 20 | true
    (10 <= 10) <= 20 | true
    (10 <= 20) <= 20 | true
    (10 <= 21) <= 20 | true
*/

int main( )
{
    for( int i = 1; i <= 3; i++ )
    {
        std::cout << "Test " << i << std::endl;

        for( int j = 9; j <= 21; j++ )
        {
            switch( j )
            {
                case 9: case 10: case 20: case 21:
                    break;
           
                default:
                    continue;
            }
       
            switch( i )
            {
                case 1:
                {
                    std::cout << "10 <= " << j << " <= 20 | " << ( 10 <= j <= 20 ? "true" : "false" ) << std::endl;      
                    break;
                }
                case 2:
                {
                    std::cout << j << " >= 10 && " << j << " <= 20 | " << ( j >= 10 && j <= 20 ? "true" : "false" ) << std::endl;
                    break;
                }
                case 3:
                {
                    std::cout << "(10 <= " << j << ") <= 20 | " << ( ( 10 <= j ) <= 20 ? "true" : "false" ) << std::endl;
                    break;
                }
            }
        }
    }
}

<cut>
 
Последнее редактирование модератором:

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #10
Кто же знал, что в закосе под плюсы сделают это условие по-другому.
Ну, Павн - закос под Си. Никак не под Плюсы.
У них даже компилятор очень долгое время был написан без ООП. И виртуальная машина тоже.
 

fl0wer

Участник
Сообщения
19
Реакции
3
Как не под плюсы, если они добавили methodmap, аля классы.
Но и на Си этот код будет выводить тоже самое, что и на плюсах.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
Оффтоп
--- Добавлено позже ---
Как не под плюсы, если они добавили methodmap, аля классы.
Старый синтаксис
Новый синтаксис
Краткий чейджлог на гитхабе
 
Последнее редактирование модератором:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу