forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Основной форум (http://forum.boolean.name/forumdisplay.php?f=49)
-   -   Tips & tricks (Трюки кодинга) (http://forum.boolean.name/showthread.php?t=4828)

odd 22.10.2007 08:59

Tips & tricks (Трюки кодинга)
 
Давайте будем делиться в этом разделе различными хитростями и трюками программирования на MP.

Нестандартное использование оператора repeat
Когда я только начинал кодить на MP меня очень тяготило отсутствие оператора switch, который есть в C. Поэтому, когда нужно было делать множество проверок, то выглядело это так:

if ... then ...
if ... then ...
if ... then ...

Некрасиво, правда? А если таких проверок не один десяток, а то и сотня? Основной недостаток такой конструкции - невозможность отменить дальнейшие проверки если результат уже найден. Тут бы мог спасти оператор goto, но его в MP тоже нет. Но решение этой проблемы есть. Посмотрите нижеприведенный код и вам всё станет ясно:

repeat
if ... then begin ....; break; end;
if ... then begin ....; break; end;
if ... then begin ....; break; end;
until true;

C помощью сочетания repeat until true и break можно добиться и некоего подобия оператора goto т.е. условного/безусловного перехода на метку.

.....
..... // Какой-то код
.....
repeat
.....
..... // Код
.....
if ... then break; // Переход на метку
.....
..... // Код
.....
until true;
..... // Тут типа метка
.....

ViNT 22.10.2007 15:16

Re: Tips & tricks (Трюки кодинга)
 
А если ни одно условие не выполнится?
Программа зависнет.

XenuS 22.10.2007 16:54

Re: Tips & tricks (Трюки кодинга)
 
нет, из-за until true; цикл тока один раз пройдет...

alcoSHoLiK 22.10.2007 19:04

Re: Tips & tricks (Трюки кодинга)
 
А elseif в MP нет?

ViNT 23.10.2007 08:35

Re: Tips & tricks (Трюки кодинга)
 
А что это за оператор? Такого помоему даже в TP нет.

odd 23.10.2007 09:03

Re: Tips & tricks (Трюки кодинга)
 
Цитата:

Сообщение от alcoSHoLiK
А elseif в MP нет?

Нет, нету. Приходится писать так:
if .... then ....
else if .... then ....
else if .... then ....;

Операторы div и mod
Кстати, кто не знал, MP поддерживает операторы div и mod, хоть про них в хелпе ничего не сказано:
mod - остаток от деления, пример:

n := 19 mod 10; // Результат - число 9

div - целочисленное деление, пример:

n := 19 div 10; // Результат - число 1

alcoSHoLiK 23.10.2007 13:14

Re: Tips & tricks (Трюки кодинга)
 
odd
Так если есть esle if, можно с его помощью организовать переключатель. Хотя, конечно, в цикле удобней, так как break можно поставить именно там, где нужно.

MotoMustanger 25.10.2007 22:35

Re: Tips & tricks (Трюки кодинга)
 
Еще для тех кто не знал после if можно ставить два(или больше) условия(но тогда их нужно брать в скобки):
if (i=1) or (j=1) then [код]
(программа выполняет [код] если выполняется либо одно из этих условий, или оба)
if (i=1) xor (j=1) then [код]
(программа выполняет [код] если выполняется ТОЛЬКО ОДНО из этих условий)
if (i=1) and (j=1) then [код]
(программа выполняет [код] если выполняется ОБА условия вместе)
i,j - переменные числового типа
Если хотим написать чтоб данное условие не выполнялось, используем логический оператор not:
if not b then [код]
это то же самое что:
if b=false then [код]
Где b - переменная типа boolean.

Может вам это извесно, но новичкам полезно)

odd 31.10.2007 08:55

Re: Tips & tricks (Трюки кодинга)
 
Ещё один пример использования оператора mod

Допустим, у вас в программе есть меню из 5 пунктов. В переменной cursor хранится текущее положение курсора.
Тогда вы пишите:

key:=GetKeyClicked;
if (key=-60) or (key=-2) then cursor:=cursor+1; // Вниз
if (key=-59) or (key=-1) then cursor:=cursor-1; // Вверх
if cursor<0 then cursor:=5+cursor;
if cursor>4 then cursor:=cursor-5;

можно проще:

key:=GetKeyClicked;
if (key=-60) or (key=-2) then cursor:=(cursor+1) mod 5; // Вниз
if (key=-59) or (key=-1) then cursor:=(cursor+4) mod 5; // Вверх

и всё.

impersonalis 01.11.2007 16:58

Re: Tips & tricks (Трюки кодинга)
 
http://www.boolean.name/showpost.php?p=2893&postcount=2

odd 03.11.2007 09:07

Re: Tips & tricks (Трюки кодинга)
 
Сорри за флуд, не читал того поста.

dimanche13 04.11.2007 00:08

Re: Tips & tricks (Трюки кодинга)
 
http://homepage.ntlworld.com/config/...blecontrol.htm
думаю это тоже подойдет для данной темы

oposum_2000 07.11.2007 01:12

Re: Tips & tricks (Трюки кодинга)
 
Цитата:

Сообщение от odd
можно проще:

key:=GetKeyClicked;
if (key=-60) or (key=-2) then cursor:=(cursor+1) mod 5; // Вниз
if (key=-59) or (key=-1) then cursor:=(cursor+4) mod 5; // Вверх

и всё.

u menea vopros : kakoi kod vypolneaetsea dystree (1 ili 2 ) ?

1. cursor:=(cursor+1) mod 5;

2. cursor:=cursor+1;
if cursor>5 then cursor:=1;

odd 07.11.2007 08:22

Re: Tips & tricks (Трюки кодинга)
 
На самом деле это легко проверить:

Код:

Program TestBool;
Var timer, i, cursor: integer;
Begin
 cursor:=0;
 timer:=GetRelativeTimeMs;
 for i:=0 to 1000000 do
 begin
  cursor:=(cursor+1) mod 5;// Вставляй строчки сюда
 end;
 timer:=GetRelativeTimeMs-timer;
 DrawText(IntegerToString(timer),5,5);
 Repaint; Delay(5000);
End.

У меня результаты такие:
1 ПРИМЕР
Эмулятор Siemens CX65 - 285мс
Эмулятор WTK - 1204мс
Эмулятор NHAL midp2exe - 219мс
2 ПРИМЕР
Эмулятор Siemens CX65 - 310мс
Эмулятор WTK - 1484мс
Эмулятор NHAL midp2exe - 250мс

Так что я был прав. Первый пример и короче и выполняется быстрее.

Eddy 07.11.2007 12:13

Re: Tips & tricks (Трюки кодинга)
 
odd, не факт, надо на мобиле проверять,
раньше сравнивал, что быстрее abs или if на компе поедил один, на мобиле другой.

odd 27.11.2007 08:31

Re: Tips & tricks (Трюки кодинга)
 
Вложений: 2
Для начинающих даю пример работы с дополнительными шрифтами.
В примере:
- Загрузка дополнительного шрифта
- Различные процедуры вывода текста на экран
- 17 различных шрифтов

odd 14.11.2008 03:07

Ответ: Tips & tricks (Трюки кодинга)
 
Вот с таким вопросом столкнулся: А можно ли сделать в формах выпадающий список типа ComboBox?
Оказывается, можно:

PHP код:

Program ComboBox;
Var 
combomalefemalealieninteger;
Begin
 combo
:=FormAddChoice('Ваш пол:'4);
 
male:=ChoiceAppendString(combo'Мужской');
 
female:=ChoiceAppendString(combo'Женский');
 
alien:=ChoiceAppendString(combo'Не определился'); 
 
ShowForm;
 
Delay(50000);
End

Об этом приколе не написано даже в английском хелпе :-D

Cliffe Snake 14.11.2008 05:55

Ответ: Tips & tricks (Трюки кодинга)
 
PHP код:

combo:=FormAddChoice('Ваш пол:'); 

Причём 4 можно заменить на константу:
CH_EXCLUSIVE - можно выбрать токо один элемент
CH_MULTIPLE - выбирай скоко влезет :D

bms2008 14.11.2008 21:33

Ответ: Tips & tricks (Трюки кодинга)
 
Цитата:

Сообщение от Cliffe Snake (Сообщение 90670)
PHP код:

combo:=FormAddChoice('Ваш пол:'); 

Причём 4 можно заменить на константу:
CH_EXCLUSIVE - можно выбрать токо один элемент
CH_MULTIPLE - выбирай скоко влезет :D

Нельзя заменить - получится не combobox, а список radiobutton (CH_EXCLUSIVE) или список CheckBox (CH_MULTIPLE)

Кстати, не знаю как в телефонах, а на КПК в Esmertec Jbed этот комбо не открывается :( ,
хотя в Midlet Manager работает

======
ODD, рулит :super:

abcdef 19.11.2008 09:55

Ответ: Tips & tricks (Трюки кодинга)
 
условные выражения иногда вредно объединять оператором AND, потому что при невыполнении первых условий последующие приведут к ошибке, например: if (i<arraylength) and (m[i]=0) then ... здесь если индекс вне массива второе условие приведет к ошибке. В компиляторах есть опция прекращения сравнения если становится известно что условие ложно. Но MIDletPascal расчитывает полностью, поэтому перепишем так: if (i<arraylength) then if (m[i]=0) then ...

Phantom 19.11.2008 13:38

Ответ: Tips & tricks (Трюки кодинга)
 
abcdef, о_О а я сколько в инете читал, так везде пишут, что во всех языках программирования сделано так, что проверяются условия в порядке записи и если одно из них ложно, то следующие не проверяются. Я это понял ещё до того, как где-то прочитал, в php часто так делал =)

SBJoker 19.11.2008 14:52

Ответ: Tips & tricks (Трюки кодинга)
 
Не во всех языках так сделано... а в некоторых типа с++ и с# можно указывать как проверять всё или сокращенно.

jimon 19.11.2008 16:56

Ответ: Tips & tricks (Трюки кодинга)
 
Phantom_wc
есть полная и краткая проверка логических условий :
полная - проверяются и выполняются все функции заданные в условиях
краткая - проверяются условия по-порядку из записи пока результат не будет очевиден
в некоторых компиляторах можно даже явно указывать какой метод использовать

HolyDel 19.11.2008 17:23

Ответ: Tips & tricks (Трюки кодинга)
 
если перегрузить == в плюсах - то краткая форма работать не будет.


Часовой пояс GMT +4, время: 08:44.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot