Страница 34 из 61

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) прилагаю.

libxlsxwriter for Clarion

Добавлено: 27 Февраль 2018, 18:59
RaFaeL
А я проверил, Excel файл не открывает, внутри xml в ячейке nan
Скорее всего просто в Calc встроена "защита от дурака"

libxlsxwriter for Clarion

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

libxlsxwriter for Clarion

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

libxlsxwriter for Clarion

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

libxlsxwriter for Clarion

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

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

libxlsxwriter for Clarion

Добавлено: 27 Февраль 2018, 19:44
RaFaeL
Кстати про деление на 0
R1 REAL(10)
R2 REAL(0)
R3 REAL
inf.PNG
inf.PNG (5.68 КБ) 2237 просмотров
А вы говорите, ноль, ноль ))

libxlsxwriter for Clarion

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

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)

libxlsxwriter for Clarion

Добавлено: 27 Февраль 2018, 20:11
Дед Пахом
Пожалуй, для начала надо проверить первые 6 байт на 0, если так, то уже проверять 7-й и 8-й.

libxlsxwriter for Clarion

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

libxlsxwriter for Clarion

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

libxlsxwriter for Clarion

Добавлено: 27 Февраль 2018, 21:37
RaFaeL
Нет, в примере на ноль проверяется исключительно знаменатель, на который делить ни к чему, а не результат. Это не костыль

libxlsxwriter for Clarion

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

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

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

libxlsxwriter for Clarion

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