Указатель на строчный массив (одномерный).

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Сообщение Vi » 09.09.2004 (Чт) 8:07

BP писал(а):Мне нужно чтобы модуль класса помнил ссылку на массив модуля формы или другого модуля и мог с ним работать не только тогда когда его передали, а в любое время. VarPtr хорошо конечно, но как я буду узнавать длину массива? Массив то динамический. Нужно чтобы модуль класса сам знал сколько у массива элементов.

Самый простой путь - получить Variant по ссылке и сохранить его на будущее.

В классе или еще где:

Private vPriv As Variant
Sub StoreArray(v As Variant)
' VarType(v) должен быть &H4000(VT_BYREF)+&H2000(vbArray)+vb...(vbLong и т.д.)
' Это можно (или нужно) проверять
CopyMemory vPriv, v, 16
End Sub

И вызов
Dim x() As Long, x2(2) As Long, s() As String, s2(2) As String
ReDim x(2), s(2)
StoreArray x
StoreArray x2
StoreArray s
StoreArray s2

До тех пор, пока исходный массив существует в памяти, vPriv будет указывать на этот массив.

А использовать этот массив в классе или еще где так: vPriv(i) без всяких там API.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 09.09.2004 (Чт) 15:07

Спасибо попробую

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 09.09.2004 (Чт) 15:28

Всё гениальное просто :)
А почему копируется 16 байт?

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Сообщение Vi » 09.09.2004 (Чт) 16:20

А почему копируется 16 байт?

Таков размер VARIANTа в С. Здесь же достаточно скопировать 12 байт: 2 байта типа + 6 неиспользуемых байт + 4 байта указателя. Но для простоты копируем полностью.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 09.09.2004 (Чт) 17:21

Ага, так и запишем в коментариях.

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 09.09.2004 (Чт) 17:24

Approximator писал(а):И потом, я же уже давал ссылку на топик в трёпе, где обсуждался вызов функций по указателю. Я там кое-что добавил. Посмотри последний пример и .dll к нему.


Ты нашёл что то новенькое? Сейчаз поищу. Хотя мне DLL нежелательна.

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 10.09.2004 (Пт) 1:41

Vi писал(а):
BP писал(а):Мне нужно чтобы модуль класса помнил ссылку на массив модуля формы или другого модуля и мог с ним работать не только тогда когда его передали, а в любое время. VarPtr хорошо конечно, но как я буду узнавать длину массива? Массив то динамический. Нужно чтобы модуль класса сам знал сколько у массива элементов.

Самый простой путь - получить Variant по ссылке и сохранить его на будущее.

Дык, я уже ему пример с Varint'ом предложил (на предыдущей странице).
С уважением, Approximator.

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 10.09.2004 (Пт) 16:57

Всем спасибо. Качайте по этой ссылке.
http://basicproduction.nm.ru/clrlist2.rar

SCINER
Новичок
Новичок
Аватара пользователя
 
Сообщения: 25
Зарегистрирован: 27.01.2005 (Чт) 20:46
Откуда: Казань

safearray не дружит с классами ???

Сообщение SCINER » 23.02.2006 (Чт) 3:51

Цель.
Обращаться к массиу байтов расположенному в модуле, но через Class.

Но есть проблема.
Похоже что-то неправильно делаю :oops:
Сорс прилагаю.
Вложения
Pixels.zip
(3.88 Кб) Скачиваний: 20

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

Сообщение Viper » 24.02.2006 (Пт) 11:08

2SCINER а на кой тебе понадобилось так хитро обращаться к массиву байтов... через указатель... через тип Variant...

Почему бы не написать класс с таким кодом (чисто для примера)
Код: Выделить всё
Private m_array() As Byte
Public Sub Init(iMax As Integer, jMax As Integer, kMax As Integer)
ReDim m_array(0 To iMax, 0 To jMax, 0 To kMax)
End Sub
Public Property Get Data(i As Integer, j As Integer, k As Integer) As Byte
Data = m_array(i, j, k)
End Property
Public Property Let Data(i As Integer, j As Integer, k As Integer, value As Byte)
m_array(i, j, k) = value
End Property


и юзать это такой методой:
Код: Выделить всё

Dim c As New MyClass
c.Init(100, 100, 100)
'устанавливаем значение
с.Data(10, 10, 10) = 100
'считываем значение
Debug.Print c.Data(10, 10, 10)


Можно свойство Data сделат свойством по умолчанию, еще проще будет
Весь мир матрица, а мы в нем потоки байтов!

SCINER
Новичок
Новичок
Аватара пользователя
 
Сообщения: 25
Зарегистрирован: 27.01.2005 (Чт) 20:46
Откуда: Казань

Сообщение SCINER » 24.02.2006 (Пт) 13:53

Дело в том, что в таком случае скорость доступа к пикселам изображения снижается в десятки раз.

Это ведь используется в графическом редакторе.

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

Сообщение Viper » 25.02.2006 (Сб) 7:04

SCINER писал(а):Дело в том, что в таком случае скорость доступа к пикселам изображения снижается в десятки раз.


Как это? Доступ к байтам через Variant получается быстрее, чем доступ к ним же напрямую??? Не верю!
Весь мир матрица, а мы в нем потоки байтов!

SCINER
Новичок
Новичок
Аватара пользователя
 
Сообщения: 25
Зарегистрирован: 27.01.2005 (Чт) 20:46
Откуда: Казань

Сообщение SCINER » 25.02.2006 (Сб) 11:01

я говорю, что доступ к ним из методов класса медленней в сотни раз, чем например все тоже самое но из модуля.

остальное меня все устраивает.

попробуй код из класса перекинуть в модуль.
тут-же все заработает нормально.

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

Сообщение Viper » 25.02.2006 (Сб) 11:12

А зачем тебе тогда вообще класс? Пусть все работает в модуле... Ну и если уж делать через класс, то зачем мудрить с типом Variant. Замедление то здесь происходит. Да и ошибок можно наловить всфких разных.

Короче, имеет место быть странная архитектура проги
Весь мир матрица, а мы в нем потоки байтов!

Пред.

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

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

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

    TopList