Форум » [x]Harbour » Волшебные числа и операции » Ответить

Волшебные числа и операции

AndreyZh: Доброе утро! Вот наткнулся на очередную ошибку xHarbour и Clipper. Думал, что глюк ОС или ПК, но нет. Пример ошибки - оператор "остаток от деления": 8.8 * 3 = 26.4 или 3.3 * 3 = 9.9, но операции (%) дают 26.4%8.8 = 8.8 или (НО правильно) 9.9%3.3 = 0 Вопрос - как Вы обходите данные глюки? Или где в "арифметике" ожидать очередных "засад"? До кучи напомню об ошибочной работе функции Int в Clipper (в xHarbour кажется работает правильно)

Ответов - 136, стр: 1 2 3 4 5 6 7 All

Pasha: Dima пишет: 5.01 .F. 5.2e .F. без picture так же Да у меня тоже самое. Со стандартной getsys. Но в рабочих программах я использую свою getsys, и она дает результат T Возможно, у Андрея Жукова тоже своя нестандартная getsys, которая меняет значение переменной, даже если она не изменяется.

Dima: Pasha пишет: Возможно, у Андрея Жукова тоже своя нестандартная getsys и мне так кажется. AndreyZh пишет: 2. Нелюбовь xHarbour к точке и запятой, в качестве переменной формы ввода. И тут похоже в этом дело. Ждем Андрея.

Pasha: Все-таки ситуация другая, getsys ни при чем. Во время редакции значения 4.4 переменная содержит не 4.4, а результат 12.2-7.8, то есть 4.4+eps Если в клиппере нажать просто enter, то значение останется 4.4+eps, и сравниваться будет сама с собой, и сравнение сработает Если ввести 4.4, то затем сравнение 4.4 с 4.4+eps не сработает В xHarbour имеется побочное действие: если не вводить 4.4, а нажать enter, то значение переменной все равно изменится с 4.4+eps на 4.4, и затем сравнение 4.4 с 4.4+eps не сработает в Harbour этого побочного действия нет, и он работает так же, как и клиппер

Pasha: Во всяком случае причина понятна. Это не разное выполнение арифметических операций, никакое не неправильное вычитание. Причина как раз в том, что в xHarbour имеется недокументированное свойство округлять при вводе в get значение переменной. А округление как раз и не нужно, так как после get оно приводит к неравенству при сравнении с округленного и неокругленного значения.

PSP: Да уж... Вот тебе и xHarbour...

AndreyZh: Громадное спасибо за весьма конструктивное обсуждение!!! Причины возможно ясны... только хотелось бы сейчас при наличии ПК проверить все высказанные гипотезы и тесты... а затем, если Вы захотите попробуем разобраться с нелюбовью xHarbour к точке и запятой - конструкции довольно громоздкие, т.е. боюсь, что самодостаточный пример сложно будет придумать, но... если сможете быть любезны скачать дистрибутив (очень легкая сейчас установка), содержащий и исходники, как проги на клиппер, так и на Харб (правда 35 метров) ДИСТРИБУТИВ, то может быть легче будет меня понять... в принципе дистрибутив содержит и батники для сборок, т.е. несложно пересобрать и под любую версию клиппера Сейчас, с Вашего позволения я поиграюсь с высказанными идеями и вернусь.....

PSP: AndreyZh, проверь, заодно, свои задачи на Harbour.

