Автор | Сообщение |
|
| |
Пост N: 3506
Зарегистрирован: 17.05.05
|
|
Отправлено: 03.09.13 13:14. Заголовок: Сравнить массивы
Где то вроде была тема но не найду Нужно сравнить массивы чем проще тем лучше Вот такой фокус не работает. a:={{23,.f.},{345,.t.}} b:={{23,.f.},{345,.t.}} ? a==b // .f.
|
|
|
Ответов - 6
[только новые]
|
|
|
| Администратор
|
Пост N: 2972
Зарегистрирован: 23.05.05
|
|
Отправлено: 03.09.13 13:48. Заголовок: Надо сравнивать поэл..
Надо сравнивать поэлементно. Можно с использованием рекурсии Примерно так: 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
|
|
|
|
| |
Пост N: 3507
Зарегистрирован: 17.05.05
|
|
Отправлено: 03.09.13 13:52. Заголовок: Так и думал. Спасибо..
Так и думал. Спасибо. Считал есть что то уже готовое в Harbour.
|
|
|
|
| Администратор
|
Пост N: 2973
Зарегистрирован: 23.05.05
|
|
Отправлено: 03.09.13 13:58. Заголовок: Харбор сравнивает сс..
Харбор сравнивает ссылки на массивы. Т.е Local a1 := {...} Local a2 := a1 ? a1 == a2 вернет .t. в остальных случаях - .f.
|
|
|
|
| |
Пост N: 262
Зарегистрирован: 08.07.06
|
|
Отправлено: 03.09.13 16:20. Заголовок: Dima пишет: a:={{23..
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). -- Другой способ: у меня есть пара функций "сворачивания" массива в строку и "разворачивания" обратно. Работает с вложенными массивами без вопросов. Когда-то нужен был способ сохранения массива в файл. Если речь идет о небольших массивах - сравнить две строки, результаты их преобразования.
|
|
|
|
| |
Пост N: 3509
Зарегистрирован: 17.05.05
|
|
Отправлено: 03.09.13 16:28. Заголовок: Sergy пишет: Когда-..
Sergy пишет: цитата: | Когда-то нужен был способ сохранения массива в файл |
| Да есть такой способ FT_SAVEARR(FT_RESTARR) В принципе для этой задачи мне бы хватило и что то типа HB_ArrayId , но это не то конечно так как Pid будет разный даже если массивы одинаковы.
|
|
|
|
| |
Пост N: 3511
Зарегистрирован: 17.05.05
|
|
Отправлено: 03.09.13 17:53. Заголовок: Вот так вот работает..
Вот так вот работает (сравнение строк идет) proc main a:={{23,.f.},{345,.t.}} b:={{23,.f.},{345,.t.}} ? ValToPrgExp(a)==ValToPrgExp(b) //.t. return
|
|
|
|