Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

оператор case [D6, WinXP]


PIF ©   (2005-06-30 13:45:00) 

Здравствуйте! Скажите пожалуйста как правильно записать следующий код:
case volum of
0.025: error_V:=0.1;
0.05: error_V:=0.1;
0.1: error_V:=0.2;
0.2: error_V:=0.2;
0.25: error_V:=0.2;
0.5: error_V:=0.3;
1: error_V:=0.6;
else error_v:=0;
end;
Выдает ошибку:
[Error] Unit1.pas(569): Ordinal type required
[Error] Unit1.pas(570): Incompatible types: 'Integer' and 'Extended'


Kolan   (2005-06-30 14:04:00) [1]


> мне эту конструкцию в нескольких местах

Для этого есть функции.


ferr   (2005-06-30 14:04:00) [2]

case CaseDouble(vol,[0.025,0.05,0.1,0.2,0.25,0.5,0.1]) of
 1: error_V:=0.1;
 2: error_V:=0.1;
 3: error_V:=0.2;
 4: error_V:=0.2;
 5: error_V:=0.2;
 6: error_V:=0.3;
 7: error_V:=0.6;
 else error_v:=0;
 end;


ferr   (2005-06-30 13:56:00) [3]

Для конкретного случая [4], иначе [5].


PIF   (2005-06-30 13:54:00) [4]

через if'ы очень громоздко получается, т.к. мне эту конструкцию в нескольких местах кода нужно применять, нельзя ли каким-нибудь другим способом


dolmat   (2005-06-30 13:53:00) [5]

case round(volum*1000) of ьщжет и выход?


Digitman   (2005-06-30 13:52:00) [6]

case Round(volum * 1000) of
25: error_V:=0.1;
50: error_V:=0.1;
100: error_V:=0.2;
200: error_V:=0.2;
250: error_V:=0.2;
500: error_V:=0.3;
1000: error_V:=0.6;
else error_v:=0;
end;


ferr   (2005-06-30 13:52:00) [7]

function CaseDouble(const a:double;const d:array of double):integer;
var
 i:integer;
begin
 Result:=0;
 for i:=Low(d) to High(d) do
   if Abs(d[i]-a)<0.0000000001 then
   begin
     Result:=i+1;
     break;
   end;
end;

begin
 writeln(CaseDouble(2.5,[1,2.5,3]));
 readln;


begin...end   (2005-06-30 13:51:00) [8]

И ещё. Если volum -- это вещественное число (с плавающей запятой), то его (если оно не может быть представлено в виде конечной двоичной дроби) следует проверять на равенство вещественной константе с учётом возможной погрешности.


Просто Джо   (2005-06-30 13:51:00) [9]

Оператор case позволяет использовать только целочисленные и приводимые к ним значения. Придется переделать в if then else. Ну, это если "без извратов".


begin...end   (2005-06-30 13:48:00) [10]

Поскольку volum не является переменной порядкового типа, case надо заменить на if'ы.


Наверх

Титульная страница Поиск, карта сайта Написать письмо