|
15.11.2013, 19:47
|
#1
|
ПроЭктировщик
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений (для 9 пользователей)
|
Непостоянная ошибка
Я не знаю, куда конкретно закралась ошибка, поэтому пишу оба кода. Blitz-евский код с подключённой библиотекой работает непостоянно: иногда запускается, иногда выдаёт MAV. Знает кто, что это за фигня?
Graphics3D 800,600,32,2
SetBuffer BackBuffer()
cam = CreateCamera()
PositionEntity cam,0,0,-10
plane = CreatePlane()
EntityColor plane,0,100,100
PositionEntity plane,0,-1,0
sphere1 = CreateSphere()
EntityColor sphere1,150,0,0
sphere2 = CreateSphere()
EntityColor sphere2,0,0,150
sphere3 = CreateSphere()
EntityColor sphere3,0,150,0
r1 = dpCreateArea(1,1)
r2 = dpCreateArea(1,1)
r3 = dpCreateArea(1,1)
While Not KeyHit(1)
dpAttachEntity(sphere1,r1)
dpAttachEntity(sphere2,r2)
dpAttachEntity(sphere3,r3)
dpPropelArea(r1,1,0,1)
dpPropelArea(r2,-1,0,1)
dpPropelArea(r3,0,0,1)
dpUpdateAreas()
UpdateWorld()
RenderWorld()
Flip
Wend
End
Structure Object
num.i
type.i
mass.f
xPos.f
yPos.f
zPos.f
xSc.f
ySc.f
zSc.f
xRot.f
yRot.f
zRot.f
xSp.f
ySp.f
zSp.f
EndStructure
Global NewMap Objects.Object()
Global num.i = 0
;==========Procedures==========;
ProcedureDLL.f dpCreateArea(type.i,mass.f)
AddMapElement(Objects(),Str(num))
Objects()\num = num
Objects()\type = type
Objects()\mass = mass
Objects()\xPos = 0
Objects()\yPos = 0
Objects()\zPos = 0
Objects()\xSc = 1
Objects()\ySc = 1
Objects()\zSc = 1
Objects()\xRot = 0
Objects()\yRot = 0
Objects()\zRot = 0
Objects()\xSp = 0
Objects()\ySp = 0
Objects()\zSp = 0
Protected *area = AllocateMemory(56)
PokeI(*area,Objects()\num)
PokeI(*area + 4,Objects()\type)
PokeF(*area + 8,Objects()\mass)
PokeF(*area + 12,Objects()\xPos)
PokeF(*area + 16,Objects()\yPos)
PokeF(*area + 20,Objects()\zPos)
PokeF(*area + 24,Objects()\xSc)
PokeF(*area + 28,Objects()\ySc)
PokeF(*area + 32,Objects()\zSc)
PokeF(*area + 36,Objects()\xRot)
PokeF(*area + 40,Objects()\yRot)
PokeF(*area + 44,Objects()\zRot)
PokeF(*area + 48,Objects()\xSp)
PokeF(*area + 52,Objects()\ySp)
PokeF(*area + 56,Objects()\zSp)
num = num + 1
ProcedureReturn *area
EndProcedure
ProcedureDLL.f dpAttachEntity(*entity,*area)
FindMapElement(Objects(),Str(PeekI(*area)))
PokeF(*area + 12,Objects()\xPos)
PokeF(*area + 16,Objects()\yPos)
PokeF(*area + 20,Objects()\zPos)
PokeI(*entity + 44,-1)
PokeF(*entity + 64,PeekF(*area + 12))
PokeF(*entity + 68,PeekF(*area + 16))
PokeF(*entity + 72,PeekF(*area + 20))
EndProcedure
ProcedureDLL.f dpUpdateAreas()
ForEach Objects()
Objects()\xPos = Objects()\xPos + Objects()\xSp
Objects()\yPos = Objects()\yPos + Objects()\ySp
Objects()\zPos = Objects()\zPos + Objects()\zSp
Next
EndProcedure
ProcedureDLL.f dpMoveArea(*area,x.f,y.f,z.f)
FindMapElement(Objects(),Str(PeekI(*area)))
Objects()\xPos = Objects()\xPos + x
Objects()\yPos = Objects()\yPos + y
Objects()\zPos = Objects()\zPos + z
EndProcedure
ProcedureDLL.f dpPropelArea(*area,fx.f,fy.f,fz.f)
FindMapElement(Objects(),Str(PeekI(*area)))
Protected m.f = Objects()\mass * 1000
Objects()\xSp = Objects()\xSp + fx / m
Objects()\ySp = Objects()\ySp + fy / m
Objects()\zSp = Objects()\zSp + fz / m
EndProcedure
__________________
|
(Offline)
|
|
15.11.2013, 20:52
|
#2
|
ПроЭктировщик
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений (для 9 пользователей)
|
Ответ: Непостоянная ошибка
Как мне кажется, Blitz как-то неправильно понимает команду dpCreateArea(type.i,mass.f), если функция была применена единожды, то всё нормально работает, если больше, то глючит MAV-ом. Ошибка от заданных параметров не зависит: проверял.
UPD. Похоже, что Blitz запускает новую функцию, не дожидаясь окончания старой. Есть способы это решить?
__________________
|
(Offline)
|
|
15.11.2013, 21:33
|
#3
|
Знающий
Регистрация: 06.12.2010
Адрес: Луганск
Сообщений: 252
Написано 112 полезных сообщений (для 166 пользователей)
|
Ответ: Непостоянная ошибка
Первое что бросается в глаза - ты не обрабатываешь возможные ошибки в AddMapElement и FindMapElement.
if FindMapElement(Map(), Key$)
элемент есть - работаем
else
элемента нет - с этим надо что-то делать
endif
чтобы сказать что-то подробней нужно гонять программу в дебагере и смотреть что там происходит.
__________________
AMD Sempron(tm) 1.41Ггц, 1024МБ ОЗУ, GeForce 6200 128МБ, WinXP SP3.
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо RBK за это полезное сообщение:
|
|
15.11.2013, 21:44
|
#4
|
ПроЭктировщик
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений (для 9 пользователей)
|
Ответ: Непостоянная ошибка
Спасибо! Поработать с дебаггером было хорошим советом. Проблема была в недостаточном выделении памяти для параметров объектов(надо было не 56 байт, как я выделял, а 60). Обработку ошибок учту.
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
16.11.2013, 14:10
|
#5
|
ПроЭктировщик
Регистрация: 14.01.2012
Адрес: Зеленоград
Сообщений: 192
Написано 5 полезных сообщений (для 9 пользователей)
|
Ответ: Непостоянная ошибка
Чтобы раздел не захламлять, напишу сюда. Возникла ещё проблема: я создал команду dpPositionArea, аналогичную Blitz-евской PositionEntity, если её использовать не более, чем дважды, вне цикла, то всё работает, если больше, то Blitz зависает на чёрном экране(помогает задержка, но чем чаще команду используешь, тем продолжительней она нужна(например, для 3-й - 400мс)). Интересно, что в цикле никаких проблем не возникает. С чем это может быть связано?
P.S. Дебаггер Барсика ошибок не выявил.
ProcedureDLL.f dpPositionArea(*area,xPos.f,yPos.f,zPos.f)
If FindMapElement(Objects(),Str(PeekI(*area)))
Objects()\xPos = xPos
Objects()\yPos = yPos
Objects()\zPos = zPos
Else
error = 1
EndIf
EndProcedure
Graphics3D 800,600,32,2
SetBuffer BackBuffer()
arial = LoadFont("arial",20,True)
SetFont arial
cam = CreateCamera()
PositionEntity cam,0,0,-10
plane = CreatePlane()
EntityColor plane,0,100,100
PositionEntity plane,0,-1,0
sphere1 = CreateSphere()
EntityColor sphere1,150,0,0
sphere2 = CreateSphere()
EntityColor sphere2,0,0,150
sphere3 = CreateSphere()
EntityColor sphere3,0,150,0
sphere4 = CreateSphere()
EntityColor sphere4,150,0,0
r1 = dpCreateArea(0,10)
r2 = dpCreateArea(0,2)
r3 = dpCreateArea(0,3)
dpPositionArea(r1,0,0,0)
dpPositionArea(r2,0,0,0)
dpPositionArea(r3,0,0,0)
While Not dpControlErrors() <> 0 Or KeyHit(1)
If KeyDown(17)
dpPropelArea(r1,1,0,0)
EndIf
dpAttachEntity(sphere1,r1)
dpAttachEntity(sphere2,r2)
dpAttachEntity(sphere3,r3)
dpUpdateAreas()
UpdateWorld()
RenderWorld()
Flip
Wend
If dpControlErrors() <> 0
Print dpControlErrors()
EndIf
WaitKey()
End
UPD. Решается с помощью задержки в Blitz-е, а не в Барсике: для 9 команд подходит Delay(40)
__________________
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:24.
|