PDA

Просмотр полной версии : [Вопрос] Switch по тексту, или способы перебора значений[].



BadPawn
27.07.2016, 04:07
Привет всем.


switch(/*переменная*/)
{
case 'm':{}
case 'mm':{}//тут ошибка
}

Примером послужит С#. Работа с датой на высшем уровне.
В моде хотелось бы делать так:
GetDate("m");//вывод порядкового номера месяца
GetDate("mm");//вывод месяца словом

VVWVV
27.07.2016, 05:44
Вам, как минимум, необходимо использовать строку (строковый литерал), ибо ординарные кавычки исключительно для одного символа (символьный литерал).
Впрочем, ваш алгоритм не сработает, ведь используется строка. Вы можете использовать разнообразные функции для работы со строками (strcmp).

BadPawn
27.07.2016, 06:46
Кому не сложно, покажите пример использование любой функции, в которой будет итог зависеть от введенных данных.

vovandolg
27.07.2016, 14:19
new pName[25];

GetPlayerName(playerid, pName, 25);

if(strcmp(pName, "Jeims_Bond",true) == 0)
{
print("Джеймс Бонд авторизовался =3");
}

Desulaid
27.07.2016, 14:25
Можно так работать


new string[3] = "mm";
for (new i; i < sizeof(string); i++)
{
if (string[i] == 'm' && string[i + 1] == 'm')
{
print("Да, есть здесь \"mm\"");
}
}

Daniel_Cortez
27.07.2016, 15:00
ИМХО, идеальный вариант: http://pro-pawn.ru/showthread.php?7923
Пример: http://pro-pawn.ru/showthread.php?7925
Принцип работы: во время компиляции из строки вычисляется хеш, который можно использовать в switch. Как по читаемости кода, так и по производительности это куда лучше, чем куча вызовов strcmp или посимвольное сравнение.

BadPawn
01.08.2016, 08:13
Вопрос скорее к DC.


stock GetDate(const string[])
{
switch(YHash(string, true, hash_fnv1))
{
case _I@f<m>:
{
static const months_text[12][9] =
{
"Январь",
"Февраль",
"Март",
"Апрель",
"Май",
"Июнь",
"Июль",
"Август",
"Сентябрь",
"Октябрь",
"Ноябрь",
"Декабрь"
};
static month;
getdate(_, month, _);
printf("месяц: %s", months_text[month-1]);
return 1;
}
}
return 1;
}

Проверочный код. Все работает. Как вернуть значение в case?

format(str, sizeof str, "%s", GetDate("m"));

$continue$
01.08.2016, 17:04
А, зачем ещё 1 switch? Просто вернуть уже результат (порядковый номер или название месяца)
У меня, кроме как привести "типы" данных к одному виду, ничего в голову не пришло.
Пример использования:


main()
{
new buffer[9];
new result = GetDate("m", buffer);
if(result == -1)
{
printf("Порядковый номер месяца: %s", buffer);
}
else if(result == 0)
{
printf("Название месяца: %s", buffer);
}
}

Сама функция:


stock GetDate(const string[], output[], size = sizeof(output))
{
static month;
getdate(_, month, _);
switch(YHash(string, false, hash_fnv1))
{
case _I@f<m>:
{
valstr(output, month);
return -1;
}
case _I@f<mm>:
{
static const months_text[12][9] =
{
"январь",
"февраль",
"март",
"апрель",
"май",
"июнь",
"июль",
"август",
"сентябрь",
"октябрь",
"ноябрь",
"декабрь"
};
strins(output, months_text[month-1], 0, size);
return 0;
}
}
return 1;
}


P.S: Костыли в деле :)