AndreyZh: PSP пишет: AndreyZh, проверь, заодно, свои задачи на Harbour. Млин!!! - Советчик... Основное время потратил, что бы установить и как-то научиться делать на нем компиляцию... Harbour 2.0.0 Rev 13372 Отмечу сразу - идентично Clipper 5.01R Мне понравилось предположение по PICTURE (GET - у меня неизмененноы) и сразу решил его прокачать - да... здесь проблема, причем действительно у xHarbour. Чуть изменил тест и на первое поле вводил число ручками, а во втором просто нажимал Enter. В первом get результаты были нулевыми везде, а во втором Clipper&Harbour, если не менять значение, то получалось ноль, а в xHarbour ненулевое число. Различие только тут... все остальные числа идентичны. Использовал код: [pre2] loca nmax loca nqty loca nq loca getlist:={} //****** ТЕСТЫ ХАРБА CLS nmax := 12.2 nQty := nQ := nMax @1,1 SAY "Количество:" GET nQty PICT "9999999.999" @2,1 SAY "Количество:" GET nQ PICT "9999999.999" READ @ 3,1 say str((nqty-nmax)*10000000000,19,9) @ 4,1 say str((nq-nmax) *10000000000,19,9) nmax := 12.2-4.4 nQty -= 4.4 nQ -= 4.4 @6,1 SAY "Количество:" GET nQty PICT "9999999.999" @7,1 SAY "Количество:" GET nQ PICT "9999999.999" READ @ 8,1 say str((nqty-nmax)*10000000000,19,9) @ 9,1 say str((nq-nmax) *10000000000,19,9) @10,1 say str((nmax-7.8) *10000000000,19,9) IF 4195835.129876 - ((4195835.129876 / 3145727.129876) * 3145727.129876) #0 ? "BAD" ELSE ? "OK" ENDIF wait //****** КОНЕЦ ТЕСТА [/pre2] Dima пишет: А какой результат выдаст такой тест на Вашей машинке ? IF 4195835.129876 - ((4195835.129876 / 3145727.129876) * 3145727.129876) #0 ? "BAD" ELSE ? "OK" ENDIF Все 3 системы (clipper 5.01r, xHarbour, Harbour) - OK Dima пишет: А какой результат выдаст такой тест на Вашей машинке ? IF 4195835.129876 - ((4195835.129876 / 3145727.129876) * 3145727.129876) #0 ? "BAD" ELSE ? "OK" ENDIF Dima пишет: Не пойму совсем о чем спорим ;) Ведь очевидно же что полученный результат нужно округлять , иначе будут периодически лезть вот такие вот "глюки" в программе. Должен признать что и сам (очень давно правда) в своих программах не округлял результат и соответственно лезли похожие глюки. На скрине идет работа с килограммами и граммами , ну так ясное дело что округлять нужно результаты до 3 знаков после запятой , иначе пользователи Ваc заклюют Здесь, к сожалению не всё так просто... в реальности приходится прогибаться под набор требований: 1. Что бы считало, как 1ц... либо по логике бухов 2. Реальные оперативные суммы (по разным клиентам) от 1 руб до 1 000 000 000 и количества от 0.001 до 1 000 000 3. Приходится манипулировать весами (точность 3 знака), объемами (точность 5 знаков) и количествами в производстве (точность 6 знаков)... тут ещё и алкоголь (с плавающей точностью). Конечно... и уже увидел, что нужно перепахивать все расчеты - весьма неприятно, т.к. придется лезть в многочисленные отлаженные блоки и это ни к чему хорошему не приведёт!

PSP: AndreyZh пишет: Млин!!! - Советчик... Основное время потратил, что бы установить и как-то научиться делать на нем компиляцию... А что ж так? В файле INSTALL есть вся информация.

AndreyZh: PSP пишет: что ж так? В файле INSTALL есть вся информация. Кто же инструкции читает? Покажите мне такого человека?... но вообще говоря Харбор у меня не стоял, да и щупал его очень давно... К сожалению вынужден исчезнуть до 13 в места, где к счастью нет компьютеров... и даже телефон не ловит. Всем приятных праздников!

Pasha: AndreyZh пишет: Основное время потратил, что бы установить и как-то научиться делать на нем компиляцию... Harbour 2.0.0 Rev 13372 Отмечу сразу - идентично Clipper 5.01R Уже почти год как вышел Harbour 3.0, и лучше использовать его. И для развития своей системы лучше ориентироваться на Harbour. Развитие xHarbour остановилось уже почти 4 года как, разработчики или перешли в команду Harbour, или занимаются другими делами. А Harbour как раз продолжает развиваться, и по этой причине несовместимостей с клиппером у него меньше. Хотя, конечно, в редких случаях могут быть неожиданные сюрпризы с совместимостью и в Harbour.

