Вход

Просмотр полной версии : [Вопрос] Какие есть баги вне программы, влияющие на код/мод?



DiceLine
10.11.2019, 19:50
Какие внешние причины могут привести к ошибкам в программе, которая верна по синтаксису и семантики Pawn?

Слышал, что у начинающих/опытных сервер-мейкеров возникают ошибки, лаги, баги и другие непредвиденные проблемы при работе их мода, хотя компилятор не выдает обратную связь, точнее он считает, что программа работает корректно, также сам алгоритм верен. Возникает ситуация: код мода верный, а сервер работает нестабильно. То есть виноват: компилятор или другие компоненты сервера, а не сам мод. Из-за такого приходится исправлять эти баги, чтобы мод нормально работал.

Хочу узнать список таких проблем, которые могут повлиять на мод, хотя в самом коде мода не кроется проблема, то есть от самого разработчика не зависит возникновение этих проблем явно. Словно как костыль в CLEO опкод 0000: нулевого оффсета, чтобы исправить недоработку. Сам программист не виноват, а разработчики CLEO.

Попытался как можно понятнее сформулировать, не уверен, что вышло, но надеюсь, что кто-нибудь поймет и поможет. Необходимо решить эти проблемы, подготовить почву и начать свободно программировать на Pawn.

SteveStage
10.11.2019, 20:49
Например, если ты укажешь размер массива в sscanf дефайном, а не числом, то в консоль выведутся варнинги, и будут некоторые проблемы, а компилятор такой код пропускает, или например в mysql при некорректном использовании спецификатора %e в таблицу запишется NULL, а не нужное значение
И это только верхушки, с которыми столкнулся я, говнокодер, который пытается научиться Pawn чуть больше 2 месяцев
Коротко говоря, будь внимательней при работе с sscanf и с запросами mysql

DeimoS
10.11.2019, 21:07
Эмм, если алгоритм написан верно, то и багов никаких не будет. Баги могут появиться только из-за ошибок в коде и никак иначе. Так что не слушай тех, кто тебе там что-то рассказывал. Ну или попроси их же привести примеры, а потом нам расскажи их.

SteveStage
10.11.2019, 21:10
Эмм, если алгоритм написан верно, то и багов никаких не будет. Баги могут появиться только из-за ошибок в коде и никак иначе.

Согласен, код не может быть написан верно, но в нем есть баги. Мб компилятор не видит недоработок, но они всплывут на практике. Так что пиши систему и сразу ее тестируй, чтобы вовремя находить баги и исправлять их, и чтобы они не накапливались

DeimoS
10.11.2019, 21:20
Согласен, код не может быть написан верно, но в нем есть баги. Мб компилятор не видит недоработок, но они всплывут на практике. Так что пиши систему и сразу ее тестируй, чтобы вовремя находить баги и исправлять их, и чтобы они не накапливались

Компилятор видит только синтаксические ошибки. Логистические ошибки (за редким исключением) он не сможет отслеживать, ибо для этого в него заранее должна быть заложена логика всех возможных систем (что физически невозможно), чтоб он мог проверять написанный тобой код. Именно поэтому он и не будет реагировать на кривой алгоритм в системе и т.п.

DiceLine
14.11.2019, 23:15
Нашел вот эту тему на форуме, спасибо автору. В принципе близкое к тому, что хотел получить: http://pro-pawn.ru/showthread.php?9570-%D0%A1%D0%B0%D0%BC%D1%8B%D0%B5-%D0%B8%D0%B7%D0%B2%D0%B5%D1%81%D1%82%D0%BD%D1%8B%D0%B5-%D0%B1%D0%B0%D0%B3%D0%B8-%D0%BA%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%82%D0%BE%D1%80%D0%B0 .

Pa4enka
15.11.2019, 00:36
Воспользуйся компилятором от Zeex'a и забудь о большинстве багов. В остальном, имхо, Деймос дал четкий ответ: компилятор предназначается не для отслеживания логических ошибок, которые допустил скриптер, а на поиск синтаксических ошибок с которыми мод не будет работать.

DeimoS
15.11.2019, 14:02
Нашел вот эту тему на форуме, спасибо автору. В принципе близкое к тому, что хотел получить: http://pro-pawn.ru/showthread.php?9570-%D0%A1%D0%B0%D0%BC%D1%8B%D0%B5-%D0%B8%D0%B7%D0%B2%D0%B5%D1%81%D1%82%D0%BD%D1%8B%D0%B5-%D0%B1%D0%B0%D0%B3%D0%B8-%D0%BA%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%82%D0%BE%D1%80%D0%B0 .

Собственно, выше уже ответили про модифицированный компилятор, который исправляет если не все перечисленные баги, то большую их часть, но вообще перечисленное в теме не очень сходится с изначальным вопросом, ибо это не "проблемы, которые могут повлиять на мод, хотя в самом коде мода не кроется проблема". Это именно проблемы кода и незнание особенностей работы компилятора/сервера - логистические ошибки.

