|
19.09.2006, 16:36
|
#1
|
ПроЭктировщик
Регистрация: 14.08.2006
Сообщений: 105
Написано 15 полезных сообщений (для 19 пользователей)
|
пример
Помогите плиз
в Блитце есть тип
Type a
Field x
Fiels y
Fiels z
End Type
Скажите как мне передать в ДЛЛ этот тип, в ДЛЛке допустим назначить новые значения поля объектам этого типа и вернуть все в блитц
Или например:
в блитце вызываем функцию из ДЛЛ
DistanceCamera(PosCamX,PosCamY,PosCamZ),
которая определяет нужно ли включать в тип и передавать в блитц данные об объектах Type'а а
и только полученные объекты рендерить
Если не трудно
объясните на примере.. в коде...(BLITZ3D, c++)
ДЛЛ хочу писать на с++
заранее спасибки за помощь...
|
(Offline)
|
|
19.09.2006, 17:02
|
#2
|
Гигант индустрии
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений (для 4,437 пользователей)
|
Re: пример
Самое простое - передать хендл типа - это будет адрес начала. далее расчитываешь смещения для переменных (см исследования МихаилаВ)
Просто в длл меняешь их значения и ничего возвращать не нужно
__________________
|
(Offline)
|
|
19.09.2006, 17:10
|
#3
|
ПроЭктировщик
Регистрация: 14.08.2006
Сообщений: 105
Написано 15 полезных сообщений (для 19 пользователей)
|
Re: пример
Сообщение от tormoz
Самое простое - передать хендл типа - это будет адрес начала. далее расчитываешь смещения для переменных (см исследования МихаилаВ)
Просто в длл меняешь их значения и ничего возвращать не нужно
|
подскажи как... ну пример функции на с++ что-ли, я так быстрее пойму... плиз....
|
(Offline)
|
|
19.09.2006, 17:14
|
#4
|
Дэвелопер
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений (для 110 пользователей)
|
Re: пример
Visual Studio:
Создаешь новый проект Win32 Dynamic-Link Library. Проект долджен быть пустым. После создания добавляешь cpp файл. В нем пишешь:
[highlight=cpp]
#define BLITZDECL extern "C" _declspec(dllexport)
struct list {
int a;
float b;
};
BLITZDECL void _stdcall DLLFunction(list* var)
{
var->a = var->a + 10;
var->b = var->b - 0.6f;
}
[/highlight]
BlitzBasic:
[highlight=blitzbasic]
Type TList
Field int_val%
Field float_val#
End Type
var.TList = New TList
var\int_val = 5
var\float_val = 7.3
Print var\int_val
Print var\float_val
Print
WaitKey()
DLLFunction(var)
Print var\int_val
Print var\float_val
Print
WaitKey()
Delete Each TList
End
[/highlight]
decls-файл:
.lib "dll.dll"
DLLFunction(void*):"_DLLFunction@4"
|
(Offline)
|
|
19.09.2006, 17:46
|
#5
|
ПроЭктировщик
Регистрация: 14.08.2006
Сообщений: 105
Написано 15 полезных сообщений (для 19 пользователей)
|
Re: пример
спасибо... понял...но вытекает следующий вопрос...
получается список типа Tlist состоит из одного элемента, значение полей которого мы и меняем в длл...правильно...
а как сделать так чтобы длл возвращала определенное кол-во элементов списка типа Tlist
т.е. пример: в БД есть список игроков в кол-ве 2000 шт с определенными координатами
дллка читает БД определяет колво игроков, находящихся на расстоянии 10 от камеры, и только эти игроки (например - 20) и должны быть отрендерены в блитце
так вот как отдать из длл список типа Tlist нужного кол-ва ?
мысль: зачем гонять список типа из 2000 элементов, если можно перебрать только 20?
|
(Offline)
|
|
19.09.2006, 18:53
|
#6
|
Дэвелопер
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений (для 110 пользователей)
|
Re: пример
Сообщение от GoodWin
т.е. пример: в БД есть список игроков в кол-ве 2000 шт с определенными координатами
дллка читает БД определяет колво игроков, находящихся на расстоянии 10 от камеры, и только эти игроки (например - 20) и должны быть отрендерены в блитце
так вот как отдать из длл список типа Tlist нужного кол-ва ?
мысль: зачем гонять список типа из 2000 элементов, если можно перебрать только 20?
|
Вообще все это можно ореализовать на Блице, а в DLL посылать только нужные 20 элементов.
Если же хочется в DLL, то синхронизируй создание новых экземпляров типа в DLL и на Блице. Потом работай с элементами нужных тебе экземпляров в DLL и "посылай" их в Блиц.
|
(Offline)
|
|
19.09.2006, 22:00
|
#7
|
ПроЭктировщик
Регистрация: 14.08.2006
Сообщений: 105
Написано 15 полезных сообщений (для 19 пользователей)
|
Re: пример
Сообщение от alcoSHoLiK
Вообще все это можно ореализовать на Блице, а в DLL посылать только нужные 20 элементов.
Если же хочется в DLL, то синхронизируй создание новых экземпляров типа в DLL и на Блице. Потом работай с элементами нужных тебе экземпляров в DLL и "посылай" их в Блиц.
|
т.е. перебрать список типа из 2000-10000 элементов...сравнить и двадцать элементов передать в длл для того чтобы поменять значение полей?
я то думал возможно наоборот в дллке получить из базы данных список, прогнать через условие и элементы, удовлетворящие условию, послать в блитц...
а так, придется сначала через длл определять кол-во элементов а уже потом в цикле из длл работать с полями.... криво как-то
|
(Offline)
|
|
19.09.2006, 22:26
|
#8
|
Дэвелопер
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений (для 110 пользователей)
|
Re: пример
Возможно все, если четко сформулировать задачу.
Если ты хочешь в Блиц послать только 20 элементов, то кто тебе мешает сделать это следующим образом:
[highlight=blitzbasic]
CallDllFunction() ;в этот момент происходит работа дллки с БД
...
while DllResult()
var.TList = New TList
DLLFunction(var)
wend
[/highlight]
Суть в том, что дллка подготавливает всю необходимую информацию. Допустим в результате вызова CallDllFunction() произошло считывание из БД, выборка результатов и занесение их в массив определенного пользователем типа.
Необходимо создать переменную, которая будет подсчитывать количество найденных элементов, отвечающих заданному требованию. В конце обработки в это переменной будет хранится число 20.
[highlight=cpp]
int result_num=0;
[/highlight]
Функция DllResult() возвращает значение result_num.
[highlight=cpp]
int DllResult() { return result_num; }
[/highlight]
А сама DLLFunction работает с текущим элементом.
void DLLFunction(list* var)
{
result_num--;
var->a = data[result_num]->a;
var->b = data[result_num]->b;
//...
}
Разумеется в описанном тобой случае нужно работать с динамической памятью. Я описал лишь возможный принцип действия.
|
(Offline)
|
|
19.09.2006, 22:49
|
#9
|
ПроЭктировщик
Регистрация: 14.08.2006
Сообщений: 105
Написано 15 полезных сообщений (для 19 пользователей)
|
Re: пример
Сообщение от alcoSHoLiK
Возможно все, если четко сформулировать задачу.
Разумеется в описанном тобой случае нужно работать с динамической памятью. Я описал лишь возможный принцип действия.
|
А как с ней работать, если не тудно объясни....
|
(Offline)
|
|
20.09.2006, 01:27
|
#10
|
Дэвелопер
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений (для 110 пользователей)
|
Re: пример
В MSDN ищи описания для: 1) malloc, realloc, free для С и 2) new, new[], delete, delete[] для C++.
|
(Offline)
|
|
03.11.2006, 20:46
|
#11
|
ПроЭктировщик
Регистрация: 14.08.2006
Сообщений: 105
Написано 15 полезных сообщений (для 19 пользователей)
|
Re: пример
Люди, помогите плиз....
Вот код...
Блитц
Const MAX%=10
Type Part
Field x
Field y
End Type
Type EM
Field count%
Field s.Part[MAX%]
End Type
p.EM=New EM
p\count=10
Print "p\count-"+p\count
For i=1 To 10
p\s.Part[i]=New Part
p\s.Part[i]\x=Rand(100)
Print "p\s.Part["+I+"]\x -"+p\s.Part[i]\x
p\s.Part[i]\y=Rand(100)
Print "p\s.Part["+I+"]\y -"+p\s.Part[i]\y
Next
WaitKey()
c.EM =Last EM
m=MilliSecs()
For a=1 To 1000000
For i=1 To 10
c\s.Part[i]\x=1
c\s.Part[i]\y=2
Next
Next
m=MilliSecs()-m
Print "M="+m
WaitKey()
m=MilliSecs()
Update(c)
m=MilliSecs()-m
Print "M="+m
WaitKey()
Delete Each Part
Delete Each EM
End
MSVC++ (DLL)
#define B3DDLL extern "C" _declspec(dllexport)
const MAX=10;
struct Part
{
int x;
int y;
};
struct EM
{
int count;
Part c[MAX];
};
B3DDLL void _stdcall Update(EM* v)
{
for(int a=1;1000000;a++)
{
for(int i=1;10;i++)
{
v->c[i].x=1;
v->c[i].y=2;
};
};
};
При попытке обращения к длл вылетает... как быть?
или я ерунду пытаюсь сделать?
|
(Offline)
|
|
07.11.2006, 22:40
|
#12
|
Дэвелопер
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений (для 110 пользователей)
|
Re: пример
Во-первых, что это за безобразие?!
for(int a=1;1000000;a++)
for(int i=1;10;i++)
|
Во-вторых, адрес структуры Part в длл не совпадает с адресом
Part в проге на Блице. Оно-то структуру в длл изменит, но придется ухищрятся, чтобы получить необходимые x и y.
А так, вообще, у меня на Блице выдает 2500 мс, а через DLL - 120 с чем-то
|
(Offline)
|
|
08.11.2006, 10:19
|
#13
|
ПроЭктировщик
Регистрация: 14.08.2006
Сообщений: 105
Написано 15 полезных сообщений (для 19 пользователей)
|
Re: пример
Во-первых, что это за безобразие?!
Цитата:
for(int a=1;1000000;a++)
for(int i=1;10;i++)
|
Первый цикл для теста, второй для перебора массива...
или я неправильно опреатор использую?
Во-вторых, адрес структуры Part в длл не совпадает с адресом
Part в проге на Блице. Оно-то структуру в длл изменит, но придется ухищрятся, чтобы получить необходимые x и y.
|
т.е. надо как-то получить адрес структуры Парт и только потом работать с ней? а как это сделать?
А так, вообще, у меня на Блице выдает 2500 мс, а через DLL - 120 с чем-то
|
Т.Е. у тебя работает, а пример показать не трудно... плиз
|
(Offline)
|
|
08.11.2006, 13:55
|
#14
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Re: пример
for(int a=1;a<=1000000;a++)
|
И что у всех за привычка ставить точку с запятой после операторных скобок цикла?! В каждой 2ой программе. Не надо.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
08.11.2006, 16:47
|
#15
|
|
Re: пример
GoodWin
совет - сначала лутче научись на C++ прогать
потом уже сойденение либ делай
а то еще чисто философский цикл
#define правда true
#define правдой true
#define пока while (
#define есть ==
#define то ) {
#define вот_так_вот }
#define правда_нихера_не_правда break;
пока правда есть правдой то
std::cout << "hello world ! :)\n";
правда_нихера_не_правда
вот_так_вот
название юникодом вроде препроцесор msvc2005 разбирает
|
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:18.
|