![]() |
|
Сайт 3DNews | Регистрация | Правила | Справка | Пользователи | Календарь | Поиск | Сообщения за день | Все разделы прочитаны |
|
![]() ![]() |
Опции темы | Опции просмотра |
![]() |
[включить плавающее окно] #1 | |
![]() Автор темы Регистрация: 27.11.2003
Адрес: г. Смоленск
|
Функции, возвращающие массивы в VB6
Уже второй день мучаюсь над вопросом.. Частью программы на VB6 является работа с комплексными числами, а точнее с комплексными матрицами. Оптимизации никакой не проводится. Важно, просто чтобы прога смогла как-то выполнять действия над матрицами, такие как сложение, умножение и пр., а также экспортировать матрицы в Excel. Но это все было вступление.. Все это достаточно просто реализуемо, но при написании экспорта, собственно, вопрос и возник. Private Function GetRe(Matrix()) as Single() GetRe = GetReIm(Matrix(), "Re") End Function где функция GetReIm: Private Function GetReIm(Matrix(), ReIm as String) as Single() . ReDim Res(1 to n, 1 to n) . . GetReIm = Res End Function По идее функция GetRe является частным аналогом GetReIm. Как уже написано, обе функции должны возвращать матрицу чисел одинарной точности. GetReIm функционирует правильно. А вот при присвоении результата от выполнения GetReIm функции GetRe возникает ошибка "Function call on left-hand side of assignment must return variant or Object". Очевидно я просто-напросто неправильно выполняю переприсвоение. Так вот и вопрос: в чем ошибка, и как выполнить присвоение правильно? |
|
![]() |
![]() |
![]() |
[включить плавающее окно] #2 |
Интересующийся
Регистрация: 19.06.2004
|
t0p_VD, рекомендуется посмотреть статью из MSDN "HOWTO: Return and Assign Arrays with Visual Basic 6.0", она же Q186423. Вкратце -
Цитата
When making array assignments, the array on the left side of the argument must me a dynamic array. Otherwise, you will receive the following compiler error:
"Can't assign to array" Код:
Option Explicit Option Base 1 Private Function GetRe(Matrix() As Single) As Single() GetRe = GetReIm(Matrix(), "Re") End Function Private Function GetReIm(Matrix() As Single, ReIm As String) As Single() Dim n As Integer n = UBound(Matrix, 1) Dim Res() As Single ReDim Res(1 To n, 1 To n) GetReIm = Res End Function Private Sub Command1_Click() Dim M(5, 5) As Single, A() As Single A = GetRe(M()) End Sub
__________________
А доктор всё не едет... |
![]() |
![]() |
![]() |
[включить плавающее окно] #3 |
![]() Автор темы Регистрация: 27.11.2003
Адрес: г. Смоленск
|
Benedict
Цитата
When making array assignments, the array on the left side of the argument must me a dynamic array. Otherwise, you will receive the following compiler error: "Can't assign to array"
Код:
Public Function GetRe(Matrix() As tComplex) As Single() GetRe = GetReIm(Matrix(), "Re") End Function Private Function GetReIm(Matrix() As tComplex, ReIm As String) As Single() Dim H As Integer, W As Integer Dim i As Integer, j As Integer Dim Res() As Single H = UBound(Matrix, 1) - LBound(Matrix, 1) + 1 W = UBound(Matrix, 2) - LBound(Matrix, 2) + 1 ReDim Res(1 To H, 1 To W) As Single Select Case UCase(ReIm) Case "RE" For i = 1 To H For j = 1 To W Res(i, j) = Matrix(i, j).Re Next Next Case "IM" For i = 1 To H For j = 1 To W Res(i, j) = Matrix(i, j).Im Next Next End Select GetReIm = Res End Function P.S. При вызове массив, в который помещается результат, тоже описан как динамический (типа того Код:
Dim A() as single |
![]() |
![]() |
![]() |
[включить плавающее окно] #4 |
Интересующийся
Регистрация: 19.06.2004
|
В том виде, что ты привёл, код работает без замечаний.
__________________
А доктор всё не едет... |
![]() |
![]() |
![]() |
[включить плавающее окно] #5 |
![]() Регистрация: 11.03.2003
Адрес: Тьмутаракань2, лен. обл
|
В дельфе это лечится кучей способов.
1. передаешь не сам массив а поинтер на него 2. создаешь новый тип переменной с динамическим массивом внутри (например запись) и передаешь его целиком 3. создаешь объект и передаешь его 4. извращаешься через задницу... например через поток или файл ![]() надеюсь меня можно понять... ![]() |
![]() |
![]() |
![]() |
[включить плавающее окно] #6 |
![]() Автор темы Регистрация: 27.11.2003
Адрес: г. Смоленск
|
Barloggg
Цитата
В дельфе это лечится кучей способов
Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (Var() as Any) As Long (для VB6). Помимо этого есть и такие полезные функции ObjPtr, StrPtr, VarPtrStringArray. Нда.. В общем от жизни я немного подотстал.. Цитата
создаешь объект и передаешь его
|
![]() |
![]() |
![]() |
[включить плавающее окно] #7 |
Интересующийся
Регистрация: 19.06.2004
|
t0p_VD, VarPtr() описана в библиотеке VBA, но скрыта (т.е. можно использовать без явного описания). Чтобы её увидеть, надо в Object Browser-е включить показ скрытых членов. Приведённое тобой описание VarPtrArray всего лишь создаёт псевдоним VarPtr. В случае её вызова возвращается адрес на структуру SAFEARRAY. Чтобы получить адрес первого элемента, надо запросить его в явном виде (как ни удивительно
![]() Код:
Dim MyArr(10) As Single, pMyArr As Long pMyArr = VarPtr(MyArr(LBound(MyArr))) P.S. Я слабо понял, как это относится к первоначальной теме.
__________________
А доктор всё не едет... Последний раз редактировалось Benedict; 15.01.2005 в 12:03. |
![]() |
![]() |
![]() |
[включить плавающее окно] #8 |
![]() Автор темы Регистрация: 27.11.2003
Адрес: г. Смоленск
|
Benedict
Цитата
рекомендуется к прочтению Q199824
Цитата
Я слабо понял, как это относится к первоначальной теме.
![]() |
![]() |
![]() |
![]() |
[включить плавающее окно] #9 |
![]() Регистрация: 11.03.2003
Адрес: Тьмутаракань2, лен. обл
|
t0p_VD.
Правильно, создаешь объект в котором одно из свойств - этот динамический массив и таскаешь указатель на объект. В Дельфе это явным образом не разделяется и поэтому у меня до сих пор путаница, что считать объектом, а что "умным" указателем. Надо бы мне поработать над моей терминологией... |
![]() |
![]() |