powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Иерархия и рекурсия
25 сообщений из 120, страница 4 из 5
Иерархия и рекурсия
    #32509414
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да
в случае
Erase pC
ReDim pC(0 To UBound(pN))
For iC = 0 To UBound(pN)
pC(iC) = pN(iC)
Next iC

можно воспользоваться API функцией rtlMoveMemory (часто используемое подстановочное имя - CopyMemory) ()

Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)

тогда, навскидку, строка будет выглядеть примерно так

CopyMemory pC(0), pN(0), x*(UBound(pN)+1)
где x - количество байт в элементе массива - для инт - 2 для лонга 4

будет работать для любого линейного массива, в том числе для массива строк фиксированной длины.

видимость эффекта на самом деле сильно сависит от длины массива.
Дело в том, что вызов API- функций - относительно дорогая операция и для маленьких массивов эффективность копирования сожрется накладными расходами по вызову

Расходы можно чуть уменьшить , загрузив (в данном случае kernel32) в адресное пространство акцесса - я, правда, так не делаю.
...
Рейтинг: 0 / 0
Иерархия и рекурсия
    #32509424
Sergey_New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 фыыф
1 сек. 5000
5 сек. 5890
далее кол-во не изменяется, цикл продолжается.
Причина не ясна.
...
Рейтинг: 0 / 0
Иерархия и рекурсия
    #32509451
Sergey_New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не выходит из цикла Function FindDescendantA
Переданное ей id имеет значение, не содержащееся в таблицах.
...
Рейтинг: 0 / 0
Иерархия и рекурсия
    #32509474
фыыф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автордалее кол-во не изменяется, цикл продолжается.
Причина не ясна.

По моему, у тебя где-то проходит на бесконечный цикл без присвоения. (или ты все таки вызываешь ту же функцию, что и раньше, а не текущий вариант).

1.Запаузь Ctrl+Break (при работе, в момент "причина не ясна")
(посмотри, заодно, какая ф-я крутится)
2.Включи в настройках режим прерывания "при любой ошибке" (не сбрасывая процедуру).
3.продолжи -
( Например объектная переменная в отсутствии, или за границу массивов вылетаем - кривой код и т.п.)

если ошибок нет (прерывающих прогу), то ошибка в логике циклов, или данных, тогда опять:
4. запаузь,
5.поставь точки останова на While-ах и Do
6.и посмотри, как крутится, почему не попадает на присвоение и не выходит наружу. (то ли поколения не сдвигаются, то ли еще какая мототень, и нет ли одноименных Public переменных.).

Заодно приведи размеры массивов поколений
...
Рейтинг: 0 / 0
Иерархия и рекурсия
    #32509492
фыыф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
за выход отвечает
Do While .Fields(iSx + 1) = id

если поля в таблице переместились(их индексы не 1 и 2), то вместо (iSx + 1) надо в явном виде задавть имена полей ("муж", "жена").
...
Рейтинг: 0 / 0
Иерархия и рекурсия
    #32509517
фыыф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и шибко похоже, что у тебя нет объектной переменной, или ты за границами массивов.


В конечной реализации обработку ошибок надо сделать правильно. (В зависимости от того, нужны ли частичные результаты, не нужны никакие, нужно ли сообщение и т.п.
а не On Error Resume Next, которая в таких случаях приводит к бесконечному циклу).

зы: надеюсь ремарки ' со старого кода ты не снимал.
...
Рейтинг: 0 / 0
Иерархия и рекурсия
    #32509521
Sergey_New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 фыыф
Уже ничего не соображаю :(
Нужно начать сначала и упростить задачу.
Определять только потомков, без поколений.
М.б. писать их в массив, а не в таблицу (это быстрее или нет?).
Если это возможно, не мог бы я передать вам таблицы?
Не примите за нахальство - делаю не для денег, просто есть заинтересованный круг людей, занимающихся генеалогией.
...
Рейтинг: 0 / 0
Иерархия и рекурсия
    #32509548
Фотография Zenia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЕсли это возможно, не мог бы я передать вам таблицы?

хорошая идея
...
Рейтинг: 0 / 0
Иерархия и рекурсия
    #32509573
фыыф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
16:23
- краткий курс отладчика.
Довольно полный, для вашего случая.
Попробуйте добить до конца.

цикл, даже если в него попала байда, должен выплюнуть. Если он крутиться - вероятно за счет отсутствия объектной переменной, к которым отсылаются сравнения While
(и конструкции On error resume Next, приписанной сюда от балды, закомментируйте ее на крайняк перед следующим запуском).



Есть вероятность моего логического бага (кроме пресловутой ошибки), но я его не вижу.


а файл, мне мниться, размером под гигабайт. Я его не съем :).
...
Рейтинг: 0 / 0
Иерархия и рекурсия
    #32509599
фыыф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Victosha
16:05
Спасибо. "Будем посмотреть".
...
Рейтинг: 0 / 0
Иерархия и рекурсия
    #32509700
