Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Вопрос про указатели Добавлено: 05.05.04 13:35  

Автор вопроса:  Synther

Народ, помогите разобраться. С этим делом ещё не приходилось работать. Суть вот в чём:

Нужно передать параметры в функцию, в dll - переменная channel и 2 массива из трёх элементов Pos и vel. Проблема такая - указать Pos и vel нужно без индексов на элементы. А компиллер ругается, требует указывать индекс элементов, пишет про ByRef. 

'объявление функции следующее:

Public Declare Function FSOUND_3D_SetAttributes Lib "fmod.dll" Alias "_FSOUND_3D_SetAttributes@12" (ByVal channel As Long, ByRef Pos As Single, ByRef vel As Single) As Byte

Dim Pos1(0 To 2) As Single
Dim vel1(0 To 2) As Single

Dim set_3d As Byte

Pos1(0) = -1
Pos1(1) = -1
Pos1(2) = -1
vel1(0) = 0
vel1(1) = 0
vel1(2) = 0

'вызов функции
set_3d = FSOUND_3D_SetAttributes(0, Pos1, vel1)

-----------------------------------------------------T-------T

Подскажите, как обозначить параметры, plz!

 

Ответить

  Ответы Всего ответов: 16  

Номер ответа: 1
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #1
Добавлено: 05.05.04 17:08

На данный момент либо у тебя неверное определение функции, либо нужно указывать Pos1(0) и vel1(0)...

Ответить

Номер ответа: 2
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #2 Добавлено: 05.05.04 17:20

Да, прикольные вопросы сегодня. Один тип определяет внутри самого себя, другой массив передает как Single... Народ, сегодня что, магнитные бури что ли?

Ответить

Номер ответа: 3
Автор ответа:
 Synther



Вопросов: 1
Ответов: 1
 Профиль | | #3 Добавлено: 05.05.04 21:47

 Определения все правильные. Если указывать Pos1(0) и vel1(0), то будут посланы первые по индексу значения, а мне надо впихать сразу все элементы массива. Вот как выглядит пример  на делфи и си, тут всё просто. А как бы на бейсике?

function FSOUND_3D_SetAttributes(Channel: Integer; Pos: PFSoundVector; Vel: PFSoundVector): ByteBool; stdcall;

channel2: Longint;

 pos, vel: TFSoundVector;

pos.x := 15; pos.y := 0; pos.z := 0;
vel.x := 0; vel.y := 0; vel.z := 0;

 FSOUND_3D_SetAttributes(channel2, @pos, @vel);

-----------------------

DLL_API signed char F_API FSOUND_3D_SetAttributes(int channel, const float *pos, const float *vel);

        float pos[3] = { 15.0, 0.0, 0.0};
        float vel[3] = { 0,0,0 };
        FSOUND_3D_SetAttributes(channel2, pos, vel);

Не спрашивайте почему я пишу на VB, прога почти готова и переделывать её не хочется. Как быть?

Ответить

Номер ответа: 4
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #4 Добавлено: 05.05.04 23:19

Так, чисто наугад: может попробовать передавать адрес первого элемента, через VarPtr или ещё как?

Ответить

Номер ответа: 5
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #5
Добавлено: 06.05.04 00:07

И все равно тогда прийдется поменять декларацию... Если у тебя верно все объявлено, то в принцыпе ты ничего не пошлешь :(

А если мне память не изменяет в комплекте с fmod'ом поставлялись и примеры его использования...

Ответить

Номер ответа: 6
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #6 Добавлено: 06.05.04 01:56

И ещё непонятно вот что:

Pos As Single 

Pos: PFSoundVector

const float *pos 

@pos 

 Почему то везде разные типы. Возможно, что const float это тот же Single, (в делфях - ни бум-бум), но почему используется и указатели и PFSoundVector - непонятно. Четыре разных типа передаваемого значения. Они что, все одно и тоже?

Ответить

Номер ответа: 7
Автор ответа:
 Fallout



Вопросов: 10
Ответов: 387
 Web-сайт: mudator.by.ru
 Профиль | | #7
Добавлено: 06.05.04 08:33

DLL_API signed char F_API FSOUND_3D_SetAttributes(int channel, const float *pos, const float *vel);

Надо было сразу С++ выкладывать декларацию я люблю С++ а он меня нет почему то ну ладно... +)))

ну возвращает функция signed char в басике кроме BYTE ничто не заменит

int channel - byval chanel as Long

const float *pos - узнай размер типа float .. и всё.. хотя люббой указатель это ДВОРД ... в басике Long соотсвено то бишь byval pos as long с последним тоже самое...

