Автор | Сообщение |
|
| |
Пост N: 67
Зарегистрирован: 25.02.10
|
|
Отправлено: 04.07.12 16:43. Заголовок: внутренняя ошибка 5333
стало рвать прогу с такой ошибкой на строке с такой командой aShow := asort( aShow,,, {|x,y| (dtos(x[2])+x[1]) < (dtos(y[2])+y[1]) } ) причём только на 2-3 покупателях (и несколько раз пропустило нормально) при отладке всегда проходит без ошибок размер массива 2-3 сотни записей(каждая - 8ми елементные массив) здесь на форуме нашел только такое упоминание 5333 Misuse of VM System т.е. как бы я неправильно употребляю виртуальную машину мож кто вспомнит/предложит?
|
|
|
Ответов - 17
[только новые]
|
|
|
| |
Пост N: 543
Зарегистрирован: 11.06.10
|
|
Отправлено: 04.07.12 17:07. Заголовок: asort возвращает ссы..
asort возвращает ссылку на массив вот пример с ng aArray := { 3, 5, 1, 2, 4 } ASORT(aArray) // Result: { 1, 2, 3, 4, 5 } ASORT(aArray,,, { |x, y| x > y }) // Result: { 5, 4, 3, 2, 1 } пробуй просто asort( aShow,,, {|x,y| (dtos(x[2])+x[1]) < (dtos(y[2])+y[1]) } )
|
|
|
|
| |
Пост N: 68
Зарегистрирован: 25.02.10
|
|
Отправлено: 06.07.12 11:39. Заголовок: ненене все покупател..
ненене все покупатели в цикле проходят через эту команду и токмо 2-3 рвут прогу с сабжем у них единственное отличие -- размер сортируемого массива больше чем у других на ~200-300 элементов но сам массив не превышает и 500 элементов шо вроде вписывается в ограничения клиппера да и при отладке задачу не рвет ни на ком так шо похоже на проблему с выделением памяти
|
|
|
|
| Администратор
|
Пост N: 2439
Зарегистрирован: 23.05.05
|
|
Отправлено: 06.07.12 13:10. Заголовок: Вспоминаются войны к..
Вспоминаются войны клиппера с оперативкой. Если побеждает оперативка - то клиппер капитулирует как раз с ошибкой 5333. Клипперу надо помочь, подкинуть боеприпасов. Клиппер должен быть со всеми патчами, 5.2e или 5.3b, программа собрана блинкером 6 или 7, для работы в protected режиме, т.е. с командой bli exe ext. Там еще какие-то параметры есть. Имеет значение и набор библиотек. Лучше расскажите, а еще лучше покажите, чем и как вы собираете эту программу, под какой ОС она выполняется, тогда легче будет что-то подсказать.
|
|
|
|
| постоянный участник
|
Пост N: 784
Зарегистрирован: 27.01.07
|
|
Отправлено: 06.07.12 13:14. Заголовок: СевДон пишет: 5333 ..
СевДон пишет: цитата: | 5333 Misuse of VM System т.е. как бы я неправильно употребляю виртуальную машину |
| Не ты, а она злоупотребляет.
|
|
|
|
| |
Пост N: 549
Зарегистрирован: 11.06.10
|
|
Отправлено: 06.07.12 13:38. Заголовок: Паша правильно сказа..
Паша правильно сказал - нужно больше информации. Вот еще з гугла: 5.5 What is "Internal Error 5333" and what can I do about it? (Answer supplied by Samuel S. Shuster on 17 July 1993.) Internal Error 5333 occurs when the virtual memory management subsystem gets overloaded and cannot find enough memory to continue execution. You can take a few steps to cope with IE 5333: You can force the virtual memory manager to do a partial cleanup and compaction by executing @ 100, 100 SAY "" // This is an impossible screen location. Consider using CA-Clipper 5.2d. It contains bug fixes that sometimes but not always solve IE 5333 problems. (Editor's note: Obviously, Shuster wrote this when 5.2d was the current release. The consensus now is that 5.2e is the most stable CA-Clipper release.)
|
|
|
|
| |
Пост N: 273
Зарегистрирован: 11.10.11
|
|
Отправлено: 06.07.12 14:03. Заголовок: Измените условие сор..
Измените условие сортировки. Не сравнивайте даты как строки, а сравнивайте их именно как даты. Проблема связана с тем, что постоянно формируются временные строки в критерии сравнения.
|
|
|
|
| Администратор
|
Пост N: 2440
Зарегистрирован: 23.05.05
|
|
Отправлено: 06.07.12 14:20. Заголовок: Сыроежка пишет: Изм..
Сыроежка пишет: цитата: | Измените условие сортировки. Не сравнивайте даты как строки, а сравнивайте их именно как даты. Проблема связана с тем, что постоянно формируются временные строки в критерии сравнения. |
| Кстати, да. Если расширить и углубить это предложение, то можно сделать так: asort( aShow,,, {|x,y| if(x[2]==y[2], x[1]<y[1], x[2]<y[2]) } ) У меня есть подобная функция для сортировки массива: Function ASortA(a, n, n2) // ------------------------------------------------------------- // Сортирует двухмерный массив по индексу n // Если задан n2 - сортировка по двум индексам // ------------------------------------------------------------- Return ASort(a,,, if(n2 == nil,; {|x1, x2| x1[n] < x2[n]},; {|x1, x2| if(x1[n]=x2[n], x1[n2]<x2[n2], x1[n]<x2[n])} )) Но она работает медленновато на больших массивах, и для харбора я ее переписал на С
|
|
|
|
| |
Пост N: 274
Зарегистрирован: 11.10.11
|
|
Отправлено: 06.07.12 14:21. Заголовок: Я сейчас перепишу ва..
Я сейчас перепишу ваше условие, правда, коряво, так как уже не помню синтаксис Clipper { |x, y| x[2] < y[2] .OR. !( y[2] < x[2] ) .AND. x[1] < y[1] }
|
|
|
|
| |
Пост N: 2434
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.07.12 15:29. Заголовок: Сыроежка пишет: Не ..
Сыроежка пишет: цитата: | Не сравнивайте даты как строки, а сравнивайте их именно как даты |
| +1
|
|
|
|
| |
Пост N: 69
Зарегистрирован: 25.02.10
|
|
Отправлено: 06.07.12 16:51. Заголовок: Pasha пишет: Retur..
Pasha пишет:
цитата: | Return ASort(a,,, if(n2 == nil,; {|x1, x2| x1[n] < x2[n]},; {|x1, x2| if(x1[n]=x2[n], x1[n2]<x2[n2], x1[n]<x2[n])} )) |
|
по совету заменил на aShow := asort( aShow,,, {|x,y| if( x[2]==y[2],x[1]<y[1], x[2]<y[2]) } ) из 10 попыток стало проходить правильно в 2-3 случаях вместо 1 как раньше но уже прогресс ;) прога пашет под ХР НОМЕ, сделана на клиппере 5.01, собрана ртлинком ЗЫ и всё таки мой алгоритм короче и красивше хоть и ест больше памяти
|
|
|
|
| |
Пост N: 2435
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.07.12 16:56. Заголовок: СевДон Попробуй бли..
СевДон Попробуй блинкером собрать в protected mode
|
|
|
|
|
| |
Пост N: 2436
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.07.12 17:25. Заголовок: СевДон пишет: ЗЫ и ..
СевДон пишет: цитата: | ЗЫ и всё таки мой алгоритм короче и красивше хоть и ест больше памяти |
| И не только памяти , и работает куда дольше. Простой пример ashow:={} for i=1 to 2000 aadd(ashow ,date()+i) next t:=seconds() aShow := asort( aShow,,,{|x,y| dtos(x) < dtos(y) } ) ? seconds()-t // 16 секунд ashow:={} for i=1 to 2000 aadd(ashow ,date()+i) next t:=seconds() aShow := asort( aShow,,,{|x,y| x < y } ) ? seconds()-t // 4 cекунды Результаты на Harbour ;) 0.03 0.00
|
|
|
|
| |
Пост N: 275
Зарегистрирован: 11.10.11
|
|
Отправлено: 06.07.12 18:11. Заголовок: А почему по-прежнему..
А почему по-прежнему оставляете присваивание, если исходный массив получает отсортированный вид? aShow := asort( aShow,,, {|x,y| if( x[2]==y[2],x[1]<y[1], x[2]<y[2]) } ) Это затратная операция. Вполне возможно, что ошибка нехватки памяти - это следствие более раннего неправильного использования массивов и строк. Может быть у вас есть private или public переменные?
|
|
|
|
| |
Пост N: 70
Зарегистрирован: 25.02.10
|
|
Отправлено: 07.07.12 10:05. Заголовок: Dima пишет: Простой..
Dima пишет: в задаче надо сравнивать не даты а спарку дата+номер_ТТН (если бы только даты я бы их и не преобразовывал бы,этож лишняя работа... ) посему ничего лучше не придумал как перевести все в строки и уже их сравнивать Каков Ваш алгоритм для такой задачи? Паша предложил свой, он тож правильный (у него там 1 операция сравнения и 1 If, у меня 2 dtos + 2 сложения и 1 сравнение, шо быстрее гляну но попозже) Сыроежка пишет: цитата: | А почему по-прежнему оставляете присваивание, если исходный массив получает отсортированный вид? |
| хз... так исторически сложилось так сортировать массивы стало уже инстинктом, прийдеся себя ломать Решил воспользоваться Вашим советом -- результат впечаляет: ошибка вылетает уже 1 раз из 10! Спсб! С private или public переменными аккуратен, здесь их нет
|
|
|
|
| Администратор
|
Пост N: 2441
Зарегистрирован: 23.05.05
|
|
Отправлено: 07.07.12 11:20. Заголовок: СевДон пишет: в зад..
СевДон пишет: цитата: | в задаче надо сравнивать не даты а спарку дата+номер_ТТН (если бы только даты я бы их и не преобразовывал бы,этож лишняя работа... ) посему ничего лучше не придумал как перевести все в строки и уже их сравнивать Каков Ваш алгоритм для такой задачи? Паша предложил свой, он тож правильный (у него там 1 операция сравнения и 1 If, у меня 2 dtos + 2 сложения и 1 сравнение, шо быстрее гляну но попозже) |
| Сортировка DTOS(x[2])+x[1] - это вызов функции и конкатенация строк, которая связана с выделением памяти под результирующую строку, и это выделение делается 2 раза для каждой операции сравнения, а таких операций выполняется великое множество для сортировки большого массива Выполнение { |x, y| x[2] < y[2] .OR. !( y[2] < x[2] ) .AND. x[1] < y[1] } или {|x,y| if( x[2]==y[2],x[1]<y[1], x[2]<y[2]) } это обращение к элементу массива и операции сравнения, которые выделения памяти не требуют, а работают исключительно со стеком vm клиппера И все таки, пересоберите свою программу блинкером. Это надо было сделать лет 15 назад. rtlink работает еще в режиме 8086, даже не использует режим 80286. С rtlink программа имеет доступ к примерно 400k памяти, столько ей даст от щедрот виртуальная машина dos. Если всего памяти порядка 1Gb, то это менее 0.05% доступной памяти. Согласитесь, калибр маловат, надо использовать больший. Блинкер в protected mode даст программе в несколько раз больше памяти. Это все равно будет очень мало, менее 1% доступной памяти, но все-таки это лучше. Да и переделок программы при этом не требуется никаких, просто собрать ее другим линкером Вот почему лучше использовать харбор. Он позволит использовать все 100% памяти.
|
|
|
|
| |
Пост N: 276
Зарегистрирован: 11.10.11
|
|
Отправлено: 07.07.12 15:32. Заголовок: Проверьте также, под..
Проверьте также, подключили ли вы EMM для вашей досовской сессии.
|
|
|
|
| |
Пост N: 71
Зарегистрирован: 25.02.10
|
|
Отправлено: 09.07.12 14:35. Заголовок: сенкс пободаюсь с бл..
сенкс пободаюсь с блинкером хотя это уже мож и не надо -- к нам приходит великая и ужасная 1С вот так живешь и не знаешь шо с 1го августа жизнь меняется хотя начало июля ничего не предвещало...
|
|
|
|