Sergey_New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 фыыф
автора файл, мне мниться, размером под гигабайт. Я его не съем :).
600 кб две таблицы в сжатом текстовом файле.
Как скажете...
...
Рейтинг: 0 / 0
Иерархия и рекурсия
    #32509728
фыыф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашел махоньки баг:

добавь:
Код: plaintext
1.
2.
3.
4.
Function UBoundE(Ar As Variant) As Long
On Error Resume Next
    UBoundE = UBound(Ar)
    If Err <>  0  Then UBoundE = - 1 
End Function
и замени в функции переопределение:
Код: plaintext
1.
2.
                                Dim kN As Long
                                kN = UBoundE(pN) +  1  'UBound(pN) +  1  
                                ReDim Preserve pN( 0  To kN)
это должно помочь с "зацикливанием".
(после Erase, UBound не рюхает. Не сразу понял. Старый стал. Глюпий. Мои извинения)



_________
2 Victosha.
Работает, кажется Ваш рецептик:

Erase pC
ReDim pC(0 To UBoundE(pN))
CopyMemory pC(0), pN(0), 4 * (UBoundE(pN) + 1)

но на моем объеме (в этой задаче) времена гуляют в обоих случаях на 2 порядка (очень мало данных, соответсвенно маленькие массивы), пришлось гонять в цикле всю процедуру по 100 раз. Времена совпадают в пределах ошибки. (т.е. полное время процедуры мало зависит от копирования (маленьких) массивов, и сл-но, метода.
...
Рейтинг: 0 / 0
Иерархия и рекурсия
    #32509735
фыыф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
 600  кб две таблицы в сжатом текстовом файле

Боюсь, почта от вас не дойдет. - На общедоступные почтовики я не ходок. И почта с общедоступных не проходит. Если только выложите где -нть на доступном месте (по http).
...
Рейтинг: 0 / 0
Иерархия и рекурсия
    #32509749
Sergey_New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 фыыф
5890 ...
...
Рейтинг: 0 / 0
Иерархия и рекурсия
    #32509753
Sergey_New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 фыыф
А zip с сайта заберете?
...
Рейтинг: 0 / 0
Иерархия и рекурсия
    #32509759
фыыф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если сайт не закрыт моей проксей, заберу. Давайте адрес.

а что такое
5890 ...
?
...
Рейтинг: 0 / 0
Иерархия и рекурсия
    #32509780
Sergey_New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Две упакованные таблицы. Берите.
5890 записей - получился тот же результат, что и до последнего исправления. На нем зацикливается.
...
Рейтинг: 0 / 0
Иерархия и рекурсия
    #32509788
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 фыыв

я, конечно, взрослый мальчик, но ко мне на ты легко.

ЗЫ
с с копимемори главная проблема "попасть в вызов" где ему byVal отдать, а где ByRef. Моя мозговая кость не так остра, чтобы положиться без проверки. Вот и поосторожничал в выражениях.
...
Рейтинг: 0 / 0
Иерархия и рекурсия
    #32509798
фыыф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а какой id предка вызывает такие длинные деревья?
...
Рейтинг: 0 / 0
Иерархия и рекурсия
    #32509801
Sergey_New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 All
Для затравки :)
Есть программа, по моему на Дельфи, которая находит в этих файлах более 30000 потомков и записывает их в листбокс за 40 сек. Ну не совсем в этих, а преобразованных ей самой из gedcom файла.
...
Рейтинг: 0 / 0
Иерархия и рекурсия
    #32509807
Sergey_New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автора какой id предка вызывает такие длинные деревья?
29
...
Рейтинг: 0 / 0
Иерархия и рекурсия
    #32509808
Sergey_New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У №29, судя по той программе должно быть 33047 потомков
...
Рейтинг: 0 / 0
Иерархия и рекурсия
    #32509820
фыыф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть баги.
во всех версиях строки:
If .NoMatch Then Exit Do
замени на:
If .NoMatch Or .EOF Then Exit Do

но есть еще какая-то лажа-с.
на 7-м id рекурсивный алгоритм (2-й) накидал мне уже 12078, и не собирается останавливаться.


Судя по всему, у вас там петля-с. типа внучек оказался предком бабушки. (пока просто смотрю на умножение задублированных потомков в разных поколениях при увеличении времени счета. (неужто баг такой:)

так же ведет себя и нерекурсивный.

буду смотреть завтра :).
...
Рейтинг: 0 / 0
Иерархия и рекурсия
    #32509821
фыыф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ссори, накидал болше 120000, куда то цифирь делась
...
Рейтинг: 0 / 0
Иерархия и рекурсия
    #32509898
Sergey_New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Записал с каждым найденным потомком текущее время. Группировка по времени, число записей.
...
Рейтинг: 0 / 0
25 сообщений из 120, страница 4 из 5
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Иерархия и рекурсия
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]