Форум » [x]Harbour » Сравнить массивы » Ответить

Сравнить массивы

Dima: Где то вроде была тема но не найду Нужно сравнить массивы чем проще тем лучше Вот такой фокус не работает. a:={{23,.f.},{345,.t.}} b:={{23,.f.},{345,.t.}} ? a==b // .f.

Ответов - 6

Pasha: Надо сравнивать поэлементно. Можно с использованием рекурсии Примерно так: Function AComp(a1, a2) Local lRet := .t., i if len(a1) == len(a2) for i := 1 to len(a1) if ValType(a1[ i ]) = 'A' .and. ValType(a2[ i ]) = 'A' if ! AComp(a1[ i ], a2[ i ]) lRet := .f. exit endif elseif ! (a1[ i] == a2[ i ]) lRet := .f. exit endif next else lRet := .f. endif Return lRet

Dima: Так и думал. Спасибо. Считал есть что то уже готовое в Harbour.

Pasha: Харбор сравнивает ссылки на массивы. Т.е Local a1 := {...} Local a2 := a1 ? a1 == a2 вернет .t. в остальных случаях - .f.


Sergy: Dima пишет: a:={{23,.f.},{345,.t.}} b:={{23,.f.},{345,.t.}} ? a==b // .f. В данном случае - это сравнение адресов. Это идет еще из Clipper - все массивы передаются только по ссылкам. 1) Сделать функцию сравнения двух элементов массива. Тк банальное a[1] == b[1] может дать ошибку, если в одном из них дата, а в другом - число. Или еще один массив. 2) Начать со сравнения длин. 3) Если равны - вызвать AEVAL с "безопасной" функцией (1) 4) Если сравниваемые элементы являются массивам - вызвать рекурсивно (3). -- Другой способ: у меня есть пара функций "сворачивания" массива в строку и "разворачивания" обратно. Работает с вложенными массивами без вопросов. Когда-то нужен был способ сохранения массива в файл. Если речь идет о небольших массивах - сравнить две строки, результаты их преобразования.

Dima: Sergy пишет: Когда-то нужен был способ сохранения массива в файл Да есть такой способ FT_SAVEARR(FT_RESTARR) В принципе для этой задачи мне бы хватило и что то типа HB_ArrayId , но это не то конечно так как Pid будет разный даже если массивы одинаковы.

Dima: Вот так вот работает (сравнение строк идет) [pre2] proc main a:={{23,.f.},{345,.t.}} b:={{23,.f.},{345,.t.}} ? ValToPrgExp(a)==ValToPrgExp(b) //.t. return [/pre2]



полная версия страницы