libxlsxwriter for Clarion

Программы на Clarion, шаблоны, библиотеки и пр.

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

libxlsxwriter for Clarion

Сообщение Дед Пахом »

Игорь Столяров писал(а): 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)
Ради любопытства проверил, в ячейке A1 вижу чистый 0. Правда, у меня не Excel, а Calc. Полученный xlsx (переименованный в txt) прилагаю.
Вложения
Report.txt
(4.86 КБ) 55 скачиваний
С уважением, ДП
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

libxlsxwriter for Clarion

Сообщение RaFaeL »

А я проверил, Excel файл не открывает, внутри xml в ячейке nan
Скорее всего просто в Calc встроена "защита от дурака"
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

libxlsxwriter for Clarion

Сообщение Дед Пахом »

RaFaeL писал(а): 27 Февраль 2018, 18:59внутри xml в ячейке nan
точно. Я бы сказал, что и Calc, и Excel ведут себя неадекватно, хотя и по разному.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7327
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

libxlsxwriter for Clarion

Сообщение Игорь Столяров »

RaFaeL писал(а): 27 Февраль 2018, 18:59внутри xml в ячейке nan
Я извиняюсь, а не может быть здесь ситуации, что REAL в DLL по разрядности не совпадает с REAL в Clarion ?
Т.е. до определённого значения это не проявляется, деление на должно давать предельно максимальное число
для типа данных REAL (и это конкретная цифра !), но внутри DLL получает что-то неадекватное для числа,
что и приводит к записи "nan" в ячейку ?
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

libxlsxwriter for Clarion

Сообщение RaFaeL »

Тут как раз наоборот, все совпадает, и в Кларионе в памяти этот самый nan который там и должен быть по стандарту IEEE 754, а не 0. А если задать R1 в неноль, то пишется inf. https://ru.wikipedia.org/wiki/IEEE_754-2008
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7327
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

libxlsxwriter for Clarion

Сообщение Игорь Столяров »

OK ! Можно ли как-то в Clarion выцепить, что переменной типа REAL находится неопределённость NaN или Inf ?
Я бы просто переобъявил метод WriteNumber() и заменил эту "неопределённость" на ноль ...
Просто проверять по всему коду деление на ноль физически не реально ... :(

Хотя ... можно просто проверять значение на ноль и заменять всегда ноль на явный ноль ... Дурдом ! :idied:
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

libxlsxwriter for Clarion

Сообщение RaFaeL »

Кстати про деление на 0
R1 REAL(10)
R2 REAL(0)
R3 REAL
inf.PNG
inf.PNG (5.68 КБ) 2235 просмотров
А вы говорите, ноль, ноль ))
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7327
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

libxlsxwriter for Clarion

Сообщение Игорь Столяров »

RaFaeL писал(а): 27 Февраль 2018, 19:44А вы говорите, ноль, ноль ))
Извините, но у меня все ходы записаны .... ;)
В моём примере R1 = 0 и результат будет 0 ....
Можете проверить ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 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)
С уважением, ДП
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

libxlsxwriter for Clarion

Сообщение Дед Пахом »

Пожалуй, для начала надо проверить первые 6 байт на 0, если так, то уже проверять 7-й и 8-й.
С уважением, ДП
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

libxlsxwriter for Clarion

Сообщение RaFaeL »

Игорь Столяров писал(а): 27 Февраль 2018, 19:37Просто проверять по всему коду деление на ноль физически не реально ...
err#=xlsx.WriteNumber(1,1,choose(r2=0,0,r1/r2))
Чего тут нереального? ;)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7327
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

libxlsxwriter for Clarion

Сообщение Игорь Столяров »

RaFaeL писал(а): 27 Февраль 2018, 20:36Чего тут нереального?
Всё сводится к тому же костылю: если значение равно ноль, значит присвоить ему ноль. :)
Вариант Деда Пахома традиционно более правильный - т.к. разруливает суть проблемы.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

libxlsxwriter for Clarion

Сообщение RaFaeL »

Нет, в примере на ноль проверяется исключительно знаменатель, на который делить ни к чему, а не результат. Это не костыль
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7327
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

libxlsxwriter for Clarion

Сообщение Игорь Столяров »

RaFaeL писал(а): 27 Февраль 2018, 21:37Это не костыль
Не соглашусь.

Я на эту ситуацию Вышел совершенно случайно. Выполняется большой расчёт, записывается в InMemory и в другом
месте выводится в виде отчёта. Лет 10 всё работало, никаких вопросов ни с Report, ни с OLE Excel - никогда не было.
Получается, что теперь, надо везде где есть запись результата в REAL - проверять делители на ноль ? Это нереально ...

Я благодарен за помощь, просто оберну метод WriterNumber в своём классе и уберу эту "особенность".
Но все кто будет использовать XLSXWriter дальше чем "шапочка+табличка=ура как быстро" - придёт к тем же вопросам. ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

libxlsxwriter for Clarion

Сообщение RaFaeL »

Игорь Столяров писал(а): 27 Февраль 2018, 22:01Получается, что теперь, надо везде где есть запись результата в REAL - проверять делители на ноль ?
А вот в нашем проекте приведенная в примере конструкция используется примерно везде, где есть деление на переменную и возможно ее нулевое значение (нет условия где-то повыше, чаще оно есть). И считаю, что это правильно
Ответить