Во первых посоветовал бы не играться со стеком, выделяя память в том случае, где это вовсе не нужно. В твоём случае нет нужды сохранять названия подпунктов диалога с лицензиями в двумерном массиве. Это понты, раз уж на то пошло, на реальном примере, спустя время, будешь прибегать к наиболее оптимальному варианту, не потребляющему столько байтов. Дальше хотелось бы подметить то, что нельзя присваивать данные двумерному массиву таким образом, коим это делаешь Ты. Тем более, если речь о булевых значениях, то нет смысла делать такое, ибо пр-тумолчанию итак false будет. Хотя, если бы вторая мера не была перечислением, то можно было бы провернуть такое:
PHP код:
new bool: g_players_licenses[MAX_PLAYERS][MAX_LICENSES_TYPE] = {{false, ...}, ...};
но если речь о перечислении, то придётся тогда уж либо циклом присваивать всем элементам той или иной статус(вариант не из лучших), либо же создавать массив на n кол-во элементов(MAX_LICENSES_TYPE), устанавливая всем элементам false статус.
Насчёт проблемы, то почему не указан const и видеть бы, при каких условиях вызывается GeneratePlayerLicenseList. И к слову, не понимаю к чему очищать массив изначально. Судя по всему в output_string поступает глобальный массив, где вполне себе могут быть данные. К рассчёту памяти в этом случае тоже стоило бы подойти рациональнее, потому как не уверен, что там и впрямь всё 512 ячеек нужны. Ну и к слову, ты забыл скобки в тернарке, поэтому вот:
PHP код:
format(output_string, size, "%s%d. %s: %s\n",
output_string,
i + 1,
g_licenses_name[i],
(GetPlayerLicense(playerid, i) ? ("Есть") : ("Отсутствует")));
- - - Добавлено - - -
Сообщение от
punkochel
Покажи как ты GeneratePlayerLicenseList вызываешь, с какими параметрами.
UPD:
GetPlayerName возвращает длину записанного никнейма, а не сам никнейм.
В данном случае тебе необходимо убедиться на 100% что размер массива который будет передан в функцию через параметр output_string[] будет обеспечивать запись всего форматируемого текста.
stock GeneratePlayerLicenseList(playerid, output_string[], size = sizeof(output_string))
{
format(output_string
, size
, "Лицензии игрока: %s", output_string
); for(new i; i < MAX_LICENSES_TYPE; ++i) {
format(output_string
, size
, "%s%d. %s: %s\n", output_string,
i+1,
g_licenses_name[i],
(GetPlayerLicense(playerid, i)) ? ("Есть") : ("Отсутствует"));
}
return 1;
}
Если мне не изменяет память, то использовав формат в надежде записать: Лицензии игрока %s, ник не будет передан, ибо формат при записи в массив новых данных, чистит его от старых. Поэтому гораздо-более благонадежнее было бы создать отдельное хранилище под ник. А ещё лучше записывать его куда-нибудь, когда игрок подключается к серваку. И, к слову, длину output_string всё же стоило бы указать, ибо в более новых версиях компилятор реагирует на нефиксированный размер массив, выводя предупреждение