Передача массива в библиотеку

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Dismalion
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 06.02.2006 (Пн) 13:57

Передача массива в библиотеку

Сообщение Dismalion » 12.05.2008 (Пн) 15:52

Здравствуйте.

Я пытаюсь передать массив из VB в библиотеку написанную на С.

код VB:

Код: Выделить всё
Private Declare Function high1 Lib "DLLTest.dll" (ByRef array() As Double) As Double

Private Sub main()
    'MsgBox ReturnTen
    'MsgBox AddVals(10, 10)
    'MsgBox areacircle(30.2)
   
Dim mass() As Double
ReDim mass(3)

mass(0) = 3.1
mass(1) = 2.5
mass(2) = 7.89
mass(3) = 1.55
 
MsgBox high1(mass)

 
End Sub


Код DLL на С:

Код: Выделить всё
double __stdcall high1(double array1[])

{   
        int exchange;
        double temp;
       int countval = 3;//sizeof(array);
         do
    {
       exchange = 0;
         for (int n = 1; n < (countval-1); n++)
          {
            if (array[n] < array[n+1])
     {
               temp = array[n];
              array[n] = array[n+1];
              array[n+1]=temp;
              exchange = 1;
           }
                                                                     
          }
      }while (exchange !=0);
         
      return(array1[0]);                                        
}


Даже более того, заменив на :

Код: Выделить всё
double __stdcall high1(double array[])

{   
      return(array[0]);                                        
}


мне выдается совершенно левое число.

С передачей обычных переменных таких путаниц нет. Только с массивами.

Не могли бы вы подсказать, в чем может быть проблема?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 12.05.2008 (Пн) 17:20

Проблема в том, что в C/С++ запись type foo[] означает, что код ожидает получить указатель на начало (на первый элемент) массива.

В VB-же, запись ByRef Foo() As Type означает, что код ожидает получить указатель на структуру SAFEARRAY, определяющую дин. массив.

Потому, то что передаётся VB-шным кодом сишному, и то, что ожидает получить сишный код - совершенно разные вещи.

Чтобы сишный код получил то, что ожидает, ему, как я уже сказал, следует передать указатель на первый элемент массива. Посему, в Declare Function меняем ByRef FirstArrayItem As Double, и вызывает так:

Код: Выделить всё
high1 mass(0)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Dismalion
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 06.02.2006 (Пн) 13:57

Сообщение Dismalion » 12.05.2008 (Пн) 19:22

Спасибо, все заработало! =)


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 56

    TopList