+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
istem 18.12.2010 09:32 # +1
Xander_Bass 18.12.2010 17:44 # −1
MessageBox(Handle,'EQUAL!','Debug',MB_OK );
gegMOPO4 18.12.2010 11:31 # +2
komprenda 18.12.2010 13:28 # −14
eth0 18.12.2010 14:20 # +1
ctm 20.12.2010 18:13 # +1
inkanus-gray 18.12.2010 15:21 # +2
А ещё я никогда не любил оператор <> в заголовке цикла. Скажите честно, c может быть больше XD.DocumentElement.ChildNodes.Count? Если бы было записано , то и ошибки бы не было. Более того, неравенство вместо <> в некоторых программах предотвращает зацикливание.
Xander_Bass 18.12.2010 17:42 # −1
bugmenot 18.12.2010 20:35 # 0
TarasB 18.12.2010 20:43 # 0
inkanus-gray 18.12.2010 20:55 # −2
TarasB 18.12.2010 20:58 # +2
Oleg_quadro 20.12.2010 18:25 # 0
в хроме нормально смотрится.
bugmenot 20.12.2010 19:14 # 0
логично предположить, что там рядом Internet Explorer 5.5
bugmenot 18.12.2010 21:10 # 0
guest 18.12.2010 23:04 # 0
bugmenot 18.12.2010 21:05 # +3
керниганопоклонство до добра не доведет, я уже предупреждал
а вообще, я не про форматирование, а про
12 орехов > 20 зерен риса
Xander_Bass 19.12.2010 08:59 # 0
bugmenot 19.12.2010 09:35 # +4
А стильно в оригинале использование цикла не по назначению с соответственными выкрутасами для управления им и чтение неинициализированных переменных. Что значит "кому как"? Это -- говно-с.
inkanus-gray 19.12.2010 17:23 # +1
Рефакторинг лаконичен, даже хочется несколько плюсов поставить. действовала как break.
bugmenot 19.12.2010 18:06 # 0
а не бросилось потому что у него идентификаторы больше похожи на смайлики
qbasic 20.12.2010 13:11 # +2
Xander_Bass 14.01.2011 07:34 # 0
Xander_Bass 14.01.2011 07:46 # 0