WHAT() WHO() и dll

Clarion, Clarion 7

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Dark_Stranger
Новичок
Сообщения: 17
Зарегистрирован: 16 Апрель 2013, 16:34

WHAT() WHO() и dll

Сообщение Dark_Stranger »

Добрый день!
Есть процедура которая пробегается по record и вытаскивает значения полей (ну и само наименование поля).
файлик TPS

Если процедуру выношу в DLL и вызываю в проге написанной на delphi
procedure export(),PASCAL
CurrentField ANY
FIELD_NUMBER LONG
code
FIELD_NUMBER = 1
Loop while Clip(Left(WHO(Sp:Record, FIELD_NUMBER))) <> ''
If Spools{PROP:TYPE, FIELD_NUMBER} <> 'GROUP' Then
If Spools{PROP:Dim, FIELD_NUMBER} = 0 Then
! Вот тут уходит в ошибку floating point invalid operation причем только на определенном поле (Тип : Real, значение : 0)
! Причем другие поля с таким же типом отрабатывают нормально
! Поля находятся в группе
! МБ перед CurrentField &= WHAT(Sp:Record, FIELD_NUMBER) необходимо сначало CurrentField обнулить?
CurrentField &= WHAT(Sp:Record, FIELD_NUMBER)
!---------------------------------------------------------------------------------
TABLE_FIELD_INFO_Class.Export_Data(Clip(Left(WHO(Sp:Record, FIELD_NUMBER))), 0, SPOOLS{PROP:TYPE, FIELD_NUMBER}, CurrentField)
Else
Loop Loc:XX = 1 To Spools{PROP:Dim, FIELD_NUMBER}
CurrentField &= WHAT(Sp:Record, FIELD_NUMBER, Loc:XX)
TABLE_FIELD_INFO_Class.Export_Data(Clip(Left(WHO(Sp:Record, FIELD_NUMBER))), 0, SPOOLS{PROP:TYPE, FIELD_NUMBER}, CurrentField)
.
.
.
FIELD_NUMBER += 1
.

Если эту процедуры переношу в exe на кларе (procedure export() )
procedure export()
CurrentField ANY
FIELD_NUMBER LONG
code
FIELD_NUMBER = 1
Loop while Clip(Left(WHO(Sp:Record, FIELD_NUMBER))) <> ''
If Spools{PROP:TYPE, FIELD_NUMBER} <> 'GROUP' Then
If Spools{PROP:Dim, FIELD_NUMBER} = 0 Then
! ОШИБКИ НЕТУ
CurrentField &= WHAT(Sp:Record, FIELD_NUMBER)
!---------------------------------------------------------------------------------
TABLE_FIELD_INFO_Class.Export_Data(Clip(Left(WHO(Sp:Record, FIELD_NUMBER))), 0, SPOOLS{PROP:TYPE, FIELD_NUMBER}, CurrentField)
Else
Loop Loc:XX = 1 To Spools{PROP:Dim, FIELD_NUMBER}
CurrentField &= WHAT(Sp:Record, FIELD_NUMBER, Loc:XX)
TABLE_FIELD_INFO_Class.Export_Data(Clip(Left(WHO(Sp:Record, FIELD_NUMBER))), 0, SPOOLS{PROP:TYPE, FIELD_NUMBER}, CurrentField)
.
.
.
FIELD_NUMBER += 1
.
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

WHAT() WHO() и dll

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

непонятно, где ошибка-то, тут

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

CurrentField &= WHAT(Sp:Record, FIELD_NUMBER)
или тут

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

If Spools{PROP:Dim, FIELD_NUMBER} = 0 Then
С уважением, ДП
Dark_Stranger
Новичок
Сообщения: 17
Зарегистрирован: 16 Апрель 2013, 16:34

WHAT() WHO() и dll

Сообщение Dark_Stranger »

Дед Пахом писал(а): непонятно, где ошибка-то, тут

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

CurrentField &= WHAT(Sp:Record, FIELD_NUMBER)
или тут

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

If Spools{PROP:Dim, FIELD_NUMBER} = 0 Then
Вот именно непонятно...
Если я организую .exe все замечательно, но как только выношу в dll уходит в ошибку
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

WHAT() WHO() и dll

Сообщение Yufil »

Значит, в Delphi не выполняется какая-то Кларионовская инициализация, которую выполняет exe-файл Clarion
Dark_Stranger
Новичок
Сообщения: 17
Зарегистрирован: 16 Апрель 2013, 16:34

WHAT() WHO() и dll

Сообщение Dark_Stranger »

Yufil писал(а): Значит, в Delphi не выполняется какая-то Кларионовская инициализация, которую выполняет exe-файл Clarion
Какая такая инициализация.......
Spools Pre(SP)
SP:Field1 REAL
SP:Field2 REAL
SP:FieldGR GROUP
SP:Field3 REAL
SP:Field4 REAL
SP:Field5 REAL
SP:Field6 REAL
SP:Field7 REAL
SP:Field8 REAL
SP:Field9 REAL
END

