PDA

Просмотр полной версии : [Вопрос] Pawn и массивы



KrutoyKrosch
21.11.2017, 03:22
Это что-то...



new const
NameAllKey[][] =
{
{"A", 0x41},
{"B", 0x42},
{"C", 0x43},
{"D", 0x44},
{"E", 0x45},
{"F", 0x46},
{"G", 0x47},
{"H", 0x48},
{"I", 0x49},
{"J", 0x4A},
{"K", 0x4B},
{"L", 0x4C},
{"M", 0x4D},
{"N", 0x4E},
{"O", 0x4F},
{"P", 0x50},
{"Q", 0x51},
{"R", 0x52},
{"S", 0x53},
{"T", 0x54},
{"U", 0x55},
{"V", 0x56},
{"W", 0x57},
{"X", 0x58},
{"Y", 0x59},
{"Z", 0x5A}
};



Потом



for(new i; i < sizeof NameAllKey; i++)
{
printf("KEY FIND - %s\n", NameAllKey[i][0]); // Выводит нормально все буквы

if(!strcmp(NameAllKey[i][0], key)) // Если буква равна той которая мне нужна
{
printf("YESSSSSSSSSS - %s\n", NameAllKey[i][0]); // Вывожу букву - все правильно
KeyIDAnim[playerid][slot] = NameAllKey[i][1]; // Записываю номер этой буквы в другую переменную

// Смотрю у меня скрипт не работает хотя все правильно, решил вывести номер буквы

printf("DAAAAAAAAA - %i\n", NameAllKey[i][1]); // А ВОТ ТУТ УЖЕ НЕ ПРАВИЛЬНО, ВМЕСТО НОРМАЛЬНО ЧИСЛА В МАССИВЕ ОНО ВЫВОДИТ 0 ПОСТОЯННО
}
}


Пометил комментариями в коде. Что делать?

Можно конечно два массива попробовать, но не костыль ли это?

DeimoS
21.11.2017, 04:34
Во первых, что это за понтокод с шестнадцатеричной системой записи? Почему нельзя просто сделать так:

new const
NameAllKey[][] =
{
{"A", 'A'},
{"B", 'B'},
{"C", 'C'},
//...
};
А лучше вообще отказаться от записи кнопки в виде строки и записывать только числом. И проверять числа гораздо проще/быстрее, и выводить не так уж и сложно (спецификатор "%c"). Тем более, что твоя запись в виде строки будет равносильна записи числом (каждый символ равен определённому числу и твоя строка будет записана как число + ещё одна ячейка под нуль-символ. То бишь, просто ячейка массива впустую).

Во-вторых, куда ты записываешь строку? Сейчас ты и строку, и число пытаешься впихнуть в одну и ту же меру массива. А потом выводишь нуль-символ в своём коде, который ты пометил комментариями. Чтоб сделать так, как хочешь ты (что криво), нужно сделать так:

new const
NameAllKey[][][] =
//...
Но это крайне странное и кривое решение.



А не ругается компилятор, скорее всего, из-за особенности работы (или бага) с массивами, при которой можно обращаться к следующей мере массива "из предыдущей". Я не особо силён в формулировке данного определения, но суть в том, что сейчас твой код работает так:

new const
NameAllKey[][] =//Создаётся двумерный массив
{
{"A", 0x41},//В ячейки [0][0] записывается значение "A", а так как нет ещё одной меры (вторая мера уходит под хранение текста), 0x41 записывается в следующую ячейку (то бишь, [1][0])
{"B", 0x42},//Теперь очередь доходит до этой записи и уже ячейка [1][0] перезаписывается значением "B", а 0x42 переходит в следующую ячейку.
{"C", 0x43},//И так далее до самого конца
//...
};
В итоге получается, что у тебя первая мера заполнена всеми буквами от A до Z, а вторая является хранилищем текста (значение буквы + нуль-символ). Точнее, буквы записаны во вторую меру... Ну ты понял, в общем.

Но пенять во всём ЯП или компилятор глупо, ибо тут уже сугубо либо твоя невнимательность, либо незнание того, чем являются символы в строке и как работать со строками в массивах.

ziggi
21.11.2017, 07:32
Я что-то прикола не понял, весь этот код можно записать так:

if ('A' <= key[0] <= 'Z') {
KeyIDAnim[playerid][slot] = key[0];
}

KrutoyKrosch
21.11.2017, 12:42
Да спасибо, забыл что можно делать через ' '. Просто "Сегодня, 02:22"