Битовые операции с переменной String

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Битовые операции с переменной String

Сообщение Don Leno » 21.05.2018 (Пн) 10:44

Салют всем!
Итак, есть функция которая получает изображение и создает ее черно-белый "эскиз". После "эскиз" заносится в массив Hash() as Long через битовые операции. Но вот проблема - как функция должна возвращать значение этой цепочки битов в массиве, т.е. вернуть сам массив. Как это сделать?
Мое предположение - создать переменную типа String и перенести всю цепочку битов в нее, а после функция вернет как String значение, которое будет считываться и сравниваться с другими теми же битовыми операциями. Но встает вопрос - как это реализовать?

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Битовые операции с переменной String

Сообщение pronto » 21.05.2018 (Пн) 11:07

Указатель на первый элемент массива lpThumb& = VarPtr(Hash(0))
O, sancta simplicitas!

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Битовые операции с переменной String

Сообщение Don Leno » 21.05.2018 (Пн) 12:58

pronto, а можно по подробней? Допустим получили указатель а как дальше с ним работать?

Teranas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 224
Зарегистрирован: 13.12.2008 (Сб) 4:26
Откуда: Новосибирск

Re: Битовые операции с переменной String

Сообщение Teranas » 21.05.2018 (Пн) 13:31

А зачем нужен вообще String, если уже есть массив Long, Long будет сравниваться быстрей чем String.

Код: Выделить всё
Function CompareHesh(Lh1() As Long, Lh2() As Long) As Boolean
  Dim i As Long
  For i = LBound(Lh1()) To UBound(Ln1())
    If i > UBound(Lh2()) Then Exit Function
    If Lh1(i) <> Lh2(i) Then Exit Function
  Next i
  CompareHesh = True
End Function
С уважением, Андрей.

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Битовые операции с переменной String

Сообщение pronto » 21.05.2018 (Пн) 14:18

По указателю копировать в свой массив
Код: Выделить всё
Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" (ByVal Dest As Long, ByVal Source As Long, ByVal Length As Long)
' Dest - приёмник (куда?)
' Source - источник (откуда?)

Dim HashCopy() As Long

ReDim HashCopy(UBound(Hash))

' в массив HashCopy копируется содержимое массива
CopyMemory VarPtr(HashCopy(0)), VarPtr(Hash(0)), (UBound(Hash) + 1) * LenB(Hash(0))


Если функция вычисления твоя, то есть ещё вариант — передавать в функцию массив HashCopy по ссылке: CalcHash(... , ByRef HashData() As Long, ...)

Использование в коде:
Код: Выделить всё
Dim HashCopy() As Long

CalcHash(... , HashCopy(), ...)

Debug.Print Hex(HashCopy(0)), UBound(HashCopy)

Такой вариант предпочтительней из-за отсутствия этапа копирования массива.
Последний раз редактировалось pronto 21.05.2018 (Пн) 15:45, всего редактировалось 1 раз.
O, sancta simplicitas!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Битовые операции с переменной String

Сообщение alibek » 21.05.2018 (Пн) 15:12

Teranas писал(а):If i > UBound(Lh2()) Then Exit Function

А зачем это проверять внутри цикла?
Lasciate ogni speranza, voi ch'entrate.

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Битовые операции с переменной String

Сообщение Don Leno » 21.05.2018 (Пн) 19:02

Спс за столь подробные изъяснения.
Вот что требуется мне:
Код: Выделить всё
Private Function MyFunc ()
' Здесь в массив Hash() вносятся данные
' И только после всех действий:
MyFunc=Hash()
End Function

Как вернуть массив чтобы потом им можно было пользоваться????!!!!
К примеру мог написать так:
Код: Выделить всё
Dim buf() as long
BUF()=MyFunc()


Возможен ли такой код? Если нет, тогда я воспользуюсь другим предложеным вами способом.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Битовые операции с переменной String

Сообщение The trick » 21.05.2018 (Пн) 21:23

Код: Выделить всё
Dim buf() as long
BUF()=MyFunc()

Код: Выделить всё
Option Explicit

Sub Main()
    Dim j() As Long
   
    j = z
   
End Sub


Function z() As Long()
    Dim p() As Long
   
    ReDim p(...)
   
    ...
   
    z = p
   
End Function
UA6527P

Don Leno
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 421
Зарегистрирован: 13.10.2013 (Вс) 14:05

Re: Битовые операции с переменной String

Сообщение Don Leno » 23.05.2018 (Ср) 18:31

Спс всем!


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

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

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

    TopList