теперь просто узнай размер .. типа float и если этот тип равен по размеру типу single то

pos as single ну а функцию толкаешь....

VarPtr(pos)

и так если никто нчего не понял то дикларация выгледит так

Public Declare Function FSOUND_3D_SetAttributes Lib "fmod.dll" Alias "_FSOUND_3D_SetAttributes@12" (ByVal channel As Long, ByVal pos As Long, ByVal vel As Long) As Byte

Ответить

Номер ответа: 8
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #8 Добавлено: 06.05.04 08:44

Да никак правильным определение быть не может!

.

pos, vel: TFSoundVector;

pos.x := 15; pos.y := 0; pos.z := 0;

vel.x := 0; vel.y := 0; vel.z := 0;

.

Уже отсюда видно, что TFSoundVector - пользовательский тип. Следовательно

Private Type TFSoundVector

x as long

y as long

z as long

End Type

Во втором же примере вообще используются указатели на трехмерный массив. Где тут Single???

Ответить

Номер ответа: 9
Автор ответа:
 Fallout



Вопросов: 10
Ответов: 387
 Web-сайт: mudator.by.ru
 Профиль | | #9
Добавлено: 06.05.04 09:23

DLL_API signed char F_API FSOUND_3D_SetAttributes(int channel, const float *pos, const float *vel);

оттуда так как функцию как я понимаю он написал на Си++ так? ну вот ... и выложил он её... соотсвенно она и есть верная и из ходя из неё надо написать определение под ВБ а не из всяких там Делфи шмелфи и тд...

так вот размер данных float равен четыре байта соотсвенно аналогом в ВБ будет Single который тоже занимает те же 4 байта... и они оба с прлавующей точкой значения... так вот .... как я писал до этого если судить по С++ декларации а именно она будет верной то

Public Declare Function FSOUND_3D_SetAttributes Lib "fmod.dll" Alias "_FSOUND_3D_SetAttributes@12" (ByVal channel As Long, ByVal pos As Long, ByVal vel As Long) As Byte

является правильной декларацие на ВБ...

теперь он хочет вызвыать эту функцию.. всё просто

Dim Pos1(0 To 2) As Single

Dim vel1(0 To 2) As Single

Dim set_3d As Byte

Pos1(0) = -1

Pos1(1) = -1

Pos1(2) = -1

vel1(0) = 0

vel1(1) = 0

vel1(2) = 0

set_3d = Dim set_3d As Byte(0, VarPtr(Pos1(0)), VarPtr(vel1(0)))

И это будет обсалютно грамотным вызовом функции соотсвенно для вторых элементов масива надо индекс сделать 1 и для последних 2.. ну и всё.. что непонятно?

Ответить

Номер ответа: 10
Автор ответа:
 Fallout



Вопросов: 10
Ответов: 387
 Web-сайт: mudator.by.ru
 Профиль | | #10
Добавлено: 06.05.04 09:36

Если ты хочешь передать все эелементы масива а сама функция их не "возьмёт" то ты их и не передашь а если она функция подорузомевает ссылку на масив из 3 элементов то как я сказал .. должно всё выполнятся прекрастно

Ответить

Номер ответа: 11
Автор ответа:
 Fallout



Вопросов: 10
Ответов: 387
 Web-сайт: mudator.by.ru
 Профиль | | #11
Добавлено: 06.05.04 09:43

Блин я кривой +) и почему тут редактировать сообщения нельзя +)

set_3d = FSOUND_3D_SetAttributes(0, VarPtr(Pos1(0)), VarPtr(vel1(0)))

вот блин +)

Ответить

Номер ответа: 12
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #12
Добавлено: 06.05.04 11:05

И с VarPtr не пойдет при нынешнем объявлении данной функции !!! Ну не должно быть такого объявления, и все тут!

Ответить

Номер ответа: 13
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #13
Добавлено: 06.05.04 11:08

PS Хотя та декларация что предлагает Fallout, больше похожа на правду...

Ответить

Номер ответа: 14
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #14 Добавлено: 06.05.04 14:08

А ты считаешь что есть разница?

Посмотри как Synther приводит две различные декларации одной функции - Дельфи и Си.

В одной тип, в другой массив. Разница, по моему, не принципиальна.

Ответить

Номер ответа: 15
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #15 Добавлено: 06.05.04 14:47
Похоже, что чел пытается передать массив элементов пользовательского типа, при этом передавая его зачем-то как Single. В этом и проблема. И ему самому надо разобраться,  то ли передавать Single, то ли передавать указатель на массив - т.е. Long.

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам