PDA

Просмотр полной версии : [Вопрос] warning 219: Перечисления и локальные переменные



Bib
30.09.2017, 08:35
Pawn не перестает меня удивлять.

В следующем коде возникает неоднозначность


enum ePosition
{
x,
y,
z
}

main()
{
new x, y, z;
}

Можно ли как-то исправить это? А то использование этих переменных вызывает уже ошибки.

А вариант


enum ePosition
{
posx,
posy,
posz
}

Тоже самое, что и обращаться ко мне как к Bib Bib, не катит. Или по другом никак?

DeimoS
30.09.2017, 13:18
Я даже чаем подавился от столь удивительного вопроса...

Эмм, а что тебя удивляет? То, что ты одно имя резервируешь и локально, и глобально, а потом заставляешь Pawn каким-то образом определять к какому именно имени ты обращаешься? Это то же самое, что и если бы помимо тебя в семье было 10 детей и всех вас назвали "Петя", а потом мама каждый раз кричала: "Петя, подойди ко мне".

Почитай вот эту (http://pro-pawn.ru/showthread.php?8347-%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5-%D1%80%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) тему. Всю. Целиком. И прислушайся хотя бы к большей части того, что там написано, ибо всё написанное придумано не просто так, а опыт и время показали, что это действительно удобнее и правильнее.

ziggi
30.09.2017, 14:23
Я даже чаем подавился от столь удивительного вопроса...

Эмм, а что тебя удивляет? То, что ты одно имя резервируешь и локально, и глобально, а потом заставляешь Pawn каким-то образом определять к какому именно имени ты обращаешься? Это то же самое, что и если бы помимо тебя в семье было 10 детей и всех вас назвали "Петя", а потом мама каждый раз кричала: "Петя, подойди ко мне".

Почитай вот эту (http://pro-pawn.ru/showthread.php?8347-%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5-%D1%80%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) тему. Всю. Целиком. И прислушайся хотя бы к большей части того, что там написано, ибо всё написанное придумано не просто так, а опыт и время показали, что это действительно удобнее и правильнее.

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

Просто enum выглядит как struct из C, поэтому это и вызывает подобные вопросы. Кстати, в Pawn 4.0 от этого синтаксиса избавились, думаю, что как-раз из-за подобных непоняток.

Daniel_Cortez
30.09.2017, 21:30
Кстати, в Pawn 4.0 от этого синтаксиса избавились, думаю, что как-раз из-за подобных непоняток.
Равно как и "избавились" от возможности указания инкремента для членов перечисления (пример (https://github.com/Open-GTO/sa-mp-fixes/blob/77467d6fabc4420cfeaa0939a57b2317ce7d6e74/fixes.inc#L2773)). Такое себе решение. -_-

Вообще, ИМХО, Pawn 4.0 - отнюдь не самый лучший пример для подражания, ибо там ещё много таких "улучшений". Например, чем можно оправдать замену разделителя для чисел со знака "_" на " ' " ? (т.е., к примеру, вместо "1_000_000_000" нужно писать "1'000'000'000" - при этом если в редакторе кода используется подсветка синтаксиса для C++, он буквально начинает сходить с ума, подсвечивая весь последующий код как незавершённую строку)

Что касается коллизии имён между членами перечисления и переменными, нужно просто с умом подходить к именованию первых. Например, к именам членов enum можно добавить префикс, который, в свою очередь, можно получить из названия enum.
Пример:


enum e_PlayerInfo // "Player Info" ==> "pi" или "p", как удобнее.
{
pID,
pLevel,
pMoney,
/* ... */
};

Bib
05.10.2017, 18:32
Спасибо всем. Буду так и делать




enum e_PlayerInfo // "Player Info" ==> "pi" или "p", как удобнее.
{
pID,
pLevel,
pMoney,
/* ... */
};