Страница 1 из 1

Передать массив в качестве параметра.

СообщениеДобавлено: 09.05.2005 (Пн) 9:20
Денис Победря
Имеется массив Colors(2).
Функция glmaterialfv(%GL_Front,%GL_AMBIENT,_____) Где третий параметр - массив. Как правильно передать?

СообщениеДобавлено: 10.05.2005 (Вт) 19:55
X-BOND
Обычно так и передается:
glmaterialfv(%GL_Front,%GL_AMBIENT, Colors())
Еще зависит от декларации функции.

СообщениеДобавлено: 06.05.2007 (Вс) 7:20
SGO
Я вот тоже с проблемой передачи массива столкнулся... передачи из VB в DLL-ку написанную на PB, кгда запускаю приложение умирает вместе с VB.
Подскажите как правильно передать массив в DLL-ку?

СообщениеДобавлено: 06.05.2007 (Вс) 10:33
SGO
вот например:
Код на PB:
Код: Выделить всё
#COMPILE DLL "array.dll"
FUNCTION sum ALIAS "sum" (m()AS BYTE) EXPORT AS BYTE
    FUNCTION=m(0)+m(1)
END FUNCTION

Код на VB:
Код: Выделить всё
Private Declare Function sum Lib "c:\array.dll" (m() As Byte) As Byte

Private Sub Command1_Click()
    Dim m(1) As Byte
    m(0) = 2
    m(1) = 3
    MsgBox sum(m())
End Sub

Результат должен быть 5, а выходит 0[/code]

СообщениеДобавлено: 06.05.2007 (Вс) 10:41
GSerg
По ходу, весенняя эпидемия передачи массивов в dll.
И никто из заболевших даже не думает воспользоваться поиском.
Побочный, по всей видимости, эффект...
http://bbs.vbstreets.ru/viewtopic.php?t=32473
http://bbs.vbstreets.ru/viewtopic.php?t=32447

СообщениеДобавлено: 06.05.2007 (Вс) 10:51
SGO
1ая ссылка по делфи
2-ая по C++

СообщениеДобавлено: 06.05.2007 (Вс) 11:00
GSerg
Нет разницы.

И прекрати постить с интервалом в 2 минуты. Я тебе уже говорил об этом, кажется. Есть кнопка "правка".

СообщениеДобавлено: 06.05.2007 (Вс) 11:13
keks-n
SGO

ИМХО, из-за того, что в PB по дефолту - ByVal, а в VB-ByRef

СообщениеДобавлено: 06.05.2007 (Вс) 11:43
jangle
Я вот тоже с проблемой передачи массива столкнулся... передачи из VB в DLL-ку написанную на PB, кгда запускаю приложение умирает вместе с VB.
Подскажите как правильно передать массив в DLL-ку?


А примеры в дистрибутиве слабо посмотреть? Папка VB32

C:\PBWin80\Samples\VB32

СообщениеДобавлено: 06.05.2007 (Вс) 14:51
SGO
Так... с этим разобрался, спасибо всем:D. У меня ещё такой вопрос:
Можно ли как-нибудь этот самый массив привязать к длл-ке чтоб не передавать его каждый раз когда вызывается функция (просто она очень часто у меня вызывается), а чтоб он был глобальным и для VB и для TB? Я так полагаю что передача целого массива занимает очень много времени... А быть может при компиляции аргументы byref резервируются единажды? Это было бы логично...

СообщениеДобавлено: 06.05.2007 (Вс) 18:32
jangle
А какой смысл? У тебя, что в массиве данные постоянно одни и те же?
Если да, то действительно, можно один раз передать такой массив в функцию DLL.
Если данные, каждый раз новые, все равно прийдется передавать массив каждый раз заново.

СообщениеДобавлено: 07.05.2007 (Пн) 4:27
SGO
В том-то и дело что данные почти постоянные.. причём некоторая часть их обрабатывается в основной программе, а некоторая в длл-ке.
Хотя, в принципи, я так посмотрел, что быстродействия мне вполне пока хватает. Да ещё и задумка появилась вообще весь массив объявить в длл и не трогать его в основной программе.

Re: Передать массив в качестве параметра.

СообщениеДобавлено: 17.08.2011 (Ср) 1:55
spamjokester
А я передаю массивы из VB>PB для обращения и обработки их как указателей.
Примерно так:
'VB:

dim x(100000) as long
pv_sub_sort (x(0) )
msgbox x(100000)




PB:
#COMPILE DLL
#REGISTER NONE
sub pv_sub_sort alias "pv_sub_sort " (x as long) export

dim x_ptr as long ptr
x_ptr=varptr(x)
@x_ptr[100000]=1

end sub

Обьявление множества массивов в DLL при каждом ее вызове,это медленновато будет