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 разбирает

GoodWin 08.11.2006 17:10

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

Сообщение от jimon
GoodWin
совет - сначала лутче научись на C++ прогать

а ты наверно гигант в с++...
взял бы пример сделал и выложил бы...а говорить, что кто-то чего-то не знает любой может....
P.S. Вопрос админам: а можно ли добавить на форум кнопочку -противоположную кнопке "Спасибо"?

jimon 08.11.2006 17:34

Re: пример
 
причем тут я
я могу написать на C++ многое
но я никогда толком не писал либ для блица
и тем более незнаю чего ты хочеш

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

alcoSHoLiK 08.11.2006 18:35

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

Сообщение от GoodWin
Т.Е. у тебя работает, а пример показать не трудно... плиз

Вот работает, только, как я уже говорил, адрес Part в длл не совпадает с блицевским.

Код:

Const MAX% = 10

Type Part
        Field x
        Field y
End Type

Type EM
        Field count%
        Field s.Part[MAX%]
End Type

c.EM = New EM

m = MilliSecs()
For a = 1 To 1000000
        For i = 1 To 10
                c\s[i] = New Part
                c\s[i]\x = 3
                c\s[i]\y = 4
        Next
Next
m = MilliSecs() - m
Print "M = " + m

For i = 1 To 10
        Print "c\s[" + i + "]\x = " + c\s[i]\x + "        c\s[" + i + "]\y = " + c\s[i]\y
Next

WaitKey()

m = MilliSecs()
Update(c)
m = MilliSecs() - m
Print "M = " + m

For i = 1 To 10
        Print "c\s[" + i + "]\x = " + c\s[i]\x + "        c\s[" + i + "]\y = " + c\s[i]\y
Next

WaitKey()

Delete Each Part
Delete Each EM

End

Код:

#define BBDECL extern "C" _declspec(dllexport)

const int MAX = 10;

struct Part {
        int x;
        int y;
};

struct EM {
        int count;
        Part c[MAX];
};


BBDECL void _stdcall Update(EM* v)
{
        for (int a = 1; a <= 1000000; a++) {
                for (int i = 1; i <= 10; i++) {
                        v->c[i].x = 1;
                        v->c[i].y = 2;
                }
        }
}


GoodWin 08.11.2006 21:23

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

(int a = 1; a <= 1000000; a++)
ДА...
невнимателен я стал.....


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

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