FIELD_NUMBER = 1
Loop ....
If Spools{PROP:TYPE, FIELD_NUMBER} <> 'GROUP' Then
CurrentField &= WHAT(Sp:Record, FIELD_NUMBER)
FIELD_NUMBER += 1
.
.
Цикл отработает без ошибок, прочитает данные хранящиеся в полях
SP:Field1
SP:Field2
SP:Field3
SP:Field4
SP:Field5
SP:Field6

, а на SP:Field7 уйдет в ошибку если значение равно 0 (причем если значение SP:Field7 <> 0 ошибки не будет, если значение SP:Field7 = 0 то ошибка. Проверено....) (Дополняю: значение полей SP:Field1 - SP:Field6 как равны 0 так и не равны)

Ошибка при использовании DLL:
First chance exception at $04DA6AC9. Exception class $C0000090 with message 'floating point invalid operation at 0x04da6ac0'. Process test.exe (7760)
Dark_Stranger
Новичок
Сообщения: 17
Зарегистрирован: 16 Апрель 2013, 16:34

WHAT() WHO() и dll

Сообщение Dark_Stranger »

Дико извиняюсь, ввел в заблуждение.....
Ошибка возникает не CurrentField &= WHAT(Sp:Record, FIELD_NUMBER)
а когда передаю CurrentField в процедуру со строковым типом
TABLE_FIELD_INFO_Class.Export_Data(Clip(Left(WHO(Sp:Record, FIELD_NUMBER))), 0, SPOOLS{PROP:TYPE, FIELD_NUMBER}, CurrentField)
или
Stop(CurrentField),
Т.е. когда пытаюсь неявно привести ANY к строковому типу.

Также ошибка возникает когда пытаюсь вывести значение в Stop(SP:Field7)

И снова непонятки, при условии SP:Field7 = 0 на записи N выходит ошибка, а на записи N-1 (предыдущая запись) с SP:Field7 = 0 ошибка не наблюдается

P.S.: Такое наблюдается только в dll
Dark_Stranger
Новичок
Сообщения: 17
Зарегистрирован: 16 Апрель 2013, 16:34

WHAT() WHO() и dll

Сообщение Dark_Stranger »

Такое ощущение что при неявном приведение (при определении точности) происходит деление на 0 или что-то подобное (типа указатель есть, а по адресу нету).
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

WHAT() WHO() и dll

Сообщение Yufil »

Дык, exe-файл начинает работу с инициализации среды, в том числе создания разного рода контейнеров, пулов, стеков и прочего имущества для clarion runtime. Можем ли мы быть уверены, что программа на Delphi корректно подготовит среду исполнения программы на Clarion?
Dark_Stranger
Новичок
Сообщения: 17
Зарегистрирован: 16 Апрель 2013, 16:34

WHAT() WHO() и dll

Сообщение Dark_Stranger »

Yufil писал(а): Дык, exe-файл начинает работу с инициализации среды, в том числе создания разного рода контейнеров, пулов, стеков и прочего имущества для clarion runtime. Можем ли мы быть уверены, что программа на Delphi корректно подготовит среду исполнения программы на Clarion?
Так почему тогда запись N-1 отрабатывает без ошибки, а запись N уходит в ошибку
Set(SP:KEY1, SP:KEY1)
SP:N = 90
Loop
Next(Spool)
If error() break.
if SP:N > 101 then break.
FIELD_NUMBER = 1
Loop ....
If Spools{PROP:TYPE, FIELD_NUMBER} <> 'GROUP' Then
CurrentField &= WHAT(Sp:Record, FIELD_NUMBER)
Stop(CurrentField)
FIELD_NUMBER += 1
.
.
При записи равной SP:N < 101 Stop(CurrentField) отработает без ошибки (причем SP:Field7 = 0 ), а при записи SP:N = 101 на поле SP:Field7 приведет к возникновению ошибки, причем приведет к ошибки только если SP:Field7 = 0 если SP:Field7 <> 0 ОШИБКИ НЕ БУДЕТ


P.S.: Все что делает dll (или исходник вкратце)
procedure export(),PASCAL
REC_COUNT LONG
FIELD_NUMBER LONG
CurrentField ANY
code
REC_COUNT = 0
Open(Spools)
Set(SP:KEY1, SP:KEY1)
SP:N = Loc:X
Loop
Next(Spool)
If error() break.
if SP:N > 101 then break.
FIELD_NUMBER = 1
Loop while Clip(Left(WHO(Sp:Record, FIELD_NUMBER))) <> ''
If Spools{PROP:TYPE, FIELD_NUMBER} <> 'GROUP' Then
CurrentField &= WHAT(Sp:Record, FIELD_NUMBER)
Stop(CurrentField)
FIELD_NUMBER += 1
.
REC_COUNT += 1
If REC_COUNT > 100 Then Loc:X = SP:N; break .
.
Close(Spools)

Чего там еще инициализировать?
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

WHAT() WHO() и dll

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

Может в Дельфях вызвать AttachThreadToClarion?
С уважением, ДП
Dark_Stranger
Новичок
Сообщения: 17
Зарегистрирован: 16 Апрель 2013, 16:34

WHAT() WHO() и dll

Сообщение Dark_Stranger »

Дед Пахом писал(а): Может в Дельфях вызвать AttachThreadToClarion?
С чем его едят?
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

WHAT() WHO() и dll

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

В справке подробно написано.
С уважением, ДП
Ответить