11.12.2016, 13:44
В общем, месяц назад делал регистрацию для сервера, в энуменатор информации игрока записал ник, пароль, электронную почту, пол, уровень, деньги и расу.
Из них текстовыми являются ник, пароль и раса. Максимальное значение расы - 15 символ. Ну я записал в массив 16, учитывая нуль-терминатор. И что-то решил изменить массив с 16 на 15, проверить кое-что. Но ошибся и поставил массив 1. Когда я проверил - я был удивлён, в переменную записалось значение из 15 символов. Я неделю мучился и искал что может быть не так. И сегодня я решил поменять порядок расположения: ник, пароль, электронная почта, раса, пол, деньги. И вот тут с массивом равным 1 не прокатило, пришлось ставить 16.
Вот ещё, что заметил.
От положения текстовой переменной в в энуменаторе зависит как она будет себя ввести, когда в неё запишут какое-то значение (это в том случае, если размер массива указан меньше, чем надо). Если текстовая переменная находится после всех (именно после текстовых, а не последняя в энуменаторе), то, похоже, нуль-символ не учитывается, но тогда значение какой-либо целочисленной переменной искажается. Если её потом поменять местом с любой текстовой - происходит склеивание строк из-за отсутствия нуль-терминатора.
Примеры:
Корректный вариант (массивы указаны верно и текстовая переменная находится в конце энуменатора, другие в центре):
Итог:
Указываем у последней переменной массив равный 2:
В итоге видим, что переменная нормально отобразилось, но появилась "отбросочная строка", та же, только там проигнорированы первые 2 символа. Странно, да? Ведь должна было просто не отобразится строка, либо же не полностью. Если тестить в игре - то в переменную разумеется запишется только значение 1 строки, а вот то что мы видим на 2 строке - не будет, ибо, допустим функция SendClientMessage выводит лишь 1 строку. В консоли, как видим возможно, что странно.
Теперь ставим эту переменную с массивом 2 в конец текстовых переменных.
Как мы видим отобразилось 2 первых символа, логично, но опять же присутствует "отбросочная строка". Также, тестируя в игре - у меня исказилась целочисленная переменная.
Ставим эту переменную по середине текстовых, опять же с размером массива 2:
Склеилась другая текстовая переменная:
Вот такие вот дела.
Из них текстовыми являются ник, пароль и раса. Максимальное значение расы - 15 символ. Ну я записал в массив 16, учитывая нуль-терминатор. И что-то решил изменить массив с 16 на 15, проверить кое-что. Но ошибся и поставил массив 1. Когда я проверил - я был удивлён, в переменную записалось значение из 15 символов. Я неделю мучился и искал что может быть не так. И сегодня я решил поменять порядок расположения: ник, пароль, электронная почта, раса, пол, деньги. И вот тут с массивом равным 1 не прокатило, пришлось ставить 16.
Вот ещё, что заметил.
От положения текстовой переменной в в энуменаторе зависит как она будет себя ввести, когда в неё запишут какое-то значение (это в том случае, если размер массива указан меньше, чем надо). Если текстовая переменная находится после всех (именно после текстовых, а не последняя в энуменаторе), то, похоже, нуль-символ не учитывается, но тогда значение какой-либо целочисленной переменной искажается. Если её потом поменять местом с любой текстовой - происходит склеивание строк из-за отсутствия нуль-терминатора.
Примеры:
Корректный вариант (массивы указаны верно и текстовая переменная находится в конце энуменатора, другие в центре):
Code:
#include <a_samp> enum test { ext, ext1, etc[7], etc1[5], ext2, ext3, etc2[9], } new testt[test]; main() { print("\n----------------------------------"); print(" Blank Gamemode by your name here"); print("----------------------------------\n"); } public OnGameModeInit() { testt[ext] = 1111; testt[ext1] = 1; testt[etc][0] = EOS; strins(testt[etc], "123456", 0); testt[etc1][0] = EOS; strins(testt[etc1], "1234", 0); testt[etc2][0] = EOS; strins(testt[etc2], "12345678", 0); testt[ext2] = 0; testt[ext3] = 1341234; printf("%d, %d, %s, %s, %d, %d, %s", testt[ext], testt[ext1], testt[etc], testt[etc1], testt[ext2], testt[ext3], testt[etc2]); return 1; }
Code:
[22:42:56] 1111, 1, 123456, 1234, 0, 1341234, 12345678 [22:42:56] ---------------------------------- [22:42:56] Blank Gamemode by your name here [22:42:56] ---------------------------------- [22:42:56] Number of vehicle models: 0
Code:
#include <a_samp> enum test { ext, ext1, etc[7], etc1[5], ext2, ext3, etc2[2], } new testt[test]; main() { print("\n----------------------------------"); print(" Blank Gamemode by your name here"); print("----------------------------------\n"); } public OnGameModeInit() { testt[ext] = 1111; testt[ext1] = 1; testt[etc][0] = EOS; strins(testt[etc], "123456", 0); testt[etc1][0] = EOS; strins(testt[etc1], "1234", 0); testt[etc2][0] = EOS; strins(testt[etc2], "12345678", 0); testt[ext2] = 0; testt[ext3] = 1341234; printf("%d, %d, %s, %s, %d, %d, %s", testt[ext], testt[ext1], testt[etc], testt[etc1], testt[ext2], testt[ext3], testt[etc2]); return 1; }
Code:
[22:44:12] --------------- [22:44:12] Loaded 0 filterscripts. [22:44:12] 1111, 1, 123456, 1234, 0, 1341234, 12345678 [22:44:12] 345678 [22:44:12] Blank Gamemode by your name here [22:44:12] ---------------------------------- [22:44:12] Number of vehicle models: 0
Code:
#include <a_samp> enum test { ext, ext1, etc[7], etc1[5], etc2[2], ext2, ext3, } new testt[test]; main() { print("\n----------------------------------"); print(" Blank Gamemode by your name here"); print("----------------------------------\n"); } public OnGameModeInit() { testt[ext] = 1111; testt[ext1] = 1; testt[etc][0] = EOS; strins(testt[etc], "123456", 0); testt[etc1][0] = EOS; strins(testt[etc1], "1234", 0); testt[etc2][0] = EOS; strins(testt[etc2], "12345678", 0); testt[ext2] = 0; testt[ext3] = 1341234; printf("%d, %d, %s, %s, %d, %d, %s", testt[ext], testt[ext1], testt[etc], testt[etc1], testt[ext2], testt[ext3], testt[etc2]); return 1; }
Code:
[22:48:25] --------------- [22:48:25] Loaded 0 filterscripts. [22:48:25] 1111, 1, 123456, 1234, 0, 1341234, 12 [22:48:25] 5678 [22:48:25] Blank Gamemode by your name here [22:48:25] ---------------------------------- [22:48:25] Number of vehicle models: 0
Code:
#include <a_samp> enum test { ext, ext1, etc[7], etc2[2], etc1[5], ext2, ext3, } new testt[test]; main() { print("\n----------------------------------"); print(" Blank Gamemode by your name here"); print("----------------------------------\n"); } public OnGameModeInit() { testt[ext] = 1111; testt[ext1] = 1; testt[etc][0] = EOS; strins(testt[etc], "123456", 0); testt[etc1][0] = EOS; strins(testt[etc1], "1234", 0); testt[etc2][0] = EOS; strins(testt[etc2], "12345678", 0); testt[ext2] = 0; testt[ext3] = 1341234; printf("%d, %d, %s, %s, %d, %d, %s", testt[ext], testt[ext1], testt[etc], testt[etc1], testt[ext2], testt[ext3], testt[etc2]); return 1; }
Code:
[17:36:50] --------------- [17:36:50] Loaded 0 filterscripts. [17:36:50] 1111, 1, 123456, 34567, 0, 1341234, 1234567 [17:36:50] ---------------------------------- [17:36:50] Blank Gamemode by your name here [17:36:50] ---------------------------------- [17:36:50] Number of vehicle models: 0