Передача массива в функцию

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

Передача массива в функцию

Сообщение IIIypuk » 16.09.2006 (Сб) 19:38

Вот примерно код:
Код: Выделить всё
Option Explicit

Private Type tpOne
   Name As String
   Count As Integer
   '...
End Type

Private Type tpTwo
   Name As String
   Len As Long
   '...
End Type

Private Sub Form_Load()
Dim one(1 To 10) As tpOne
Dim i As Integer, tempInt As Integer
   
   For i = 1 To 10
      one(i).Name = CStr(i)
   Next i
   
   tempInt = Run_scr(one)
   ' ...
End Sub

Private Function Run_scr(  ?arrTemp?  ) As Integer
Dim i As Integer

   For i = 1 To 10
      If arrTemp(i).Name = "9" Then Run_scr = 1
   Next i
   Run_scr = 0
   
End Function



Два типа не имеют друг к другу никакого отношения, кроме одинакого элемента Name. Вот собственно два вопроса: как передать массив в функцию и еще вопрос. Если у элементов Name разное название (т.е. не Name а Name1 и Name2 напр.), можно ли добратся до них таким же способом, если это единственный String в типе (<-чистое любопытство).
Есть 10 типов людей. Те, кто понимает двоичную систему исчисления, и те, кто не понимает...

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Re: Передача массива в функцию

Сообщение lister » 16.09.2006 (Сб) 19:53

IIIypuk писал(а):... как передать массив в функцию...


Почитай здесть:
http://bbs.vbstreets.ru/viewtopic.php?t ... torder=asc

IIIypuk писал(а):Если у элементов Name разное название (т.е. не Name а Name1 и Name2 напр.), можно ли добратся до них таким же способом, если это единственный String в типе (<-чистое любопытство).


Хм... Не понятно :?

IIIypuk
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 10.06.2006 (Сб) 12:39

Сообщение IIIypuk » 16.09.2006 (Сб) 20:23

1. Помоему не то. Мне нужно передать массив Arr(), а не набор значений.
2.
Код: Выделить всё
Private Type tpOne
   Name1 As String
   Count As Integer
   '...
End Type

Private Type tpTwo
   Name2 As String
   Len As Long
   '...
End Type
Dim one(1 To 10) As tpOne, two(1 To 10) As tpTwo


Как передать Name1 или Name2 всего массива.
Есть 10 типов людей. Те, кто понимает двоичную систему исчисления, и те, кто не понимает...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 16.09.2006 (Сб) 20:34

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

IIIypuk
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 10.06.2006 (Сб) 12:39

Сообщение IIIypuk » 17.09.2006 (Вс) 18:03

Что т я не понял вас. Пока приходится копировать в отдельный массив, чтоб передать. И всё же, какое верное решение?
Есть 10 типов людей. Те, кто понимает двоичную систему исчисления, и те, кто не понимает...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 17.09.2006 (Вс) 18:04

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

IIIypuk
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 10.06.2006 (Сб) 12:39

Сообщение IIIypuk » 18.09.2006 (Пн) 8:42

Но массивы разных типов, а Variant в функции он не принемает, пишет:

Only user-defined types defined in public object modules can be coerced to or from a variant or passed to late-bound functions.

З.Ы. Типы у меня объявлены как Public в отдельном модуле.
Есть 10 типов людей. Те, кто понимает двоичную систему исчисления, и те, кто не понимает...

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 18.09.2006 (Пн) 9:32

IIIypuk, я так понял тебе надо передавать один массив целиком и одно поле из второго? Тогда передавай оба массива, а в процедуре, если надо, присваивай нужные значения(поля) одного другому.
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.09.2006 (Пн) 12:23

Объявить две функции, принимающие массивы разных типов.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

IIIypuk
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 10.06.2006 (Сб) 12:39

Сообщение IIIypuk » 18.09.2006 (Пн) 14:34

GSerg, я так и сделал, но хотелось найти все же решение...

Matew, нет. Не так понял. Мне нужно в зависимости от ситуации, передавать в функцию массивы разных типов.
Есть 10 типов людей. Те, кто понимает двоичную систему исчисления, и те, кто не понимает...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 18.09.2006 (Пн) 14:47

В ОДНУ функцию массивы разных типов нельзя передать.
Весь мир матрица, а мы в нем потоки байтов!

zHackLeX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 23.10.2003 (Чт) 21:08

