PDA

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



Morj
13.03.2016, 05:17
Здравствуйте пользователи и не пользователи pro-pawn!
Мне было нечего делать и пришла в голову "веселая идея :sarcastic:", я решил сделать команду на вычисление веса. Нужно знать объем грудной клетки и рост, что бы вычислить свой вес. Я конечно понимаю что это никому не нужно на сервере по сути, но прикольно :lol:
Код с использованием DC_CMD(Можно ZCMD) и sscanf2:


CMD:massa(playerid, params[]) //Команда
{
new massa[18]; //Переменная с подсчетом символов!
if(sscanf(params, "dd", params[0],params[1])) return SendClientMessage(playerid, -1, "Введите: /massa [Рост] [Объем грудной клетки]"); //Если игрок ввел команду не правильно, выводим ему сообщение
format(massa, 17, "Вес = %d", params[0]*params[1]/240); //Формат сообщения massa, формула: [Рост]*[Объем грудной клетки]/[240]
SendClientMessage(playerid, -1, massa); //Выводим сообщение massa
return 1; //Возвращаем
}


Работает!
http://storage4.static.itmages.ru/i/16/0313/h_1457832204_9556271_979e9d43d9.png
Поставьте ништячек(+) если понравилось :)

P.S.
Исправил и сделал так как нужно.

TheMallard
13.03.2016, 08:28
1. Размер строки вычислен без подсчетов.
2. Не требуется переменная massa.
3. Не стоит использовать в sscanf params, лучше объявить переменные.

Morj
13.03.2016, 09:44
1. Размер строки вычислен без подсчетов.
2. Не требуется переменная massa.
3. Не стоит использовать в sscanf params, лучше объявить переменные.

1.Ничего страшного не произойдет, если ты потеряешь 2-3 байта(Иди это рассказывай Daniel_Cortez, он же вас научил считать символы).
2.Переменная нужна, если ты нашел вариант лучше, поправь и выложи как по твоему должно быть.
3.Мне захотелось использовать sscanf, как хочу так и делаю.

BadPawn
13.03.2016, 10:14
CMD:massa(playerid, params[])
{
new
massa_string[21],
growth,
volume;

if(sscanf(params, "ii", growth, volume))
return SendClientMessage(playerid, -1,
!"Введите: /massa [Рост] [Объем грудной клетки]");

format(massa_string, sizeof massa_string, "Вес = %i кг", growth*volume/240);
SendClientMessage(playerid, -1, massa_string);
return 1;
}

