|
06.03.2012, 01:12
|
#1
|
Знающий
Регистрация: 18.02.2008
Сообщений: 276
Написано 121 полезных сообщений (для 299 пользователей)
|
Передача структуры из блица
Проблема с передачей структуры из блица
В decls функция объявлена так:
alGetEvent% (event__*) : "_GetEvent@4"
если в нее передать структуру, т.е. тип
Type MyTpye
...
End Type
t.MyTpye = new MyTpye
alGetEvent(t)
То все ок, но если туда передать пустой тип (Null) или ноль (0), то вылетает MAV
Причем MAV вылетает не со стороны функции alGetEvent, т.к. там этот указатель просто не используется, а именно со стороны блица.
Можно как-то решить эту проблему? Необходимо передать именно нулевой указатель.
|
(Offline)
|
|
06.03.2012, 01:33
|
#2
|
Мастер
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений (для 504 пользователей)
|
Ответ: Передача структуры из блица
Покажи в dll исходник функции alGetEvent и что она и как передаёт обратно.
MAV вылетает именно со стороны блица.
|
Может Блитзу несуществующее данное выдаётся..
Или же тупо где-то float с integer перекосячились.
alGetEvent(t) передаст цифру (номер указателя) типа 38093845, т.е. t=38093845
а не структуру MyTpye (или это Handle() такое выдаёт?)
|
(Offline)
|
|
06.03.2012, 08:05
|
#3
|
Нуждающийся
Регистрация: 05.10.2011
Адрес: Россия, Южно-Сахалинск
Сообщений: 66
Написано 42 полезных сообщений (для 83 пользователей)
|
Ответ: Передача структуры из блица
Сообщение от wolfhound512
если туда передать пустой тип (Null) или ноль (0), то вылетает MAV
|
Это баг компилятора, т.к. * - передача указателя на данные, в результате с Null получается такое:
sub esp, $00000004
mov eax, [_GetEvent@4]
mov ebx, $00000000
mov ebx, [ebx]
mov [esp], ebx
call eax
Сообщение от wolfhound512
Можно как-то решить эту проблему? Необходимо передать именно нулевой указатель.
|
Выделяешь экземпляр любого тайп (или создаешь банк на 4 байта) и по смещению 4 записываешь туда 0, естессно из библиотеки:
Local MyNull% = CreateBank ( 4 )
PokeI ( MyNull + 4, 0 )
где PokeI соответственно
void PokeI ( int * Address, int Value )
{
*Address = Value;
}
.lib "..."
PokeI ( Address%, Value% )
ну или как-то по другому из своей библиотеки, смысл думаю понятен.
|
(Offline)
|
|
Эти 5 пользователя(ей) сказали Спасибо Платон Александрович за это полезное сообщение:
|
|
06.03.2012, 12:05
|
#4
|
ПроЭктировщик
Регистрация: 26.06.2007
Сообщений: 194
Написано 21 полезных сообщений (для 25 пользователей)
|
Ответ: Передача структуры из блица
Сообщение от wolfhound512
Можно как-то решить эту проблему? Необходимо передать именно нулевой указатель.
|
Всмысле, тебе нужно передать ссылку на несуществующий тип?
Может ты имел ввиду чтобы когда случайно передают ссылку на несуществующий тип то небыло МАВ? Тогда If t<>null юзай...
|
(Offline)
|
|
06.03.2012, 12:56
|
#5
|
Знающий
Регистрация: 18.02.2008
Сообщений: 276
Написано 121 полезных сообщений (для 299 пользователей)
|
Ответ: Передача структуры из блица
Платон, спасибо.
Сделал так:
Type sEvent
Field object_
Field type_%
End Type
Global sEvent_Null.sEvent = New sEvent
alPokeI( int(sEvent_Null), 0 ) ;[В типах указатель на данные лежит без смещения]
Function alGetEvent% (event__.sEvent)
If (event__ = Null) Then event__ = sEvent_Null
return alGetEvent_(event__)
End Function
|
(Offline)
|
|
06.03.2012, 15:09
|
#6
|
Нуждающийся
Регистрация: 05.10.2011
Адрес: Россия, Южно-Сахалинск
Сообщений: 66
Написано 42 полезных сообщений (для 83 пользователей)
|
Ответ: Передача структуры из блица
Сообщение от wolfhound512
alPokeI( int(sEvent_Null), 0 )
|
Кстати хорошо что упомянул приведение к Int, есть полезный трюк - приведение к Int и сравнение с нулем намного быстрее чем прямое сравнение с Null (т.к. для универсальности используется отдельная функция сравнения экземпляров тайпа), разница видна невооруженным глазом:
If SomeObject = Null Then DoSomething
выхлоп:
sub esp, $00000008
mov eax, [SomeObject]
mov [esp], eax
mov [esp + 4], $00000000
call $00945D40 ; сравнение двух экземпляров, в данном случае с нулем
cmp eax, $00000000
jnz SkipDoSomething
DoSomething
.SkipDoSomething
If Int( SomeObject ) = 0 Then DoSomething
выхлоп:
cmp [SomeObject], $00000000
jnz SkipDoSomething
DoSomething
.SkipDoSomething
Блиц такой блиц
Последний раз редактировалось Платон Александрович, 06.03.2012 в 16:10.
Причина: Опечатки
|
(Offline)
|
|
Эти 6 пользователя(ей) сказали Спасибо Платон Александрович за это полезное сообщение:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:37.
|