libxlsxwriter for Clarion

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

libxlsxwriter for Clarion

Сообщение Дед Пахом » 27 Февраль 2018, 18:55

Игорь Столяров писал(а):
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 КБ) 11 скачиваний
С уважением, ДП

Аватара пользователя
RaFaeL
Ветеран
Сообщения: 673
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

libxlsxwriter for Clarion

Сообщение RaFaeL » 27 Февраль 2018, 18:59

А я проверил, Excel файл не открывает, внутри xml в ячейке nan
Скорее всего просто в Calc встроена "защита от дурака"

Аватара пользователя
Дед Пахом
Старичок
Сообщения: 1948
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

libxlsxwriter for Clarion

Сообщение Дед Пахом » 27 Февраль 2018, 19:02

RaFaeL писал(а):
27 Февраль 2018, 18:59
внутри xml в ячейке nan
точно. Я бы сказал, что и Calc, и Excel ведут себя неадекватно, хотя и по разному.
С уважением, ДП

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 3291
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

libxlsxwriter for Clarion

Сообщение Игорь Столяров » 27 Февраль 2018, 19:14

RaFaeL писал(а):
27 Февраль 2018, 18:59
внутри xml в ячейке nan
Я извиняюсь, а не может быть здесь ситуации, что REAL в DLL по разрядности не совпадает с REAL в Clarion ?
Т.е. до определённого значения это не проявляется, деление на должно давать предельно максимальное число
для типа данных REAL (и это конкретная цифра !), но внутри DLL получает что-то неадекватное для числа,
что и приводит к записи "nan" в ячейку ?
Вам помочь или не мешать ?

Аватара пользователя
RaFaeL
Ветеран
Сообщения: 673
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

libxlsxwriter for Clarion

Сообщение RaFaeL » 27 Февраль 2018, 19:31

Тут как раз наоборот, все совпадает, и в Кларионе в памяти этот самый nan который там и должен быть по стандарту IEEE 754, а не 0. А если задать R1 в неноль, то пишется inf. https://ru.wikipedia.org/wiki/IEEE_754-2008

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 3291
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

libxlsxwriter for Clarion

Сообщение Игорь Столяров » 27 Февраль 2018, 19:37

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

Хотя ... можно просто проверять значение на ноль и заменять всегда ноль на явный ноль ... Дурдом ! :idied:
Вам помочь или не мешать ?

Аватара пользователя
RaFaeL
Ветеран
Сообщения: 673
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

libxlsxwriter for Clarion

Сообщение RaFaeL » 27 Февраль 2018, 19:44

Кстати про деление на 0
R1 REAL(10)
R2 REAL(0)
R3 REAL
inf.PNG
inf.PNG (5.68 КБ) 467 просмотров
А вы говорите, ноль, ноль ))

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 3291
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

libxlsxwriter for Clarion

Сообщение Игорь Столяров » 27 Февраль 2018, 19:54

RaFaeL писал(а):
27 Февраль 2018, 19:44
А вы говорите, ноль, ноль ))
Извините, но у меня все ходы записаны .... ;)
В моём примере R1 = 0 и результат будет 0 ....
Можете проверить ;)
Вам помочь или не мешать ?

Аватара пользователя
Дед Пахом
Старичок
Сообщения: 1948
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

libxlsxwriter for Clarion

Сообщение Дед Пахом » 27 Февраль 2018, 20:01

Вот так можно проверить:

Код: Выделить всё

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)
С уважением, ДП

Аватара пользователя
Дед Пахом
Старичок
Сообщения: 1948
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

libxlsxwriter for Clarion

Сообщение Дед Пахом » 27 Февраль 2018, 20:11

Пожалуй, для начала надо проверить первые 6 байт на 0, если так, то уже проверять 7-й и 8-й.
С уважением, ДП

Аватара пользователя
RaFaeL
Ветеран
Сообщения: 673
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

libxlsxwriter for Clarion

Сообщение RaFaeL » 27 Февраль 2018, 20:36

Игорь Столяров писал(а):
27 Февраль 2018, 19:37
Просто проверять по всему коду деление на ноль физически не реально ...
err#=xlsx.WriteNumber(1,1,choose(r2=0,0,r1/r2))
Чего тут нереального? ;)

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 3291
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

libxlsxwriter for Clarion

Сообщение Игорь Столяров » 27 Февраль 2018, 20:52

RaFaeL писал(а):
27 Февраль 2018, 20:36
Чего тут нереального?
Всё сводится к тому же костылю: если значение равно ноль, значит присвоить ему ноль. :)
Вариант Деда Пахома традиционно более правильный - т.к. разруливает суть проблемы.
Вам помочь или не мешать ?

Аватара пользователя
RaFaeL
Ветеран
Сообщения: 673
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

libxlsxwriter for Clarion

Сообщение RaFaeL » 27 Февраль 2018, 21:37

Нет, в примере на ноль проверяется исключительно знаменатель, на который делить ни к чему, а не результат. Это не костыль

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 3291
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

libxlsxwriter for Clarion

Сообщение Игорь Столяров » 27 Февраль 2018, 22:01

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

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

Я благодарен за помощь, просто оберну метод WriterNumber в своём классе и уберу эту "особенность".
Но все кто будет использовать XLSXWriter дальше чем "шапочка+табличка=ура как быстро" - придёт к тем же вопросам. ;)
Вам помочь или не мешать ?

Аватара пользователя
RaFaeL
Ветеран
Сообщения: 673
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

libxlsxwriter for Clarion

Сообщение RaFaeL » 27 Февраль 2018, 22:10

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

Ответить