AndreyZh: Всем приятного "понедельника"! Pasha пишет: Уже почти год как вышел Harbour 3.0, и лучше использовать его. И для развития своей системы лучше ориентироваться на Harbour. Развитие xHarbour остановилось уже почти 4 года как, разработчики или перешли в команду Harbour, или занимаются другими делами. А Harbour как раз продолжает развиваться, и по этой причине несовместимостей с клиппером у него меньше. Хотя, конечно, в редких случаях могут быть неожиданные сюрпризы с совместимостью и в Harbour. Желающих помочь разобраться с неприятием точки и запятой xHarbour нет? Ну и ладно нашел решение, хотя и без понимания его эффекта... если у кого так же будут глюки, но после read вставьте код типа: if lastkey() = 44 .or. lastkey() = 46 keyb chr(K_ENTER) inkey(0) endi Теперь для уважаемого Pasha - почему xharbour? Во первых прочтение инструкции Верченко Андрея (Andrey), где очень легко описывалось "вхождение" в данную систему разработки стимулировало попробовать её, а во вторых xHarbour, как прочитал на данном форуме лучше поддерживал оконные функции CT II. Менять уже более-менее отлаженную систему на "неизвестно что" пока не вижу смысла, да и глюки с вашей помощью получается обходить. Что касается "глобальной" переделки под графический интерфейс и с нормальной СУБД, то внимательно присмотрюсь к творчеству Филатова (miniGui) и Кресина (LetoDB) и очень надеюсь, что к тому моменту появится нечто стабильное и хоть как-то документированное ... и конечно Harbour.

Pasha: AndreyZh пишет: Желающих помочь разобраться с неприятием точки и запятой xHarbour нет? Ну и ладно нашел решение, хотя и без понимания его эффекта... если у кого так же будут глюки, но после read вставьте код типа: if lastkey() = 44 .or. lastkey() = 46 keyb chr(K_ENTER) inkey(0) endi Этот код можно заменить одной строкой: SetLastKey( K_ENTER ) Заодно и проблема становится понятной. В клиппере и xHarbour после read наверное остается разное значение lastkey Можно попробовать сделать тесты. Как я понимаю, в односимвольную переменную вводится точка с запятой ? Вот и прогнать тест: local c := ' ' @ 1, 1 say 'Ввод' get c read ? lastkey() Я сейчас работаю под win64, так что клиппер и запустить то не могу, разве что под эмулятором Интересно, есть ли эта несовместимость в Harbour ?

Pasha: AndreyZh пишет: xHarbour, как прочитал на данном форуме лучше поддерживал оконные функции CT II Откуда взялось это мнение, и когда оно было высказано, теперь наверное и не выяснить. Я сам оконные функции ct не использую, так что по поводу совместимости ничего не скажу. Могу рассказать историю создания этих функций. Она имеет польские корни. Изначально эти функции были сделаны как prg-модуль в xHarbour, автор - Adam Lubszczyk. Затем в xHarbour же они были переписаны на C-уровень, причем часть функциональности перенесена непосредственно в терминал-api, работа Henryk Olkowski. Затем в 2006-м, уже в Harbour, Przemek их полностью переписал. Позднее вариант Przemek'a был портирован в xHarbour. Таким образом, в олбеих продуктах сейчас присутствует одна и та же реализация оконных функций. Разница в том, что xHarbour перестал развиваться, в отличие от Harbour, так что думается, в Harbour они более проработаны, тем более их автор уже давно как в команде Harbour, а не xHarbour.

AndreyZh: Pasha пишет: Вот и прогнать тест: local c := ' ' @ 1, 1 say 'Ввод' get c read ? lastkey() Во первых и клиппер и [x]Harbour возвращают ожидаемые key коды. Проблема: в тестовом примере, приведённом раннее все работает правильно и ожидаемо, а в реальном приложении приходится изголяться. Что по развивающемуся Harbour или стагнирующему xHarbour (хотя Patrick постоянно присылает релизы об успехах развития XHarbour) приведенный пример wait "mama" * "papa" обе системы, хоть и по разному но "необрабатывают" на уровне компилятора: xHarbour вызывает переполнение стека, как пояснили выше Harbour выполняя wait далее вываливается по ошибке выполнения, т.е. "те же balls только вид сбоку" - ИМХО

