forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Blitz3D (http://forum.boolean.name/forumdisplay.php?f=45)
-   -   Передача структуры из блица (http://forum.boolean.name/showthread.php?t=16440)

wolfhound512 06.03.2012 01:12

Передача структуры из блица
 
Проблема с передачей структуры из блица
В decls функция объявлена так:
Код:

alGetEvent% (event__*) : "_GetEvent@4"
если в нее передать структуру, т.е. тип
Код:

Type MyTpye
...
End Type

t.MyTpye = new MyTpye
alGetEvent(t)

То все ок, но если туда передать пустой тип (Null) или ноль (0), то вылетает MAV
Причем MAV вылетает не со стороны функции alGetEvent, т.к. там этот указатель просто не используется, а именно со стороны блица.

Можно как-то решить эту проблему? Необходимо передать именно нулевой указатель.

LLI.T.A.L.K.E.R. 06.03.2012 01:33

Ответ: Передача структуры из блица
 
Покажи в dll исходник функции alGetEvent и что она и как передаёт обратно.
Цитата:

MAV вылетает именно со стороны блица.
Может Блитзу несуществующее данное выдаётся..

Или же тупо где-то float с integer перекосячились.

alGetEvent(t) передаст цифру (номер указателя) типа 38093845, т.е. t=38093845
а не структуру MyTpye (или это Handle() такое выдаёт?)

Платон Александрович 06.03.2012 08:05

Ответ: Передача структуры из блица
 
Цитата:

Сообщение от wolfhound512 (Сообщение 221753)
если туда передать пустой тип (Null) или ноль (0), то вылетает MAV

Это баг компилятора, т.к. * - передача указателя на данные, в результате с Null получается такое:
Код:

sub esp, $00000004
mov eax, [_GetEvent@4]


mov ebx, $00000000
mov ebx, [ebx]

mov [esp], ebx
call eax

Цитата:

Сообщение от wolfhound512 (Сообщение 221753)
Можно как-то решить эту проблему? Необходимо передать именно нулевой указатель.

Выделяешь экземпляр любого тайп (или создаешь банк на 4 байта) и по смещению 4 записываешь туда 0, естессно из библиотеки:
Код:

Local MyNull% = CreateBank ( 4 )

PokeI ( MyNull + 4, 0 )

где PokeI соответственно
Код:

void PokeI ( int * Address, int Value )
{
    *Address = Value;
}

Код:

.lib "..."
PokeI ( Address%, Value% )

ну или как-то по другому из своей библиотеки, смысл думаю понятен.

Crayzi 06.03.2012 12:05

Ответ: Передача структуры из блица
 
Цитата:

Сообщение от wolfhound512 (Сообщение 221753)
Можно как-то решить эту проблему? Необходимо передать именно нулевой указатель.

Всмысле, тебе нужно передать ссылку на несуществующий тип?
Может ты имел ввиду чтобы когда случайно передают ссылку на несуществующий тип то небыло МАВ? Тогда If t<>null юзай...

wolfhound512 06.03.2012 12:56

Ответ: Передача структуры из блица
 
Платон, спасибо.
Сделал так:
Код:

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


Платон Александрович 06.03.2012 15:09

Ответ: Передача структуры из блица
 
Цитата:

Сообщение от wolfhound512 (Сообщение 221783)
Код:

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

Блиц такой блиц :)


Часовой пояс GMT +4, время: 04:03.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot