Форум » [x]Harbour » Я не знаю, это баг и.. » Ответить

Я не знаю, это баг и..

nick_mi: Я не знаю, это баг или фича, первый раз столкнулся. Если я создаю массив (AR1) с какими-то данными,затем добавляю этот массив в другой AR0, по Aadd (), и в первом массиве выполняю какие-то действия, то все действия с AR1 автоматически отображаются в AR0. Ниже приведен текст небольшой тестовой программы [more] function main () local ar0 := {} local ar1 := {} hb_CodePage_RU1251() HB_CDPSELECT("RU1251") clear screen For i := 1 to 10 aadd (ar1, i) next aadd (ar0,ar1) nmax := -10000 For i := 1 to 10 nmax := max(ar0[ 1,i ] , nmax) next @ 5, 1 say "nmax до модификации Ar1 " + str (nmax,3) For i := 1 to 10 ar1[ i ] := ar1[ i ] - 20 next nmax := -10000 For i := 1 to 10 nmax := max(ar0[ 1,i ] , nmax) next @ 6, 1 say "nmax после модификации Ar1 " + str (nmax,3) @ 8, 1 say "len(ar0[1]) до Asize(Ar1)= " + str (len(ar0[ 1 ]),3 ) asize (ar1, 0) @ 9, 1 say "len(ar0[1]) после Asize(ar1,0)= " + str (len(ar0[ 1 ]),3 ) inkey (0) [/more]

Ответов - 7

petr707: Вроде всегда так было. Ar2:=Aclone(ar1) решает вопрос - размещает новый массив в другой области

Haz: это фича. со времен клиппер все массивы передаются по ссылке. Чтобы их разделить если критично-передавать надо клон массива используя Aclone (AR1)

nick_mi: Я понимаю, что массивы передаются по ссылке, но это в функцию. Aclone тоже понятно, если мне нужно просто реплицировать то можно было воспользоваться . В примере я не показал, но в реальной работе мне нужно было в основной массив добавить несколько массивов, получить многомерный массив и отдать в его работу. Чтобы не строить полноценную тестовую систему, я решил взять один масив, и изменяя его элементы, добавить в основной несколько раз и отдать в работу. Ну и получил описанную ситуацию. На мой взгляд не совсем правильно в этом случае, но имеем то что имеем. Спасибо за участие


PSP: Работа с массивами всегда по ссылке. И так было с древних времен)

Dima: PSP пишет: И так было с древних времен) С этих ? )))

PSP: )))

petr707: Возможно, что и неплохо было обнаружить эту фичу Проблема в том, что aadd (ar0,ar1) означает , что "присоединенная часть "ar0 == ar1, то есть ar0_new==ar0_old+ar1 ".. по ссылке" означает равенство не значений массивов, а их адресов, то есть места в памяти. то есть ar0_new вместо своего расширения (в конец массива) - залез на "чужую территорию" - на ar1 aadd(ar0,aclone(ar1)) - как раз расширяет ar0 значениями из ar1, оставляя ar1 несвязанным с ar0 общим размещением. Сорри, если не стало яснее.



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