Результат проверки (http://s48.radikal.ru/i119/1603/2e/38df9a827364.png)

Мне интересно, сколько символов используется из твоего стринга? 10? Поставил 25, ибо поленился считать.

stringer[65] вообще не используется.

Глобальная переменная масса для какой цели, не используемая в дальнейшем? В формат напрямую полученное число записываем и выводим.

DeimoS
13.03.2016, 10:45
И зачем это в разделе с мануалами, если тут всего одна команда? А размер массива достаточно выставить на 21 (9 ячеек - строка без спецификатора + 11 ячеек на число + 1 ячейка на нуль-символ)

[ForD]
13.03.2016, 17:55
как хочу так и делаю.

Простите,но вы не на том форуме.

Иван Бубнов
13.03.2016, 20:56
CMD:massa(playerid, params[])
{
if(sscanf(params, "fd", params[0], params[1]))
return SendClientMessage(playerid, -1, !"Введите: /massa [Рост] [Объем грудной клетки]");
if(!(1.0 <= params[0] <= 3.0))
return SendClientMessage(playerid, -1, !"Рост может быть от 1.0 до 3.0 метров !");
if(!(1 <= params[1] <= 100))
return SendClientMessage(playerid, -1, !"Неверное значение грудных клеток");
new
str[12+1];
format(string, sizeof(string), "Ваш вес: %d кг", (params[0] * params[1]) / 240);
Ваш вес: 999 кг

SendClientMessage(playerid, -1, string);
return 1;
}

Morj
14.03.2016, 01:55
1.Для каждого человека будет казаться лучшим вариантом его скрипт. Если вам что то не нравится, переделайте по своему, я просто привел пример.
2.Почему я не сделал переменную massa локальной? А вы еще придерались ко мне за байты, глобальная переменная занимает меньше байт чем локальная.
3.С массивами строки вы уже перегибаете палку, не стоит так жадничать(У вас этих байт достаточно много).
4.Я не собираюсь писать так как мне говорят "опытные гуру", я напишу так как мне это будет лучше и выгодней.
5.Хорошо, я признаю свою ошибку, можно было и без переменной massa написать, я над этим не задумывался. Остальное что вы мне рассказали - хлам(Подсчеты строки и т.п.).

$continue$
14.03.2016, 02:16
Вы реально ошиблись, тредом, порталом.

1.Для каждого человека будет казаться лучшим вариантом его скрипт. Если вам что то не нравится, переделайте по своему, я просто привел пример.
2.Почему я не сделал переменную massa локальной? А вы еще придерались ко мне за байты, глобальная переменная занимает меньше байт чем локальная.
3.С массивами строки вы уже перегибаете палку, не стоит так жадничать(У вас этих байт достаточно много).
4.Я не собираюсь писать так как мне говорят "опытные гуру", я напишу так как мне это будет лучше и выгодней.
5.Хорошо, я признаю свою ошибку, можно было и без переменной massa написать, я над этим не задумывался. Остальное что вы мне рассказали - хлам(Подсчеты строки и т.п.).

DeimoS
14.03.2016, 08:41
1.Для каждого человека будет казаться лучшим вариантом его скрипт. Если вам что то не нравится, переделайте по своему, я просто привел пример.
"Мануал" происходит от английского "Manual", что в переводе означает "Руководство" (Руководство по эксплуатации). В случае с Pawn, мануал подразумевает под собой готовый код, который либо не нужно редактировать вообще, либо в этом мануале указано какой код, возможно, придётся отредактировать, если в системе задействованы какие-то сторонние переменные (ник игрока/уровень и т.п.). Так что твоё "просто привёл пример" тут никому не нужно. С таким прямиком на п-и.


2.Почему я не сделал переменную massa локальной? А вы еще придерались ко мне за байты, глобальная переменная занимает меньше байт чем локальная.

А вот с этого момента поподробнее. Где вы такое вычитали? Можно предоставить пруфы вашим словам?


3.С массивами строки вы уже перегибаете палку, не стоит так жадничать(У вас этих байт достаточно много).

Ну тогда выделил бы сразу 5000 ячеек. Чего жадничать то? Только потом не ходи по форумам и не ной о том, что у тебя в моде вдруг неожиданно получился выход за пределы массива и всё начало работать неправильно.


4.Я не собираюсь писать так как мне говорят "опытные гуру", я напишу так как мне это будет лучше и выгодней.

Ну тогда зачем ты ходишь в туалет? Срал бы в штаны, ведь чисто технически это выгодней, ибо не нужно совершать лишних шагов до туалета, да ещё и штаны снимать. Или срать в штаны для тебя не является нормой, а срать в своём коде - является?
Да и зачем было выкладывать свой код, если ты так реагируешь на критику? Критика уместная и стоило бы к ней прислушаться, а не строить из себя умника, пытаясь обосновать свой кривой код.


5.Хорошо, я признаю свою ошибку, можно было и без переменной massa написать, я над этим не задумывался. Остальное что вы мне рассказали - хлам(Подсчеты строки и т.п.).

Ну, опять же, не ходи и не ной потом по форумам о том, что у тебя в моде вдруг всё начало работать не так, окей? Ведь тебе же не страшно переполнение стэка или коллизия стека/кучи, когда вдруг сегмент стэка вдруг начинает "находить" на сегмент кучи. Сам потом с крашами разбирайся, хорошо?

Morj
14.03.2016, 15:27
"Мануал" происходит от английского "Manual", что в переводе означает "Руководство" (Руководство по эксплуатации). В случае с Pawn, мануал подразумевает под собой готовый код, который либо не нужно редактировать вообще, либо в этом мануале указано какой код, возможно, придётся отредактировать, если в системе задействованы какие-то сторонние переменные (ник игрока/уровень и т.п.). Так что твоё "просто привёл пример" тут никому не нужно. С таким прямиком на п-и.
Вот идеальный вариант:


CMD:massa(playerid, params[])
{
new massa[18];
if(sscanf(params, "dd", params[0],params[1])) return SendClientMessage(playerid, -1, "Введите: /massa [Рост] [Объем грудной клетки]");
format(massa, 17, "Вес = %d", params[0]*params[1]/240);
SendClientMessage(playerid, -1, massa);
return 1;
}




А вот с этого момента поподробнее. Где вы такое вычитали? Можно предоставить пруфы вашим словам?

Проверьте сами, это действительно так и есть!



Ну тогда выделил бы сразу 5000 ячеек. Чего жадничать то? Только потом не ходи по форумам и не ной о том, что у тебя в моде вдруг неожиданно получился выход за пределы массива и всё начало работать неправильно.

Я превысил совсем чуть-чуть, из за этого ничего страшного бы не произошло(Я не выделял 5000 ячеек).



Ну тогда зачем ты ходишь в туалет? Срал бы в штаны, ведь чисто технически это выгодней, ибо не нужно совершать лишних шагов до туалета, да ещё и штаны снимать. Или срать в штаны для тебя не является нормой, а срать в своём коде - является?
Да и зачем было выкладывать свой код, если ты так реагируешь на критику? Критика уместная и стоило бы к ней прислушаться, а не строить из себя умника, пытаясь обосновать свой кривой код.

То есть, по твоему, думать своими мозгами - это плохо, да? Я прислушиваюсь только к тому, что мне кажется действительно лучшим вариантом, но выделять под каждую строку правильное кол-во ячеек(С ума сойти можно, если так писать мод) - это уже слишком, выделил примерно сколько тебе нужно и все(Не 5000).



Ну, опять же, не ходи и не ной потом по форумам о том, что у тебя в моде вдруг всё начало работать не так, окей? Ведь тебе же не страшно переполнение стэка или коллизия стека/кучи, когда вдруг сегмент стэка вдруг начинает "находить" на сегмент кучи. Сам потом с крашами разбирайся, хорошо?

Ну, опять же, я не переполнил прям на 5000, я чуть-чуть переполнил, ибо писал примерное значение. Выше вариант лучше!

P.S.
И вообще, я выложил эту команду, потому что такого никогда не видел на порталах. Однообразные темы надоели уже(Пример: Как сделать бонус и т.п.).

Иван Бубнов
14.03.2016, 15:29
Ахахахаха, ару


Вот идеальный вариант:


CMD:massa(playerid, params[])
{
new massa[18];
if(sscanf(params, "dd", params[0],params[1])) return SendClientMessage(playerid, -1, "Введите: /massa [Рост] [Объем грудной клетки]");
format(massa, 17, "Вес = %d", params[0]*params[1]/240);
SendClientMessage(playerid, -1, massa);
return 1;
}

Morj
14.03.2016, 15:34
Ахахахаха, ару


CMD:massa(playerid, params[])
{
if(sscanf(params, "fd", params[0], params[1]))
return SendClientMessage(playerid, -1, !"Введите: /massa [Рост] [Объем грудной клетки]");
if(!(1.0 <= params[0] <= 3.0))
return SendClientMessage(playerid, -1, !"Рост может быть от 1.0 до 3.0 метров !");
if(!(1 <= params[1] <= 100))
return SendClientMessage(playerid, -1, !"Неверное значение грудных клеток");
new
str[12+1];
format(string, sizeof(string), "Ваш вес: %d кг", (params[0] * params[1]) / 240);
Ваш вес: 999 кг

SendClientMessage(playerid, -1, string);
return 1;
}
Это не лучше.

Иван Бубнов
14.03.2016, 15:37
Почему я не могу перестать орать?


CMD:massa(playerid, params[])
{
if(sscanf(params, "fd", params[0], params[1]))
return SendClientMessage(playerid, -1, !"Введите: /massa [Рост] [Объем грудной клетки]");
if(!(1.0 <= params[0] <= 3.0))
return SendClientMessage(playerid, -1, !"Рост может быть от 1.0 до 3.0 метров !");
if(!(1 <= params[1] <= 100))
return SendClientMessage(playerid, -1, !"Неверное значение грудных клеток");
new
str[12+1];
format(string, sizeof(string), "Ваш вес: %d кг", (params[0] * params[1]) / 240);
Ваш вес: 999 кг

SendClientMessage(playerid, -1, string);
return 1;
}
Это не лучше.

DeimoS
14.03.2016, 17:18
Проверьте сами, это действительно так и есть!

Проверил и это далеко не так. Всё же предоставь хоть какой-то пруф к своим словам.


Я превысил совсем чуть-чуть, из за этого ничего страшного бы не произошло(Я не выделял 5000 ячеек).

Чуть-чуть превысил тут, чуть-чуть превысил там и, в итоге, набежало переполнение стэка...


То есть, по твоему, думать своими мозгами - это плохо, да? Я прислушиваюсь только к тому, что мне кажется действительно лучшим вариантом, но выделять под каждую строку правильное кол-во ячеек(С ума сойти можно, если так писать мод) - это уже слишком, выделил примерно сколько тебе нужно и все(Не 5000).

Быть упёртым бараном - плохо. Если тебе говорят о чём-то и, при этом, приводят доказательства обоснования своих слов, не верить этому, как минимум, очень глупо. Если бы все так же, как ты, "думали своими мозгами", мы бы до сих пор прыгали в пещерах друг на друга и мычали что-то несуразное себе под нос, ведь зачем слушать кого-то, когда ты сам лучше знаешь!?



И вообще, я выложил эту команду, потому что такого никогда не видел на порталах. Однообразные темы надоели уже(Пример: Как сделать бонус и т.п.).

Так никто не против, выкладывай. Только в нужный раздел и, при этом, учтя все пожелания того комьюнити, которому ты пытаешься свой код впарить. Тогда и тебя все будут уважать, и ты свой профит получишь

Morj
14.03.2016, 18:59
Проверил и это далеко не так. Всё же предоставь хоть какой-то пруф к своим словам.
Мне лень, когда то создавали даже тему по поводу глобальных и локальных переменных(Правда на ги), если мыслить чисто логически, оно так и должно быть.

DeimoS
14.03.2016, 19:17
Мне лень, когда то создавали даже тему по поводу глобальных и локальных переменных(Правда на ги), если мыслить чисто логически, оно так и должно быть.

Ну ты почаще читай темы на p-i. Любая переменная в Pawn занимает 4 байта (одна ячейка). Ни больше, ни меньше. Не веришь мне - обратись к официальной документации, а не придумывай чепуху и отнекивайся ленью

[ForD]
14.03.2016, 19:37
То есть, по твоему, думать своими мозгами - это плохо, да? Я прислушиваюсь только к тому, что мне кажется действительно лучшим вариантом, но выделять под каждую строку правильное кол-во ячеек(С ума сойти можно, если так писать мод) - это уже слишком, выделил примерно сколько тебе нужно и все(Не 5000).

Pawn задумывался как язык для обучения работы с памятью.

И если вы уж решились выложить код на публику,отбрасывайте свои "фишечки" и привычки,давайте будем подходить к единому правилу написания кода дабы облегчить жизнь всем нам,так-же если вы пишите код исключительно для себя,там абсолютно ваше право как и что писать.