Ради любопытства проверил, в ячейке A1 вижу чистый 0. Правда, у меня не Excel, а Calc. Полученный xlsx (переименованный в txt) прилагаю.Игорь Столяров писал(а): ↑27 Февраль 2018, 15:10Загадка - шутка для всех ценителей сабжа !
Почему приведённый ниже безобидный код валит экспорт в XLSXWriter ?
Код: Выделить всё
... Loc:R1 Real(0) Loc:R2 Real(0) CODE ... xlsx.ClearFormat() err#=xlsx.WriteNumber(1,1,Loc:R1 / Loc:R2)
libxlsxwriter for Clarion
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- Дед Пахом
- Старичок
- Сообщения: 3133
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 10 раз
- Поблагодарили: 28 раз
- Контактная информация:
libxlsxwriter for Clarion
- Вложения
-
- Report.txt
- (4.86 КБ) 59 скачиваний
С уважением, ДП
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1376
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 7 раз
- Поблагодарили: 1 раз
- Контактная информация:
libxlsxwriter for Clarion
А я проверил, Excel файл не открывает, внутри xml в ячейке nan
Скорее всего просто в Calc встроена "защита от дурака"
Скорее всего просто в Calc встроена "защита от дурака"
- Дед Пахом
- Старичок
- Сообщения: 3133
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 10 раз
- Поблагодарили: 28 раз
- Контактная информация:
libxlsxwriter for Clarion
точно. Я бы сказал, что и Calc, и Excel ведут себя неадекватно, хотя и по разному.
С уважением, ДП
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
libxlsxwriter for Clarion
Я извиняюсь, а не может быть здесь ситуации, что REAL в DLL по разрядности не совпадает с REAL в Clarion ?
Т.е. до определённого значения это не проявляется, деление на должно давать предельно максимальное число
для типа данных REAL (и это конкретная цифра !), но внутри DLL получает что-то неадекватное для числа,
что и приводит к записи "nan" в ячейку ?
За теми кто отстал - не возвращаться. (С) Кодекс
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1376
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 7 раз
- Поблагодарили: 1 раз
- Контактная информация:
libxlsxwriter for Clarion
Тут как раз наоборот, все совпадает, и в Кларионе в памяти этот самый nan который там и должен быть по стандарту IEEE 754, а не 0. А если задать R1 в неноль, то пишется inf. https://ru.wikipedia.org/wiki/IEEE_754-2008
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
libxlsxwriter for Clarion
OK ! Можно ли как-то в Clarion выцепить, что переменной типа REAL находится неопределённость NaN или Inf ?
Я бы просто переобъявил метод WriteNumber() и заменил эту "неопределённость" на ноль ...
Просто проверять по всему коду деление на ноль физически не реально ...
Хотя ... можно просто проверять значение на ноль и заменять всегда ноль на явный ноль ... Дурдом !
Я бы просто переобъявил метод WriteNumber() и заменил эту "неопределённость" на ноль ...
Просто проверять по всему коду деление на ноль физически не реально ...
Хотя ... можно просто проверять значение на ноль и заменять всегда ноль на явный ноль ... Дурдом !
За теми кто отстал - не возвращаться. (С) Кодекс
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1376
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 7 раз
- Поблагодарили: 1 раз
- Контактная информация:
libxlsxwriter for Clarion
Кстати про деление на 0
R1 REAL(10)
R2 REAL(0)
R3 REAL А вы говорите, ноль, ноль ))
R1 REAL(10)
R2 REAL(0)
R3 REAL А вы говорите, ноль, ноль ))
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
libxlsxwriter for Clarion
Извините, но у меня все ходы записаны ....
В моём примере R1 = 0 и результат будет 0 ....
Можете проверить
За теми кто отстал - не возвращаться. (С) Кодекс
- Дед Пахом
- Старичок
- Сообщения: 3133
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 10 раз
- Поблагодарили: 28 раз
- Контактная информация:
libxlsxwriter for Clarion
Вот так можно проверить:
Код: Выделить всё
xlsxwriter.WriteNumber PROCEDURE(LONG row_,SHORT col_,REAL number_)
numbytes BYTE, DIM(8), OVER(number_)
CODE
IF numbytes[7] = 0F8h AND numbytes[8] = 0FFh
MESSAGE('NAN')
ELSIF numbytes[7] = 0F0h AND numbytes[8] = 07Fh
MESSAGE('+INF')
ELSIF numbytes[7] = 0F0h AND numbytes[8] = 0FFh
MESSAGE('-INF')
END
return worksheet_write_number(SELF.ActiveWorksheet,row_-1,col_-1,number_,SELF.ActiveFormat)
С уважением, ДП
- Дед Пахом
- Старичок
- Сообщения: 3133
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 10 раз
- Поблагодарили: 28 раз
- Контактная информация:
libxlsxwriter for Clarion
Пожалуй, для начала надо проверить первые 6 байт на 0, если так, то уже проверять 7-й и 8-й.
С уважением, ДП
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1376
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 7 раз
- Поблагодарили: 1 раз
- Контактная информация:
libxlsxwriter for Clarion
err#=xlsx.WriteNumber(1,1,choose(r2=0,0,r1/r2))Игорь Столяров писал(а): ↑27 Февраль 2018, 19:37Просто проверять по всему коду деление на ноль физически не реально ...
Чего тут нереального?
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
libxlsxwriter for Clarion
Всё сводится к тому же костылю: если значение равно ноль, значит присвоить ему ноль.
Вариант Деда Пахома традиционно более правильный - т.к. разруливает суть проблемы.
За теми кто отстал - не возвращаться. (С) Кодекс
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1376
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 7 раз
- Поблагодарили: 1 раз
- Контактная информация:
libxlsxwriter for Clarion
Нет, в примере на ноль проверяется исключительно знаменатель, на который делить ни к чему, а не результат. Это не костыль
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
libxlsxwriter for Clarion
Не соглашусь.
Я на эту ситуацию Вышел совершенно случайно. Выполняется большой расчёт, записывается в InMemory и в другом
месте выводится в виде отчёта. Лет 10 всё работало, никаких вопросов ни с Report, ни с OLE Excel - никогда не было.
Получается, что теперь, надо везде где есть запись результата в REAL - проверять делители на ноль ? Это нереально ...
Я благодарен за помощь, просто оберну метод WriterNumber в своём классе и уберу эту "особенность".
Но все кто будет использовать XLSXWriter дальше чем "шапочка+табличка=ура как быстро" - придёт к тем же вопросам.
За теми кто отстал - не возвращаться. (С) Кодекс
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1376
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 7 раз
- Поблагодарили: 1 раз
- Контактная информация:
libxlsxwriter for Clarion
А вот в нашем проекте приведенная в примере конструкция используется примерно везде, где есть деление на переменную и возможно ее нулевое значение (нет условия где-то повыше, чаще оно есть). И считаю, что это правильноИгорь Столяров писал(а): ↑27 Февраль 2018, 22:01Получается, что теперь, надо везде где есть запись результата в REAL - проверять делители на ноль ?