Если уж на то пошло, то тебе стоит и вот эти темы изучить:
1) http://pro-pawn.ru/showthread.php?6678-%D0%A2%D1%80%D0%BE%D0%BB%D0%BB%D0%B8%D0%BD%D0%B3-%D0%B2-Pawn
2) http://pro-pawn.ru/showthread.php?8347-%D0%A0%D0%B5%D0%BA%D0%BE%D0%BC%D0%B5%D0%BD%D0%B4%D0%B0%D1%86%D0%B8%D0%B8-%D0%BF%D0%BE-%D0%BD%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D1%8E-%D0%BA%D0%BE%D0%B4%D0%B0
3) http://pro-pawn.ru/showthread.php?5249-Pawn-%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B5%D1%81%D0%BD%D1%8B%D0%B5-%D1%84%D0%B0%D0%BA%D1%82%D1%8B-%D1%81%D0%BE%D0%B2%D0%B5%D1%82%D1%8B

Из каждой темы можно вычленить полезную информацию на тему того, как правильно писать код, чтоб было минимум ошибок.

DeimoS
27.11.2019, 15:49
Немного некропостинга


Например, если ты укажешь размер массива в sscanf дефайном, а не числом, то в консоль выведутся варнинги

Решается так:
main()
{
#define TEST_MACROS 20
new array[] = "TestMessage 5";
new string[TEST_MACROS];
new variable;
sscanf(array, "s["#TEST_MACROS"]i", string, variable);
printf("\n\n%s\n\n%d\n\n", string, variable);
}

SteveStage
28.11.2019, 23:54
Немного некропостинга



Решается так:
main()
{
#define TEST_MACROS 20
new array[] = "TestMessage 5";
new string[TEST_MACROS];
new variable;
sscanf(array, "s["#TEST_MACROS"]i", string, variable);
printf("\n\n%s\n\n%d\n\n", string, variable);
}

Столкнулся с этой проблемой когда писал систему офф бана (один из параметров команды - ник игрока), и я указал просто:

if(sscanf(params, "s[MAX_PLAYER_NAME+1]ds[51]", name, targettime, reason))
return SCM(playerid, COLOR_RED, !"Образец бана оффлайн: /banoff [name] [day] [reason]");

Во время тестов в консоль вывелись варнинги, и я просто заменил на число (MAX_PLAYER_NAME в 0.3.7 - 24 символа + 1 нуль символ = 25), не найдя альтернативы
Спасибо)

UPD:
new
name[MAX_PLAYER_NAME+1],
targettime,
reason[51],
giver[MAX_PLAYER_NAME+1];

if(sscanf(params, "s["#MAX_PLAYER_NAME"+1]ds[51]", name, targettime, reason))
return SCM(playerid, COLOR_RED, !"Образец бана оффлайн: /banoff [name] [day] [reason]");

C:\Users\HP\Desktop\Äîêóìåíòû\2) Pawn\Ìîè ìîäû\Junction RP\gamemodes\JunctionMode.pwn(3756) : error 001: expected token: ")", but found "-string-"
C:\Users\HP\Desktop\Äîêóìåíòû\2) Pawn\Ìîè ìîäû\Junction RP\gamemodes\JunctionMode.pwn(3756) : warning 215: expression has no effect
C:\Users\HP\Desktop\Äîêóìåíòû\2) Pawn\Ìîè ìîäû\Junction RP\gamemodes\JunctionMode.pwn(3756) : warning 215: expression has no effect
C:\Users\HP\Desktop\Äîêóìåíòû\2) Pawn\Ìîè ìîäû\Junction RP\gamemodes\JunctionMode.pwn(3756) : warning 215: expression has no effect
C:\Users\HP\Desktop\Äîêóìåíòû\2) Pawn\Ìîè ìîäû\Junction RP\gamemodes\JunctionMode.pwn(3756) : warning 215: expression has no effect
C:\Users\HP\Desktop\Äîêóìåíòû\2) Pawn\Ìîè ìîäû\Junction RP\gamemodes\JunctionMode.pwn(3756) : error 001: expected token: ";", but found ")"
C:\Users\HP\Desktop\Äîêóìåíòû\2) Pawn\Ìîè ìîäû\Junction RP\gamemodes\JunctionMode.pwn(3756) : error 029: invalid expression, assumed zero
C:\Users\HP\Desktop\Äîêóìåíòû\2) Pawn\Ìîè ìîäû\Junction RP\gamemodes\JunctionMode.pwn(3756) : fatal error 107: too many error messages on one line

Что я делаю не так?

UPD2: Я задефайнил MAX_PLAYER_NAME в самом моде и теперь новая ошибка:

C:\Users\HP\Desktop\Äîêóìåíòû\2) Pawn\Ìîè ìîäû\Junction RP\gamemodes\JunctionMode.pwn(58) : warning 201: redefinition of constant/macro (symbol "MAX_PLAYER_NAME")

Но мод скомпилировался

DeimoS
29.11.2019, 00:05
MAX_PLAYER_NAME стандартно написан так:
#define MAX_PLAYER_NAME (24)
А для данного метода скобки критичны (должно быть "голое" число и ничего более).

Собственно:
#undef MAX_PLAYER_NAME
#define MAX_PLAYER_NAME /*количество слотов*/