BadPawn
16.08.2016, 16:31
Пацаны, что-то не корректно работает. ((

Сегодня 16 число.

printf("до: %i", d);// итог: 16
valstr(output, d);
printf("после: %i", output);// итог: 49


main()
{
new buff[9];
printf("%i", GetDate("d", buff));// итог: 0
}

И постоянно пишет варнинг:

warning 203: symbol is never used: "maxlength"

Криво робит valstr, или в чем проблема? Подскажите пожалуйста. В тупике.

А, что делать с maxlength и варнингом - хз. о-о (убрать если только:))

Desulaid
16.08.2016, 16:42
Пацаны, что-то не корректно работает. ((

Сегодня 16 число.

printf("до: %i", d);// итог: 16
valstr(output, d);
printf("после: %i", output);// итог: 49



Потому что строку надо брать не %i, а %s.



И постоянно пишет варнинг:

warning 203: symbol is never used: "maxlength"

Криво робит valstr, или в чем проблема? Подскажите пожалуйста. В тупике.

А, что делать с maxlength и варнингом - хз. о-о (убрать если только:))
Похоже, что maxlength у вас - аргумент функции, который вы не используете. Можно использовать #pragma


#pragma unused maxlength

BadPawn
16.08.2016, 17:58
Anton Styazhkin, может есть какие-то предложения по поводу maxlength? Дабы в воздухе не висело.

Ииии,

main()
{
new buff[9];
printf("%s", GetDate("d", buff));// итог: 0
}
Не писал такого вида больших функций, поэтому просто в непонимании.
Ставлю %s = пусто
Ставлю %i = 0

Daniel_Cortez
16.08.2016, 18:36
Anton Styazhkin, может есть какие-то предложения по поводу maxlength? Дабы в воздухе не висело.

Ииии,

main()
{
new buff[9];
printf("%s", GetDate("d", buff));// итог: 0
}
Не писал такого вида больших функций, поэтому просто в непонимании.
Ставлю %s = пусто
Ставлю %i = 0
Покажите саму функцию с переменной maxlength. Если она у вас не используется, значит вы, скорее всего, не учитываете размер массива и можете выйти за его пределы.

Desulaid
16.08.2016, 21:08
Не писал такого вида больших функций, поэтому просто в непонимании.
Ставлю %s = пусто
Ставлю %i = 0

Может, потому что строка пустая?
А вопрос с отображением цифры решен? И да, покажите объявление maxlength. Сложно что-то впустую сказать.

$continue$
17.08.2016, 02:17
Сомнительно, конечно. Используйте, мою функцию? (которая выше)

BadPawn
17.08.2016, 05:56
stock GetDate(const string[], output[], maxlength = sizeof output)
{
switch(YHash(string, true, hash_fnv1))
{
case _I@f<d>:
{
static d;
getdate(_, _, d);
valstr(output, d);
return 0;
}
}
return 1;
}
Вот сама функция.

Надеюсь на вашу помощь пацаны.

- - - Добавлено - - -

Кхм.. А может то, что статическая переменная и значение не возвращается дальше самой функции, а только в ее пределах? Ибо внутри функции число недели выводится верно, за пределами нет. Проверить возможности нет в данный момент ((((

Desulaid
17.08.2016, 16:25
А может просто взять эту функцию (http://forum.sa-mp.com/showpost.php?p=3696747&postcount=641)? :spiteful:

L0ndl3m
17.08.2016, 16:40
В 2014 писал некий костыль, не очень удобный, но работает.
Минус в том, что при каждом такте цикла выделяется память, а при выходе из цикла удаляется и по новой.
Можно было вынести выделение памяти перед самим циклом, но из-за этого теряется скорость.

Вот, сие творение: тык (http://pro-pawn.ru/showthread.php?7865).

Daniel_Cortez
17.08.2016, 16:52
В 2014 писал некий костыль, не очень удобный, но работает.
Минус в том, что при каждом такте цикла выделяется память, а при выходе из цикла удаляется и по новой.
Можно было вынести выделение памяти перед самим циклом, но из-за этого теряется скорость.

Вот, сие творение: тык (http://pro-pawn.ru/showthread.php?7865).
Он чем-то лучше способов, описанных ранее?

L0ndl3m
17.08.2016, 20:07
Он чем-то лучше способов, описанных ранее?
Удобно, скорее всего.