forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   пример (http://forum.boolean.name/showthread.php?t=1523)

GoodWin 19.09.2006 16:36

пример
 
Помогите плиз

в Блитце есть тип
Type a
Field x
Fiels y
Fiels z
End Type

Скажите как мне передать в ДЛЛ этот тип, в ДЛЛке допустим назначить новые значения поля объектам этого типа и вернуть все в блитц

Или например:
в блитце вызываем функцию из ДЛЛ
DistanceCamera(PosCamX,PosCamY,PosCamZ),
которая определяет нужно ли включать в тип и передавать в блитц данные об объектах Type'а а
и только полученные объекты рендерить

Если не трудно
объясните на примере.. в коде...(BLITZ3D, c++)

ДЛЛ хочу писать на с++

заранее спасибки за помощь...

tormoz 19.09.2006 17:02

Re: пример
 
Самое простое - передать хендл типа - это будет адрес начала. далее расчитываешь смещения для переменных (см исследования МихаилаВ)
Просто в длл меняешь их значения и ничего возвращать не нужно

GoodWin 19.09.2006 17:10

Re: пример
 
Цитата:

Сообщение от tormoz
Самое простое - передать хендл типа - это будет адрес начала. далее расчитываешь смещения для переменных (см исследования МихаилаВ)
Просто в длл меняешь их значения и ничего возвращать не нужно

:) подскажи как... ну пример функции на с++ что-ли, я так быстрее пойму... плиз....

alcoSHoLiK 19.09.2006 17:14

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"


GoodWin 19.09.2006 17:46

Re: пример
 
спасибо... понял...но вытекает следующий вопрос...

получается список типа Tlist состоит из одного элемента, значение полей которого мы и меняем в длл...правильно...

а как сделать так чтобы длл возвращала определенное кол-во элементов списка типа Tlist
т.е. пример: в БД есть список игроков в кол-ве 2000 шт с определенными координатами
дллка читает БД определяет колво игроков, находящихся на расстоянии 10 от камеры, и только эти игроки (например - 20) и должны быть отрендерены в блитце
так вот как отдать из длл список типа Tlist нужного кол-ва ?

мысль: зачем гонять список типа из 2000 элементов, если можно перебрать только 20?

alcoSHoLiK 19.09.2006 18:53

Re: пример
 
Цитата:

Сообщение от GoodWin
т.е. пример: в БД есть список игроков в кол-ве 2000 шт с определенными координатами
дллка читает БД определяет колво игроков, находящихся на расстоянии 10 от камеры, и только эти игроки (например - 20) и должны быть отрендерены в блитце
так вот как отдать из длл список типа Tlist нужного кол-ва ?

мысль: зачем гонять список типа из 2000 элементов, если можно перебрать только 20?

Вообще все это можно ореализовать на Блице, а в DLL посылать только нужные 20 элементов.

Если же хочется в DLL, то синхронизируй создание новых экземпляров типа в DLL и на Блице. Потом работай с элементами нужных тебе экземпляров в DLL и "посылай" их в Блиц.

GoodWin 19.09.2006 22:00

Re: пример
 
Цитата:

Сообщение от alcoSHoLiK
Вообще все это можно ореализовать на Блице, а в DLL посылать только нужные 20 элементов.

Если же хочется в DLL, то синхронизируй создание новых экземпляров типа в DLL и на Блице. Потом работай с элементами нужных тебе экземпляров в DLL и "посылай" их в Блиц.

т.е. перебрать список типа из 2000-10000 элементов...сравнить и двадцать элементов передать в длл для того чтобы поменять значение полей?

я то думал возможно наоборот в дллке получить из базы данных список, прогнать через условие и элементы, удовлетворящие условию, послать в блитц...
а так, придется сначала через длл определять кол-во элементов а уже потом в цикле из длл работать с полями.... криво как-то

alcoSHoLiK 19.09.2006 22:26

Re: пример
 
Возможно все, если четко сформулировать задачу.

Если ты хочешь в Блиц послать только 20 элементов, то кто тебе мешает сделать это следующим образом:
[highlight=blitzbasic]
CallDllFunction() ;в этот момент происходит работа дллки с БД
...
while DllResult()
var.TList = New TList
DLLFunction(var)
wend
[/highlight]

Суть в том, что дллка подготавливает всю необходимую информацию. Допустим в результате вызова CallDllFunction() произошло считывание из БД, выборка результатов и занесение их в массив определенного пользователем типа.
Код:

list* data[20];
Необходимо создать переменную, которая будет подсчитывать количество найденных элементов, отвечающих заданному требованию. В конце обработки в это переменной будет хранится число 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;
  //...
}

Разумеется в описанном тобой случае нужно работать с динамической памятью. Я описал лишь возможный принцип действия.

GoodWin 19.09.2006 22:49

Re: пример
 
Цитата:

Сообщение от alcoSHoLiK
Возможно все, если четко сформулировать задачу.

Разумеется в описанном тобой случае нужно работать с динамической памятью. Я описал лишь возможный принцип действия.

А как с ней работать, если не тудно объясни....

alcoSHoLiK 20.09.2006 01:27

Re: пример
 
В MSDN ищи описания для: 1) malloc, realloc, free для С и 2) new, new[], delete, delete[] для C++.

GoodWin 03.11.2006 20:46

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;
  };
 };
};

При попытке обращения к длл вылетает... как быть?
или я ерунду пытаюсь сделать?

alcoSHoLiK 07.11.2006 22:40

Re: пример
 
Во-первых, что это за безобразие?!
Цитата:

for(int a=1;1000000;a++)

for(int i=1;10;i++)
Во-вторых, адрес структуры Part в длл не совпадает с адресом
Part в проге на Блице. Оно-то структуру в длл изменит, но придется ухищрятся, чтобы получить необходимые x и y.

А так, вообще, у меня на Блице выдает 2500 мс, а через DLL - 120 с чем-то :)

GoodWin 08.11.2006 10:19

Re: пример
 
Цитата:

Во-первых, что это за безобразие?!
Цитата:
for(int a=1;1000000;a++)

for(int i=1;10;i++)

Первый цикл для теста, второй для перебора массива...
или я неправильно опреатор использую?
Цитата:

Во-вторых, адрес структуры Part в длл не совпадает с адресом
Part в проге на Блице. Оно-то структуру в длл изменит, но придется ухищрятся, чтобы получить необходимые x и y.
т.е. надо как-то получить адрес структуры Парт и только потом работать с ней? а как это сделать? :(
Цитата:

А так, вообще, у меня на Блице выдает 2500 мс, а через DLL - 120 с чем-то
Т.Е. у тебя работает, а пример показать не трудно... плиз

impersonalis 08.11.2006 13:55

Re: пример
 
Цитата:

for(int a=1;a<=1000000;a++)
И что у всех за привычка ставить точку с запятой после операторных скобок цикла?! В каждой 2ой программе. Не надо.

jimon 08.11.2006 16:47

Re: пример
 
GoodWin
совет - сначала лутче научись на C++ прогать
потом уже сойденение либ делай

а то еще чисто философский цикл
Код:

#define правда true
#define правдой true
#define пока while (
#define есть ==
#define то ) {
#define вот_так_вот }
#define правда_нихера_не_правда break;

пока правда есть правдой то
std::cout << "hello world ! :)\n";
правда_нихера_не_правда
вот_так_вот

название юникодом вроде препроцесор msvc2005 разбирает


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

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