Форум » Clipper » внутренняя ошибка 5333 » Ответить

внутренняя ошибка 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

AlexMyr: 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]) } )

СевДон: ненене все покупатели в цикле проходят через эту команду и токмо 2-3 рвут прогу с сабжем у них единственное отличие -- размер сортируемого массива больше чем у других на ~200-300 элементов но сам массив не превышает и 500 элементов шо вроде вписывается в ограничения клиппера да и при отладке задачу не рвет ни на ком так шо похоже на проблему с выделением памяти

Pasha: Вспоминаются войны клиппера с оперативкой. Если побеждает оперативка - то клиппер капитулирует как раз с ошибкой 5333. Клипперу надо помочь, подкинуть боеприпасов. Клиппер должен быть со всеми патчами, 5.2e или 5.3b, программа собрана блинкером 6 или 7, для работы в protected режиме, т.е. с командой bli exe ext. Там еще какие-то параметры есть. Имеет значение и набор библиотек. Лучше расскажите, а еще лучше покажите, чем и как вы собираете эту программу, под какой ОС она выполняется, тогда легче будет что-то подсказать.


PSP: СевДон пишет: 5333 Misuse of VM System т.е. как бы я неправильно употребляю виртуальную машину Не ты, а она злоупотребляет.

AlexMyr: Паша правильно сказал - нужно больше информации. Вот еще з гугла: 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.)

Сыроежка: Измените условие сортировки. Не сравнивайте даты как строки, а сравнивайте их именно как даты. Проблема связана с тем, что постоянно формируются временные строки в критерии сравнения.

Pasha: Сыроежка пишет: Измените условие сортировки. Не сравнивайте даты как строки, а сравнивайте их именно как даты. Проблема связана с тем, что постоянно формируются временные строки в критерии сравнения. Кстати, да. Если расширить и углубить это предложение, то можно сделать так: 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])} )) Но она работает медленновато на больших массивах, и для харбора я ее переписал на С

Сыроежка: Я сейчас перепишу ваше условие, правда, коряво, так как уже не помню синтаксис Clipper { |x, y| x[2] < y[2] .OR. !( y[2] < x[2] ) .AND. x[1] < y[1] }

Dima: Сыроежка пишет: Не сравнивайте даты как строки, а сравнивайте их именно как даты +1

СевДон: 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, собрана ртлинком ЗЫ и всё таки мой алгоритм короче и красивше хоть и ест больше памяти

Dima: СевДон Попробуй блинкером собрать в protected mode

Dima: СевДон пишет: ЗЫ и всё таки мой алгоритм короче и красивше хоть и ест больше памяти И не только памяти , и работает куда дольше. Простой пример [pre2] 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екунды [/pre2] Результаты на Harbour ;) 0.03 0.00

Сыроежка: А почему по-прежнему оставляете присваивание, если исходный массив получает отсортированный вид? aShow := asort( aShow,,, {|x,y| if( x[2]==y[2],x[1]<y[1], x[2]<y[2]) } ) Это затратная операция. Вполне возможно, что ошибка нехватки памяти - это следствие более раннего неправильного использования массивов и строк. Может быть у вас есть private или public переменные?

СевДон: Dima пишет: Простой пример в задаче надо сравнивать не даты а спарку дата+номер_ТТН (если бы только даты я бы их и не преобразовывал бы,этож лишняя работа... ) посему ничего лучше не придумал как перевести все в строки и уже их сравнивать Каков Ваш алгоритм для такой задачи? Паша предложил свой, он тож правильный (у него там 1 операция сравнения и 1 If, у меня 2 dtos + 2 сложения и 1 сравнение, шо быстрее гляну но попозже) Сыроежка пишет: А почему по-прежнему оставляете присваивание, если исходный массив получает отсортированный вид? хз... так исторически сложилось так сортировать массивы стало уже инстинктом, прийдеся себя ломать Решил воспользоваться Вашим советом -- результат впечаляет: ошибка вылетает уже 1 раз из 10! Спсб! С private или public переменными аккуратен, здесь их нет

Pasha: СевДон пишет: в задаче надо сравнивать не даты а спарку дата+номер_ТТН (если бы только даты я бы их и не преобразовывал бы,этож лишняя работа... ) посему ничего лучше не придумал как перевести все в строки и уже их сравнивать Каков Ваш алгоритм для такой задачи? Паша предложил свой, он тож правильный (у него там 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% памяти.

Сыроежка: Проверьте также, подключили ли вы EMM для вашей досовской сессии.

СевДон: сенкс пободаюсь с блинкером хотя это уже мож и не надо -- к нам приходит великая и ужасная 1С вот так живешь и не знаешь шо с 1го августа жизнь меняется хотя начало июля ничего не предвещало...



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