Скриптинг курилка

Не знаю, известно ли это всем. Нашел сегодня такой баг компилятора, что если внутри case любого switch объявить двух или трехмерный массив, то предшествующие ему переменные, внутри этого кейса, в дальнейших кейсах будут вести себя так, будто они уже объявлены. Иллюстрация проблемы ниже:

PHP Code:
justfortest()
{
    switch(
random(3))
    {
        case 
0:
        {
            new 
normal 1;
            
            
printf(""normal);
        }
        case 
1:
        {
            new 
subject 1;
            
            
/*new troublemaker[2][2] =
            {
                { 1, 2 },
                { 3, 4 }
            };*/
            
            
new subject_1 1;
            
            
printf(""subjectsubject_1/*, troublemaker[0][0]*/);
        }
        case 
2:
        {
            new 
subject 1//error 021: symbol already defined: "subject"
            
new subject_1 1;
            
printf(""subjectsubject_1);
        }
    }
}
main()
{
    
justfortest();

Если раскомментировать все, связанное с массивом troublemaker, то в обозначенной строке 2-го кейса будет ошибка (как и во всех последующих случаях).
Reply

Quote:
Originally Posted by stabker
View Post
Не знаю, известно ли это всем. Нашел сегодня такой баг компилятора, что если внутри case любого switch объявить двух или трехмерный массив, то предшествующие ему переменные, внутри этого кейса, в дальнейших кейсах будут вести себя так, будто они уже объявлены. Иллюстрация проблемы ниже:

PHP Code:
justfortest()
{
    switch(
random(3))
    {
        case 
0:
        {
            new 
normal 1;
            
            
printf(""normal);
        }
        case 
1:
        {
            new 
subject 1;
            
            
/*new troublemaker[2][2] =
            {
                { 1, 2 },
                { 3, 4 }
            };*/
            
            
new subject_1 1;
            
            
printf(""subjectsubject_1/*, troublemaker[0][0]*/);
        }
        case 
2:
        {
            new 
subject 1//error 021: symbol already defined: "subject"
            
new subject_1 1;
            
printf(""subjectsubject_1);
        }
    }
}
main()
{
    
justfortest();

Если раскомментировать все, связанное с массивом troublemaker, то в обозначенной строке 2-го кейса будет ошибка (как и во всех последующих случаях).
В компиляторе от Zeex это, вроде, исправлено.
Reply

Иногда просматривая скрипты сторонних авторов - замечаю, что условие пишут по-разному. Например возьмём strcmp:
PHP Code:
if (strcmp(destsourcetrue) == 0)
if (
== strcmp(destsourcetrue)) 
Я пользуюсь всегда 1-ым вариантом. А 2-ой вариант это типа просто свой стиль написания кода?
Reply

Quote:
Originally Posted by Diman777
View Post
Иногда просматривая скрипты сторонних авторов - замечаю, что условие пишут по-разному. Например возьмём strcmp:
PHP Code:
if (strcmp(destsourcetrue) == 0)
if (
== strcmp(destsourcetrue)) 
Я пользуюсь всегда 1-ым вариантом. А 2-ой вариант это типа просто свой стиль написания кода?
Я тоже 1й вариант использую. Да, просто стиль написания, разницы никакой в данном коде нету кроме внешнего вида.
Reply

Quote:
Originally Posted by Diman777
View Post
Иногда просматривая скрипты сторонних авторов - замечаю, что условие пишут по-разному. Например возьмём strcmp:
PHP Code:
if (strcmp(destsourcetrue) == 0)
if (
== strcmp(destsourcetrue)) 
Я пользуюсь всегда 1-ым вариантом. А 2-ой вариант это типа просто свой стиль написания кода?
Использование второго варианта исключает ошибку, когда вместо двух = пишут один.
Но я думаю, что это актуально только для недавно перешедших с паскаля
PHP Code:
if (strcmp(destsourcetrue)) 
Reply

Quote:
Originally Posted by ZiGGi
View Post
Использование второго варианта исключает ошибку, когда вместо двух = пишут один.
В варианте выше все же 2 знака равно, а не один.
Reply

Кто знает: ColAndreas способен обнаружить поверхность под водой (самое дно) ?
Reply

Quote:
Originally Posted by Kolstin
View Post
В варианте выше все же 2 знака равно, а не один.
Я знаю, но любители паскаля по ошибке могут написать один знак, подразумевая два, использование второго варианта полностью исключает подобные ошибки.
Reply

Quote:
Originally Posted by thebatya
View Post
Кто знает: ColAndreas способен обнаружить поверхность под водой (самое дно) ?
Способен, по крайней мере недалеко от берега. Только надо начинать с позиции ниже воды, потому что воду он тоже учитывает (возвращает 20000).
Reply

На одном форуме увидел:
PHP Code:
FuncA()
{
    print(
"вызов FuncA");
    return 
1;
}
FuncB()
{
    print(
"вызов FuncB");
    return 
1;
}
FuncC()
{
    print(
"вызов FuncC");
    return 
1;
}
FuncABC()
{
    return 
FuncA(), FuncB(), FuncC();

Ранее такого никогда не видел. Как бы ничего удивительного, вызвались все 3 функции, но в чём преимущество всё в одном return перечислять?
Reply

Quote:
Originally Posted by Diman777
View Post
На одном форуме увидел:
PHP Code:
FuncA()
{
    print(
"вызов FuncA");
    return 
1;
}
FuncB()
{
    print(
"вызов  FuncB");
    return 
1;
}
FuncC()
{
    print(
"вызов FuncC");
    return 
1;
}
FuncABC()
{
    return 
FuncA(), FuncB(), FuncC();

Ранее такого никогда не видел. Как бы ничего удивительного, вызвались все 3 функции, но в чём преимущество всё в одном return перечислять?
Вроде как это немного уменьшает размер amx файла. Но, естественно, оно того не стоит.
Reply

Это для любителей "оптимизации" кода в одну строку, а ещё в конце можно дописать значение, которое будет возвращено:
PHP Code:
FuncA() 

    print(
"вызов FuncA"); 
    return 
1

FuncB() 

    print(
"вызов  FuncB"); 
    return 
2

FuncC() 

    print(
"вызов FuncC"); 
    return 
3

FuncABC() 

    return 
FuncA(), FuncB(), FuncC(), 5
}
main()
{
    
printf("%d"FuncABC()); // 5 

Reply

хаха порнография какая-то, короче кому как удобно
вот здесь я это прочёл, совет называется Несколько действия в одном stock'e (не реклама, но поржать можно)
Reply

Разве заполнение массива не происходит при подобном:
Code:
new array[100] = {1, ...};
Reply

Quote:
Originally Posted by Diman777
View Post
Иногда просматривая скрипты сторонних авторов - замечаю, что условие пишут по-разному. Например возьмём strcmp:
PHP Code:
if (strcmp(destsourcetrue) == 0)
if (
== strcmp(destsourcetrue)) 
Я пользуюсь всегда 1-ым вариантом. А 2-ой вариант это типа просто свой стиль написания кода?
Просто когда недоскриптеры, считающие себя опытными, пишут подобный понтокод, не понимают, что рушится вся логика построения кода. Задача: сравнить исходное с нулём, а не наоборот. Не знаю, можно ли назвать это проблемой, но безграмотность точно. Сродни тому, что пишут:
Code:
strcmp("/kill", cmdtext)
вместо:
Code:
strcmp(cmdtext, "/kill")
Reply

Quote:
Originally Posted by OKStyle
View Post
Разве заполнение массива не происходит при подобном:
Code:
new array[100] = {1, ...};
Если это адресовано мне, то происходит. Но такое возможно только при инициализации.
Reply

А дедовский?)
Code:
for(new i; i < sizeof(array); i++) array[i] = 1;
Reply

Quote:
Originally Posted by OKStyle
Посмотреть сообщение
Сродни тому, что пишут:
pawn Код:
strcmp("/kill", cmdtext)
вместо:
pawn Код:
strcmp(cmdtext, "/kill")
Эм, а какая разница? По-моему, тут как раз эстетичнее будет первый вариант

А по поводу сравнения с нулём: а нафига вообще так писать? Опять же, красивее будет так:
Код:
if(!strcmp("/cmd", cmdtext, true))
Reply

Quote:
Originally Posted by OKStyle
Посмотреть сообщение
Просто когда недоскриптеры, считающие себя опытными, пишут подобный понтокод, не понимают, что рушится вся логика построения кода. Задача: сравнить исходное с нулём, а не наоборот. Не знаю, можно ли назвать это проблемой, но безграмотность точно. Сродни тому, что пишут:
pawn Код:
strcmp("/kill", cmdtext)
вместо:
pawn Код:
strcmp(cmdtext, "/kill")
От перестановки мест слагаемых сумма не меняется.
По вашему я то же "недоскриптер", потому что последнее время я ставлю константы в начале сравнения?!
Reply

Дело не в эстетике, а логике. Код, не поддающийся логике - говнокод...
Reply


Forum Jump:


Users browsing this thread: 7 Guest(s)