SA-MP Forums Archive
Скриптинг курилка - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Русский/Russian (https://sampforum.blast.hk/forumdisplay.php?fid=32)
+---- Thread: Скриптинг курилка (/showthread.php?tid=111279)



Re: Скриптинг курилка - stabker - 06.02.2017

Не знаю, известно ли это всем. Нашел сегодня такой баг компилятора, что если внутри 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-го кейса будет ошибка (как и во всех последующих случаях).


Re: Скриптинг курилка - ZiGGi - 06.02.2017

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 это, вроде, исправлено.


Re: Скриптинг курилка - Diman777 - 07.02.2017

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


Re: Скриптинг курилка - Romz - 08.02.2017

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


Re: Скриптинг курилка - ZiGGi - 08.02.2017

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



Re: Скриптинг курилка - Romz - 08.02.2017

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


Re: Скриптинг курилка - thebatya - 08.02.2017

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


Re: Скриптинг курилка - ZiGGi - 08.02.2017

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


Re: Скриптинг курилка - stabker - 08.02.2017

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


Re: Скриптинг курилка - Diman777 - 09.02.2017

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

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


Re: Скриптинг курилка - ZiGGi - 09.02.2017

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 файла. Но, естественно, оно того не стоит.


Re: Скриптинг курилка - joker2020pro - 09.02.2017

Это для любителей "оптимизации" кода в одну строку, а ещё в конце можно дописать значение, которое будет возвращено:
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 




Re: Скриптинг курилка - Diman777 - 09.02.2017

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


Re: Коллекция функций / макросов - OKStyle - 20.02.2017

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



Re: Скриптинг курилка - OKStyle - 20.02.2017

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")



Re: Коллекция функций / макросов - stabker - 20.02.2017

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


Re: Коллекция функций / макросов - OKStyle - 20.02.2017

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



Re: Скриптинг курилка - DartfoL - 20.02.2017

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

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



Re: Скриптинг курилка - Stepashka - 20.02.2017

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


Re: Скриптинг курилка - OKStyle - 20.02.2017

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