Вверх ↑
Этот топик читают: Гость
Ответов: 5446
Рейтинг: 323
#1: 2011-09-25 20:26:07 ЛС | профиль | цитата
Как-то не уверен, что это бага (а не фича). Схема:
code_25239.txt

Что ожидается: MessageBox c текстом "-1".
Что получается: индейское народное жилище - "фигвам" называется.
карма: 1

0
файлы: 1code_25239.txt [453B] [248]
Ответов: 3889
Рейтинг: 362
#2: 2011-09-25 20:29:25 ЛС | профиль | цитата
iarspider, массив заполните чем-нибудь.

if (ArrIn = nil) or (ArrIn._Count = 0) then exit;
карма: 1

0
Ответов: 5446
Рейтинг: 323
#3: 2011-09-25 20:30:05 ЛС | профиль | цитата
1nd1g0, именно в том и дело, что массив может быть пустым. Я делаю map(Real -> String) на RealArray и StrList, и изначально у меня пустой массив. Вешать ещё одну проверку снаружи не хочется

За что такая дискриминация пустого массива - неизвестно. Предлагаю изменить код так:
procedure THIArrayFind._work_doFind2;
var
i, idx: integer;
r: real;
dt: TData;
begin
ArrIn := ReadArray(_data_Array);
- if (ArrIn = nil) or (ArrIn._Count = 0) then exit;
+ if (ArrIn = nil) then exit;
+ ItemIdx := -1;
+ if (ArrIn._Count <> 0) then
+ begin
idx := ReadInteger(_Data, _data_Index, _prop_Index);
dt := ReadData(_Data, _data_Value, @_prop_Value);
if idx < 0 then exit;

r := ToReal(dt);
- ItemIdx := -1;
for i := idx to ArrIn._Count - 1 do
if (r = ToReal(GetArrayVal(i))) then
begin
ItemIdx := i;
break;
end;
+ end;
_hi_CreateEvent(_Data, @_event_onFind, ItemIdx);
end;

карма: 1

0
Ответов: 3889
Рейтинг: 362
#4: 2011-09-25 20:34:41 ЛС | профиль | цитата
В принципе, само существование неинициализированного массива может кого-то запутать. Видимо, подразумевалось, что схема должна работать только когда существуют данные, автореагирование на их появление своего рода, если они поступают извне.
карма: 1

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#5: 2011-09-25 20:39:51 ЛС | профиль | цитата
iarspider писал(а):
Предлагаю изменить код так:

Проще на вещи смотреть надо



procedure THIArrayFind._work_doFind2;
var
i, idx: integer;
r: real;
dt: TData;
begin
ItemIdx := -1;
TRY
ArrIn := ReadArray(_data_Array);
if (ArrIn = nil) or (ArrIn._Count = 0) then exit;
idx := ReadInteger(_Data, _data_Index, _prop_Index);
dt := ReadData(_Data, _data_Value, @_prop_Value);
if idx < 0 then exit;

r := ToReal(dt);
for i := idx to ArrIn._Count - 1 do
if (r = ToReal(GetArrayVal(i))) then
begin
ItemIdx := i;
break;
end;
FINALLY
_hi_CreateEvent(_Data, @_event_onFind, ItemIdx);
END;
end;
карма: 22

0
Ответов: 5446
Рейтинг: 323
#6: 2011-09-25 20:52:59 ЛС | профиль | цитата
nesco, а теперь при idx < 0 или неподключенном массиве (ArrIn = nil) тоже будет событие. Это не сильно нарушит обратную совместимость?
карма: 1

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#7: 2011-09-25 21:10:41 ЛС | профиль | цитата
iarspider писал(а):
а теперь при idx < 0 или неподключенном массиве (ArrIn = nil) тоже будет событие. Это не сильно нарушит обратную совместимость?

Я сомневаюсь, что кто-то это использовал раньше -- при idx < 0 сам Бог велел выдать -1, a Array = nil может быть только при неподключенном массиве, то же самое, что "ничего в массиве нет"
------------ Дoбавленo в 21.10:
Хотя, может и не стоит это делать
карма: 22

0
Ответов: 5446
Рейтинг: 323
#8: 2011-09-25 21:11:12 ЛС | профиль | цитата
nesco, согласен (что надо сделать). Предлагаю на SVN внести твою правку - внесёшь?
карма: 1

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#9: 2011-09-25 21:14:08 ЛС | профиль | цитата
iarspider, мне кажется, что что-то не совсем то в таком решении, особенно, если работа с числами, ведь среди них может быть и -1
карма: 22

0
Ответов: 5446
Рейтинг: 323
#10: 2011-09-25 21:18:11 ЛС | профиль | цитата
nesco, что-то ты запутался походу "-1" будет при любом раскладе нормально искать
карма: 1

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#11: 2011-09-25 21:24:14 ЛС | профиль | цитата
iarspider писал(а):
"-1" будет при любом раскладе нормально искать

Тю, понял, это же индекс ищется. Проехали
------------ Дoбавленo в 21.24:
Исправил
карма: 22

1
Голосовали:iarspider
11
Сообщение
...
Прикрепленные файлы
(файлы не залиты)