Pasha: AndreyZh пишет: приведенный пример wait "mama" * "papa" обе системы, хоть и по разному но "необрабатывают" на уровне компилятора: Не только оба харбора, но и все 5-е клипперы, от 5.01 до 5.3 точно также "необрабатывают" этот оператор на уровне компилятора, поскольку этот оператор допустим с точки зрения синтаксиса этих языков. Ну а по поводу ошибки переполнения стека, так она возникает в модуле errorsys. При выполнении "mama" * "papa" возникает ошибка argument error, управление передается обработчику ошибок, в нем во время обработки этой ошибки тоже возникает ошибка, управление опять передается этому же обработчику, ну и так далее до переполнения стека. Прчем в стандартном обработчике ошибок xHarbour ошибки в errorsys не возникает, Возможно, вы переопределили этот обработчик на свой, в котором и возникает ошибка.

AndreyZh: Pasha пишет: Прчем в стандартном обработчике ошибок xHarbour ошибки в errorsys не возникает, Возможно, вы переопределили этот обработчик на свой, в котором и возникает ошибка Ничего не менял...

Pasha: AndreyZh пишет: Желающих помочь разобраться с неприятием точки и запятой xHarbour нет? Так в чем состоит различие в поведении клиппера и хХарбора ? Собрать и запустить ваш пример возможности нет никакой. Можете описать словами ? Какие переменные вводятся ? Что именно вводится ? Различие проявляется в процессе ввода ? Вводимые переменные получают разные значения ? После ввода анализируется lastkey, и управление передается на другую ветку ? Что-то другое ?

AndreyZh: Pasha пишет: Так в чем состоит различие в поведении клиппера и хХарбора ? Различий нет, но при вводе (. или ,) в последний запрос прога на xHarb "начинает жить своей жизнью", если любой другой символ (/*-~ и etc), то она сохраняет его для дальнейшего использования. Тестовый пример, иллюстрирующий подход, но где и xHarb работает конкретно приведён выше. Если Вас не затруднит, то все подробно описано со второй страницы. Pasha пишет: Собрать и запустить ваш пример возможности нет никакой Почему? Всё нормально работает и на 64 разрядной Win All... Установка сделана "для блондинок"... проблемка лишь скачать 35 mb дистрибутива (ссылка есть выше) и ничего собирать не нужно... в нём и clipper и xharbour программы с исходниками, а мои попытки разместить набор связанных исходников оказался почти безуспешным - форум преобразует текста в козябяки

Pasha: AndreyZh пишет: Различий нет, но при вводе (. или ,) в последний запрос прога на xHarb "начинает жить своей жизнью", если любой другой символ (/*-~ и etc), то она сохраняет его для дальнейшего использования. Тестовый пример, иллюстрирующий подход, но где и xHarb работает конкретно приведён выше. Если Вас не затруднит, то все подробно описано со второй страницы. Что такое начинает жить своей жизнью ? Ввод не завершается ? Переменные получают какие-то другие значения, не те, что введены ? После ввода что-то анализируется, например lastkey, и управление передается на другую ветку ? При чем тут 64 бит ? Это клиппер на них не работает. Вы мне предлагаете сравнивать поведение 2-х вариантов вашей системы. Я должен как-то запустить эти 2 варианта, один из них 16-битный, зайти не знаю куда, вводить не знаю что, увидеть в чем-то разницу, потом копаться в мегабайтах сырцов ? Дайте самодостаточный пример. Или хотя бы опишите проблему. Когда я много лет назад адаптировал свои программы под харбор, и не мог сам решить какую-то проблему, я поступал не так. Всю эту предварительную работу проделывал сам, и таки делал этот самодостаточный пример, и давал его тому, кто мог решить эту проблему. Это всегда срабатывало. Не помню, чтобы какая-то существенная проблема оставалась нерешенной.



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