Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D

Ответ
 
Опции темы
Старый 06.03.2012, 01:12   #1
wolfhound512
Знающий
 
Аватар для wolfhound512
 
Регистрация: 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, т.к. там этот указатель просто не используется, а именно со стороны блица.

Можно как-то решить эту проблему? Необходимо передать именно нулевой указатель.
__________________
GUI, GUIw512, AlbaLynx, Форум
(Offline)
 
Ответить с цитированием
Старый 06.03.2012, 01:33   #2
LLI.T.A.L.K.E.R.
Мастер
 
Аватар для LLI.T.A.L.K.E.R.
 
Регистрация: 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 пользователя(ей) сказали Спасибо Платон Александрович за это полезное сообщение:
Harter (06.03.2012), HolyDel (06.03.2012), musetdima (18.07.2012), St_AnGer (06.03.2012), wolfhound512 (06.03.2012)
Старый 06.03.2012, 12:05   #4
Crayzi
ПроЭктировщик
 
Регистрация: 26.06.2007
Сообщений: 194
Написано 21 полезных сообщений
(для 25 пользователей)
Ответ: Передача структуры из блица

Сообщение от wolfhound512 Посмотреть сообщение
Можно как-то решить эту проблему? Необходимо передать именно нулевой указатель.
Всмысле, тебе нужно передать ссылку на несуществующий тип?
Может ты имел ввиду чтобы когда случайно передают ссылку на несуществующий тип то небыло МАВ? Тогда If t<>null юзай...
(Offline)
 
Ответить с цитированием
Старый 06.03.2012, 12:56   #5
wolfhound512
Знающий
 
Аватар для wolfhound512
 
Регистрация: 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
__________________
GUI, GUIw512, AlbaLynx, Форум
(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 пользователя(ей) сказали Спасибо Платон Александрович за это полезное сообщение:
Harter (06.03.2012), LLI.T.A.L.K.E.R. (13.03.2012), musetdima (18.07.2012), St_AnGer (06.03.2012), wolfhound512 (06.03.2012), Жека (14.03.2012)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com