+113
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
function FUNC(XD: TXMLDocument; L: ShortString): IXMLNode;
var
c: integer;
ln: IXMLNode;
s: ShortString;
begin
c:=0;
while c <> XD.DocumentElement.ChildNodes.Count-1 do
begin
if VarToStr(XD.DocumentElement.ChildNodes[c].Attributes['id']) = L then
begin
ln:=XD.DocumentElement.ChildNodes[c];
c:=XD.DocumentElement.ChildNodes.Count-1
end else
begin
c:=c+1; {DEBUG(VarToStr(XD.DocumentElement.ChildNodes[c].Attributes['id'],L) }
end
end;
result:=ln
end;
К слову о невнимательности и "непримеченных слонах". Итак задачка: перебором найти в наборе данных нужную строку и вернуть в итоговый результате элемент набора данных. Используем код (выше). По невнимательности своей я допустил в алгоритме ошибку и функция работала несколько некорректно. Перед Вами её изначальный вариант, до исправления. Если вкратце, то баг заключался в том, что функция не читала последний элемент XML-документа. Называется, нефиг было мудрить с алгоритмом. По сути там надо убрать из двух мест "-1". Но пока я докапывался до сути ошибки, я написал тестовую функцию, сравнивающую две строки и выводящую результат сравнения в окно сообщения. Назовём её DEBUG. И... Началось непонятное. Функция выдавала сообщение, значит результаты, как видно по алгоритму, не равны, но она выдавала РАВЕНСТВО! Мозг взрывается, ломаются представления о математике и рациональности вообще!
Запостил:
Xander_Bass,
18 Декабря 2010
MessageBox(Handle,'EQUAL!','Debug',MB_OK );
А ещё я никогда не любил оператор <> в заголовке цикла. Скажите честно, c может быть больше XD.DocumentElement.ChildNodes.Count? Если бы было записано , то и ошибки бы не было. Более того, неравенство вместо <> в некоторых программах предотвращает зацикливание.
в хроме нормально смотрится.
логично предположить, что там рядом Internet Explorer 5.5
керниганопоклонство до добра не доведет, я уже предупреждал
а вообще, я не про форматирование, а про
12 орехов > 20 зерен риса
А стильно в оригинале использование цикла не по назначению с соответственными выкрутасами для управления им и чтение неинициализированных переменных. Что значит "кому как"? Это -- говно-с.
Рефакторинг лаконичен, даже хочется несколько плюсов поставить. действовала как break.
а не бросилось потому что у него идентификаторы больше похожи на смайлики