|
|
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
да в случае 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) в адресное пространство акцесса - я, правда, так не делаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 16:05 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
2 фыыф 1 сек. 5000 5 сек. 5890 далее кол-во не изменяется, цикл продолжается. Причина не ясна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 16:07 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
Не выходит из цикла Function FindDescendantA Переданное ей id имеет значение, не содержащееся в таблицах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 16:18 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
автордалее кол-во не изменяется, цикл продолжается. Причина не ясна. По моему, у тебя где-то проходит на бесконечный цикл без присвоения. (или ты все таки вызываешь ту же функцию, что и раньше, а не текущий вариант). 1.Запаузь Ctrl+Break (при работе, в момент "причина не ясна") (посмотри, заодно, какая ф-я крутится) 2.Включи в настройках режим прерывания "при любой ошибке" (не сбрасывая процедуру). 3.продолжи - ( Например объектная переменная в отсутствии, или за границу массивов вылетаем - кривой код и т.п.) если ошибок нет (прерывающих прогу), то ошибка в логике циклов, или данных, тогда опять: 4. запаузь, 5.поставь точки останова на While-ах и Do 6.и посмотри, как крутится, почему не попадает на присвоение и не выходит наружу. (то ли поколения не сдвигаются, то ли еще какая мототень, и нет ли одноименных Public переменных.). Заодно приведи размеры массивов поколений ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 16:23 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
за выход отвечает Do While .Fields(iSx + 1) = id если поля в таблице переместились(их индексы не 1 и 2), то вместо (iSx + 1) надо в явном виде задавть имена полей ("муж", "жена"). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 16:29 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
и шибко похоже, что у тебя нет объектной переменной, или ты за границами массивов. В конечной реализации обработку ошибок надо сделать правильно. (В зависимости от того, нужны ли частичные результаты, не нужны никакие, нужно ли сообщение и т.п. а не On Error Resume Next, которая в таких случаях приводит к бесконечному циклу). зы: надеюсь ремарки ' со старого кода ты не снимал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 16:39 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
2 фыыф Уже ничего не соображаю :( Нужно начать сначала и упростить задачу. Определять только потомков, без поколений. М.б. писать их в массив, а не в таблицу (это быстрее или нет?). Если это возможно, не мог бы я передать вам таблицы? Не примите за нахальство - делаю не для денег, просто есть заинтересованный круг людей, занимающихся генеалогией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 16:40 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
авторЕсли это возможно, не мог бы я передать вам таблицы? хорошая идея ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 16:47 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
16:23 - краткий курс отладчика. Довольно полный, для вашего случая. Попробуйте добить до конца. цикл, даже если в него попала байда, должен выплюнуть. Если он крутиться - вероятно за счет отсутствия объектной переменной, к которым отсылаются сравнения While (и конструкции On error resume Next, приписанной сюда от балды, закомментируйте ее на крайняк перед следующим запуском). Есть вероятность моего логического бага (кроме пресловутой ошибки), но я его не вижу. а файл, мне мниться, размером под гигабайт. Я его не съем :). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 16:57 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
2 Victosha 16:05 Спасибо. "Будем посмотреть". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 17:06 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
2 фыыф автора файл, мне мниться, размером под гигабайт. Я его не съем :). 600 кб две таблицы в сжатом текстовом файле. Как скажете... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 17:51 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
Нашел махоньки баг: добавь: Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. (после Erase, UBound не рюхает. Не сразу понял. Старый стал. Глюпий. Мои извинения) _________ 2 Victosha. Работает, кажется Ваш рецептик: Erase pC ReDim pC(0 To UBoundE(pN)) CopyMemory pC(0), pN(0), 4 * (UBoundE(pN) + 1) но на моем объеме (в этой задаче) времена гуляют в обоих случаях на 2 порядка (очень мало данных, соответсвенно маленькие массивы), пришлось гонять в цикле всю процедуру по 100 раз. Времена совпадают в пределах ошибки. (т.е. полное время процедуры мало зависит от копирования (маленьких) массивов, и сл-но, метода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 18:06 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
Код: plaintext Боюсь, почта от вас не дойдет. - На общедоступные почтовики я не ходок. И почта с общедоступных не проходит. Если только выложите где -нть на доступном месте (по http). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 18:11 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
2 фыыф 5890 ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 18:19 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
2 фыыф А zip с сайта заберете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 18:23 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
если сайт не закрыт моей проксей, заберу. Давайте адрес. а что такое 5890 ... ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 18:28 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
Две упакованные таблицы. Берите. 5890 записей - получился тот же результат, что и до последнего исправления. На нем зацикливается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 18:46 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
2 фыыв я, конечно, взрослый мальчик, но ко мне на ты легко. ЗЫ с с копимемори главная проблема "попасть в вызов" где ему byVal отдать, а где ByRef. Моя мозговая кость не так остра, чтобы положиться без проверки. Вот и поосторожничал в выражениях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 18:51 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
а какой id предка вызывает такие длинные деревья? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 19:00 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
2 All Для затравки :) Есть программа, по моему на Дельфи, которая находит в этих файлах более 30000 потомков и записывает их в листбокс за 40 сек. Ну не совсем в этих, а преобразованных ей самой из gedcom файла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 19:03 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
автора какой id предка вызывает такие длинные деревья? 29 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 19:08 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
У №29, судя по той программе должно быть 33047 потомков ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 19:12 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
есть баги. во всех версиях строки: If .NoMatch Then Exit Do замени на: If .NoMatch Or .EOF Then Exit Do но есть еще какая-то лажа-с. на 7-м id рекурсивный алгоритм (2-й) накидал мне уже 12078, и не собирается останавливаться. Судя по всему, у вас там петля-с. типа внучек оказался предком бабушки. (пока просто смотрю на умножение задублированных потомков в разных поколениях при увеличении времени счета. (неужто баг такой:) так же ведет себя и нерекурсивный. буду смотреть завтра :). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 19:28 |
|
||
|
Иерархия и рекурсия
|
|||
|---|---|---|---|
|
#18+
ссори, накидал болше 120000, куда то цифирь делась ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2004, 19:29 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32509808&tid=1674665]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
158ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 246ms |
| total: | 503ms |

| 0 / 0 |