Сообщение zHackLeX » 23.09.2006 (Сб) 21:04

*мысли вслух*
1. что-то знакомое...
2. вспомнил вдруг статьи GSerg'a про указатели и массивы... Но забыл тембр бубна...
3. Пожалуй, три параметра - два для массивов (оба сразу), третий определяет, какой НУЖЕН (естессно все Optional) - самое простое и удачное решение
4. (полный изврат) Сделать класс с двумя полями соответствующих типов, создал экземпляр - пихнул в процедуру...
There is no knowledge that is not power...

X,C,A,B,C,Z,X,A,B,C,Z....
Многие ли помнят? :)

IIIypuk
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 10.06.2006 (Сб) 12:39

Сообщение IIIypuk » 26.09.2006 (Вт) 17:35

Насчет 3-го отчасти да, я в итоге так и сделал. Всем спасибо за внимание.
Есть 10 типов людей. Те, кто понимает двоичную систему исчисления, и те, кто не понимает...

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Сообщение Zenitchik » 21.12.2006 (Чт) 15:40

А что мешает передавать их через вариантную переменную?
Что она не принимает юзерские типы - гонево. Пробовал - принимает. вот с МАССИВАМИ юзерского типа не пробовал... Хотя, по идее, должно быть еще проще, т.к. массив не хранится в переменной физически.

А потом проверять функцией TypeName.

Лучший вариант: заменить типы классами и гнать через Object или "виртуальный" класс.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 21.12.2006 (Чт) 15:45

делай не массивы а коллекции на основе своего класса, а главный класс имплементируй сколько тебе надо (Implements)

ЗЫ
пока сочинял, уже опередили :wink:

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Сообщение Zenitchik » 21.12.2006 (Чт) 15:47

В принципе - там и массивы прекрасно себя чувствовать будут.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.12.2006 (Чт) 16:19

Zenitchik, некрофилия на этом форуме не приветствуется. Особенно если в некрофильном посте содержится никак не относящаяся к проблеме информация, к тому же неверная.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 21.12.2006 (Чт) 16:56

А можно и так:

Код: Выделить всё
Private Type tpOne
   Name As String
   Count As Integer
   '...
End Type

Private Type tpTwo
   Name As String
   Len As Long
   '...
End Type

Private Type tpAll
    Type As Integer
    mOne() As tpOne
    mTwo() As tpTwo
End Type

Private Sub Main()
    Dim v As Variant
    Dim mAll(1 To 3) As tpAll
    Dim i As Integer, j As Integer

    For j = LBound(mAll) To UBound(mAll)
        With mAll(j)
            .Type = j
            If j = 1 Or j = 3 Then
                ReDim .mOne(1 To 5)
                For i = LBound(.mOne) To UBound(.mOne)
                    .mOne(i).Name = "One " & j & "-" & CStr(i)
                Next i
            End If
            If j = 2 Or j = 3 Then
                ReDim .mTwo(1 To 5)
                For i = LBound(.mTwo) To UBound(.mTwo)
                    .mTwo(i).Name = "Two " & j & " - " & CStr(i)
                Next i
            End If
        End With
   Next j
   
   Debug.Print Run_scr(mAll(1))
   Debug.Print "---------"
   Debug.Print Run_scr(mAll(2))
   Debug.Print "---------"
   Debug.Print Run_scr(mAll(3))
   Debug.Print "========="
   Debug.Print mAll(1).mOne(4).Name
   Debug.Print vbCrLf
End Sub

Private Function Run_scr(mTemp As tpAll) As Integer
    Dim i As Integer, j As Integer

    With mTemp
        If .Type = 1 Or .Type = 3 Then
            For i = LBound(.mOne) To UBound(.mOne)
                With .mOne(i)
                    If Right$(.Name, 1) = "4" Then
                        Debug.Print .Name
                        .Name = "+" & .Name
                        Run_scr = mTemp.Type
                    End If
                End With
            Next i
        End If
        If .Type = 2 Or .Type = 3 Then
            For i = LBound(.mTwo) To UBound(.mTwo)
                With .mTwo(i)
                    If Right$(.Name, 1) = "4" Then
                        Debug.Print .Name
                        Run_scr = mTemp.Type
                    End If
                End With
            Next i
        End If
    End With
End Function
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...


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

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

Сейчас этот форум просматривают: AhrefsBot, Google-бот, SemrushBot и гости: 109

    TopList