Как правильно скопировать символьный массив в байтовый?

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

Как правильно скопировать символьный массив в байтовый?

Сообщение Dimon111 » 22.03.2013 (Пт) 8:09

Объявляю два массива и заполняю его пятью элементами:

Код: Выделить всё
Dim STRMass(5) As String
Dim ByteMass(5) As Byte
STRMass(1) = &HAA
STRMass(2) = &H21
STRMass(3) = &H1
STRMass(4) = &H4
STRMass(5) = &H2


Оба варианта дают правильный результат:
Вариант 1
Код: Выделить всё
    For I = 1 To 5
        ByteMass(I) = STRMass(I)
        Terminal_Text = Terminal_Text & ByteMass(I) & " "
    Next

Вариант 2
Код: Выделить всё
    For I = 1 To 5
        ByteMass(I) = Val(STRMass(I))
        Terminal_Text = Terminal_Text & ByteMass(I) & " "
    Next


Как будет правильней? Не хотелось бы наступать на грабли.
Последний раз редактировалось Dimon111 22.03.2013 (Пт) 17:44, всего редактировалось 1 раз.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 22.03.2013 (Пт) 10:39

Тут сама идея абсолютно кривая... Я 5 минут пытался понять, что же на самом деле делает этот код.
Да, а ты уверен, что у массивов 1-индексация?

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Re:

Сообщение Dimon111 » 22.03.2013 (Пт) 11:16

Qwertiy писал(а):Тут сама идея абсолютно кривая... Я 5 минут пытался понять, что же на самом деле делает этот код.
Да, а ты уверен, что у массивов 1-индексация?

Код по крайней мере работает.

Предыстория такова: FTDI драйвер D2XX работает только с массивом типа STRING. Функция чтения COM порта возвращает данные в фиксированном массиве этого типа.

Для обработки приходится переписывать данные в массив типа Byte. Вот мне и интересно стало - как же правильно будет.

По поводу индекса - так ничего страшного если нулевой индекс использоваться не будет. Главное чтобы везде было одинаково.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как правильно скопировать строковый массив в байтовый?

Сообщение ger_kar » 22.03.2013 (Пт) 11:21

Dimon111 писал(а):Код по крайней мере работает.
Ну а если строка будет длиннее, то будет облом. Или строка всегда содержит только один символ?
Бороться и искать, найти и перепрятать

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Re: Как правильно скопировать строковый массив в байтовый?

Сообщение Dimon111 » 22.03.2013 (Пт) 11:25

ger_kar писал(а):
Dimon111 писал(а):Код по крайней мере работает.
Ну а если строка будет длиннее, то будет облом. Или строка всегда содержит только один символ?

Строка всегда содержит 35 элементов. Так настроена функция FT_Read. Собственно, могу сделать Lbound и Ubound.

Меня интересует как правильно копировать из String в Byte массив.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 22.03.2013 (Пт) 11:34

Dimon111 писал(а):По поводу индекса - так ничего страшного если нулевой индекс использоваться не будет. Главное чтобы везде было одинаково.

Так можно же объявлять Dim X(1 To 5) As Byte.

ger_kar писал(а):Ну а если строка будет длиннее, то будет облом. Или строка всегда содержит только один символ?

В приведённом коде строка содержит не символ.

Dimon111 писал(а):Предыстория такова: FTDI драйвер D2XX работает только с массивом типа STRING. Функция чтения COM порта возвращает данные в фиксированном массиве этого типа.
Dimon111 писал(а):Код по крайней мере работает.

Весьма подозрительно...

Dimon111 писал(а):Как будет правильней?

Я бы сказал, что без Val, поскольку Val выполняет приведение максимального префикса получаемой строки к (кажется) Double. Неявное приведение будет требовать число.

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Re:

Сообщение Dimon111 » 22.03.2013 (Пт) 14:31

Qwertiy писал(а):
Dimon111 писал(а):По поводу индекса - так ничего страшного если нулевой индекс использоваться не будет. Главное чтобы везде было одинаково.

Так можно же объявлять Dim X(1 To 5) As Byte.

ger_kar писал(а):Ну а если строка будет длиннее, то будет облом. Или строка всегда содержит только один символ?

В приведённом коде строка содержит не символ.

Dimon111 писал(а):Предыстория такова: FTDI драйвер D2XX работает только с массивом типа STRING. Функция чтения COM порта возвращает данные в фиксированном массиве этого типа.
Dimon111 писал(а):Код по крайней мере работает.

Весьма подозрительно...

Dimon111 писал(а):Как будет правильней?

Я бы сказал, что без Val, поскольку Val выполняет приведение максимального префикса получаемой строки к (кажется) Double. Неявное приведение будет требовать число.


Не понял что именно подозрительно, сама функция здесь:
Код: Выделить всё
Private Declare Function FT_Read Lib "FTD2XX.DLL" (ByVal Handle As Long, ByVal lpszBuffer As String, ByVal lngBufferSize As Long, ByRef lngBytesReturned As Long) As Long


Будем использовать вариант без функции Val. Спасибо за ответ.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 22.03.2013 (Пт) 15:19

Dimon111 писал(а):Не понял что именно подозрительно

Что драйвер конвертирует байты в строки... таким образом...

Dimon111 писал(а):сама функция здесь:
Код: Выделить всё
Private Declare Function FT_Read Lib "FTD2XX.DLL" (ByVal Handle As Long, ByVal lpszBuffer As String, ByVal lngBufferSize As Long, ByRef lngBytesReturned As Long) As Long

А где тут массив?

Dimon111 писал(а):Будем использовать вариант без функции Val. Спасибо за ответ.

Будет весело, если окажется, что надо с Asc или AscW...

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

Re: Как правильно скопировать строковый массив в байтовый?

Сообщение Хакер » 22.03.2013 (Пт) 17:02

Dimon111 писал(а):Предыстория такова: FTDI драйвер D2XX работает только с массивом типа STRING.

Бред. Поганое описание функции FT_Read нужно заменить правильным, и никакие String-и будут не нужны.

А так у тебя двойное преобрвазоение туда-сюда-отсюда вызываются, которые не имеют под собой никого смысла, кроме отжирания процессорного времени. Бить за такое надо.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как правильно скопировать строковый массив в байтовый?

Сообщение ger_kar » 22.03.2013 (Пт) 17:17

Qwertiy писал(а):А где тут массив?
Даже если оставить объявление функции как есть, со стрингом, то действительно, а где тут массив? И даже сама постановка вопроса в корне неверная. Потому, как никакого строкового массива здесь нет и в помине, а есть строковый буфер, т.е. одна строка со множеством символов. Если это и массив, то не строковый, а символьный. Но VB такой тип данных как Char не поддерживает.
А вообще конечно нужно делать как говорит Хакер, переобъявить функцию и получать сразу байтовый массив.
Бороться и искать, найти и перепрятать

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Re: Как правильно скопировать строковый массив в байтовый?

Сообщение Dimon111 » 22.03.2013 (Пт) 17:33

Хакер писал(а):
Dimon111 писал(а):Предыстория такова: FTDI драйвер D2XX работает только с массивом типа STRING.

Бред. Поганое описание функции FT_Read нужно заменить правильным, и никакие String-и будут не нужны.

А так у тебя двойное преобрвазоение туда-сюда-отсюда вызываются, которые не имеют под собой никого смысла, кроме отжирания процессорного времени. Бить за такое надо.

По поводу бреда. Попробуйте подставить в функцию массив AS Byte. Вы на выходе получите нули. As Integer даёт некорректное завершение программы. В Си массив char с этой функцией работает на ура. Я может быть в VB профан, но с D2xx работаю не первый год.

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

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

Re: Как правильно скопировать строковый массив в байтовый?

Сообщение Хакер » 22.03.2013 (Пт) 17:35

Dimon111 писал(а):По поводу бреда. Попробуйте подставить в функцию массив AS Byte. Вы на выходе получите нули. В С массив char с этой функцией работает на ура. Я может быть в VB профан, но с D2xx работаю не первый год.


Потому что надо думать, что делаешь.

Если ты в объявлении аргумент ByVal lpszBuffer As String заменишь на ByRef lpszBuffer() As Byte, то вызываемая функция будет получать указатель на SafeArray-дескриптор.

Поэтому переобъявлять надо как ByRef lpBufferFirstElm as Byte и передавать первый элемент буферного массива.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Re: Как правильно скопировать строковый массив в байтовый?

Сообщение Dimon111 » 22.03.2013 (Пт) 17:37

Хакер писал(а):
Dimon111 писал(а):По поводу бреда. Попробуйте подставить в функцию массив AS Byte. Вы на выходе получите нули. В С массив char с этой функцией работает на ура. Я может быть в VB профан, но с D2xx работаю не первый год.


Потому что надо думать, что делаешь.

Если ты в объявлении аргумент ByVal lpszBuffer As String заменишь на ByRef lpszBuffer() As Byte, то вызываемая функция будет получать указатель на SafeArray-дескриптор.

Поэтому переобъявлять надо как ByRef lpBufferFirstElm as Byte и передавать первый элемент буферного массива.

И получите вылет из функции с разрушением всей программы. Плавали. Знаем.

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Re: Как правильно скопировать строковый массив в байтовый?

Сообщение Dimon111 » 22.03.2013 (Пт) 17:40

ger_kar писал(а):
Qwertiy писал(а):А где тут массив?
Даже если оставить объявление функции как есть, со стрингом, то действительно, а где тут массив? И даже сама постановка вопроса в корне неверная. Потому, как никакого строкового массива здесь нет и в помине, а есть строковый буфер, т.е. одна строка со множеством символов. Если это и массив, то не строковый, а символьный. Но VB такой тип данных как Char не поддерживает.
А вообще конечно нужно делать как говорит Хакер, переобъявить функцию и получать сразу байтовый массив.

Он то конечно говорит, но не пробовал. А тип Byte в VB разве не то же самое что unsigned char? может я некорректно назвал массив строковым, но символьный - то массив есть...

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

Re: Как правильно скопировать строковый массив в байтовый?

Сообщение Хакер » 22.03.2013 (Пт) 17:49

Dimon111 писал(а):И получите вылет из функции с разрушением всей программы. Плавали. Знаем.

Да нифига не знаешь. Твоим объяснениям я верю в тысячу раз меньше, чем своим знаниям.
Не плавал ты и не знаешь, вот как. Для тебя это чёрный ящик, и ты просто ищешь удачные методы работы с ним.

А для меня это кристально чистая система, я знаю, что куда передаётся и куда каждый байтик идёт.

Во-первых глупо писать «рушится». Не рушится, а исключение генерируется, которое проходит по всей цепочке обработчиков исключения, но не находит нужного. Во-вторых, у исключения код есть и параметры. Код скорее всего 0xC0000005. И тут уже надо смотреть, куда совершается попытка записи или откуда совершается попытка чтения. Что пишется/читается и по какому адресу. А не тупо писать «рушится».

Во-вторых, предлагаю тебе всё-таки показать код. Наверняка косяк вылезет при первом же взгляде на него.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Re: Как правильно скопировать строковый массив в байтовый?

Сообщение Dimon111 » 22.03.2013 (Пт) 18:14

Хакер писал(а):
Dimon111 писал(а):И получите вылет из функции с разрушением всей программы. Плавали. Знаем.

Да нифига не знаешь. Твоим объяснениям я верю в тысячу раз меньше, чем своим знаниям.
Не плавал ты и не знаешь, вот как. Для тебя это чёрный ящик, и ты просто ищешь удачные методы работы с ним.

А для меня это кристально чистая система, я знаю, что куда передаётся и куда каждый байтик идёт.

Во-первых глупо писать «рушится». Не рушится, а исключение генерируется, которое проходит по всей цепочке обработчиков исключения, но не находит нужного. Во-вторых, у исключения код есть и параметры. Код скорее всего 0xC0000005. И тут уже надо смотреть, куда совершается попытка записи или откуда совершается попытка чтения. Что пишется/читается и по какому адресу. А не тупо писать «рушится».

Во-вторых, предлагаю тебе всё-таки показать код. Наверняка косяк вылезет при первом же взгляде на него.

Не находит нужного это когда у Вас вылезает окно с соответствующим предупреждением. А когда под W7 процесс виснет так, что убить его можно только через Диспетчер - возможно и тут Вы подберёте другое слово, смысл от этого не изменится.

Код с As Byte могу привести только по памяти. Поскольку полгода назад убил на это кучу времени, не получив результата. Прменяю стандартный, пледложенный в описании драйвера D2XX код. Там, кстати про As Byte не сказано ни слова.

Код: Выделить всё
Private Declare Function FT_Read Lib "FTD2XX.DLL" (ByVal Handle As Long, ByVal lpszBuffer As String, ByVal lngBufferSize As Long, ByRef lngBytesReturned As Long) As Long


Код: Выделить всё
Private Sub ReadStr(BytesRead As Long)                        'Подпрограмма приема
Dim ftStatus As Long, I As Single, Ch As String               '
    lngBytesRetuned = 0                                       'Обнулить счетчик прочитанных байт
    ftStatus = FT_Read(Handle, RSVString, BytesRead, lngBytesRetuned) '
    If (ftStatus = FT_IO_ERROR) Then OutLog "IO_ERROR"        'Если произошла ошибка приема - выдать сообщение
End Sub               


Так вот, если ByVal lpszBuffer As String заменить на ByRef lpszBuffer() As Byte в объявлении, а вызывать со ссылкой на первый элемент:
Код: Выделить всё
tStatus = FT_Read(Handle, ByteArr(1), BytesRead, lngBytesRetuned) '


То программа рушится(виснет, не отвечает или что там ещё - я не претендую на название). Спорить не буду, возможно и тут я что - то накосячил, но ни в описании, ни в Сети я не нашёл ни одного примера, в котором вызов этой функции осуществлялся со ссылкой на байтовый массив.
Последний раз редактировалось Dimon111 22.03.2013 (Пт) 18:17, всего редактировалось 1 раз.

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

Re: Как правильно скопировать символьный массив в байтовый?

Сообщение Хакер » 22.03.2013 (Пт) 18:16

Где объявлен ByteArr? Где он редимится? Почему индекс единица?

Ты делаешь ерунду, и сам не отдаёшь себе отчёта о том, насколько ерундой является то, что ты делаешь.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Re: Как правильно скопировать символьный массив в байтовый?

Сообщение Dimon111 » 22.03.2013 (Пт) 18:21

Хакер писал(а):Где объявлен ByteArr? Где он редимится? Почему индекс единица?

Ты делаешь ерунду, и сам не отдаёшь себе отчёта о том, насколько ерундой является то, что ты делаешь.

Наверно Вы имели ввиду Redim Preserve. Так нафига он нужен, если функция работает с массивом ТОЛЬКО фиксированной длинны.

А объявлял я их так:

Код: Выделить всё
Dim RSVString As String * 256
Dim ByteMass(256) As Byte


А если Вы попробуете сунуть в эту функцию ещё и переменный массив, то флаг Вам в руки. Здесь Вы действительно получите исключение. Только не помню какое...

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как правильно скопировать символьный массив в байтовый?

Сообщение ger_kar » 22.03.2013 (Пт) 18:24

Ну виснет косяк потому что в объявлении. Ты объявляешь как массив, соответственно передается указатель не на буфер в памяти а на SafeArray, об этом же уже было написано.
Хакер писал(а):Поэтому переобъявлять надо как ByRef lpBufferFirstElm as Byte и передавать первый элемент буферного массива.
Dimon111 писал(а):ByRef lpszBuffer() As Byte
Разницу чувствуешь?
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 22.03.2013 (Пт) 18:28

Dimon111 писал(а):Так вот, если ByVal lpszBuffer As String заменить на ByRef lpszBuffer() As Byte в объявлении

А почему собственно с массивом?

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

Re: Как правильно скопировать символьный массив в байтовый?

Сообщение Хакер » 22.03.2013 (Пт) 18:28

Dimon111 писал(а):Наверно Вы имели ввиду Redim Preserve. Так нафига он нужен, если функция работает с массивом ТОЛЬКО фиксированной длинны.


Функции глубоко плевать, является SA-массив массивом фиксированной длины или переменной длины. Она даже не знает, это SA-массив или просто какой-то кусок памяти, выделенный, скажем, с помощью HeapAlloc. Ей дали указатель на кусок память и размер этого куска — он в этот кусок пишет.

Чтобы всё прошло гладко, надо просто передать ей правильный указатель и правильный размер куска.

И не надо рассказывать тут про «действительно получите исключение».

Ты может быть потроллть сюда пришёл? Иначе я не вижу причин оспаривать очевидные вещи. Или ты думаешь, я тут дурачок какой-то пришёл и пишу о выдуманных вещах, мало относящихся к реальности?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Re: Как правильно скопировать символьный массив в байтовый?

Сообщение Dimon111 » 22.03.2013 (Пт) 18:30

ger_kar писал(а):Ну виснет косяк потому что в объявлении. Ты объявляешь как массив, соответственно передается указатель не на буфер в памяти а на SafeArray, об этом же уже было написано.
Хакер писал(а):Поэтому переобъявлять надо как ByRef lpBufferFirstElm as Byte и передавать первый элемент буферного массива.
Dimon111 писал(а):ByRef lpszBuffer() As Byte
Разницу чувствуешь?


Наверно я действительно дурак. Не понимаю. Написал же:

    Так вот, если ByVal lpszBuffer As String заменить на ByRef lpszBuffer As Byte в объявлении

Или я не понимаю что такое переобъявление в VB...
Последний раз редактировалось Dimon111 22.03.2013 (Пт) 18:36, всего редактировалось 2 раз(а).

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Re: Как правильно скопировать символьный массив в байтовый?

Сообщение Dimon111 » 22.03.2013 (Пт) 18:34

Хакер писал(а):
Dimon111 писал(а):Наверно Вы имели ввиду Redim Preserve. Так нафига он нужен, если функция работает с массивом ТОЛЬКО фиксированной длинны.


Функции глубоко плевать, является SA-массив массивом фиксированной длины или переменной длины. Она даже не знает, это SA-массив или просто какой-то кусок памяти, выделенный, скажем, с помощью HeapAlloc. Ей дали указатель на кусок память и размер этого куска — он в этот кусок пишет.

Чтобы всё прошло гладко, надо просто передать ей правильный указатель и правильный размер куска.

И не надо рассказывать тут про «действительно получите исключение».

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

Тогда предлагаю пробовать самому. Тролить я не собирался. Я получил ответ на свой вопрос. Зачем в этой ветке открывать тему, которая к ней не относится мне непонятно. Я не спрашивал здесь как работать с D2xx. Вы сами - то работали с D2XX или "настоящему спецу не надо пробовать чтобы знать"?

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как правильно скопировать символьный массив в байтовый?

Сообщение ger_kar » 22.03.2013 (Пт) 18:35

Можешь вообще объявитьByVal pBuffer as Long, а аргумент передавать VarPtr(MyArray(0)) и все прекрасно работает. И до фонаря какой массив статичный или динамичный.
Dimon111 писал(а):Наверно я действительно дурак. Не понимаю. Написал же:Так вот, если ByVal lpszBuffer As String заменить на ByRef lpszBuffer() As Byte в объявленииИли я не понимаю что такое переобъявление...
Ты не понимаешь того, что ты хочешь передать. Разницу ты так и не увидел, хотя она очевидна. В объявлении у Хакера просто переменная, у тебя массив. В Варианте Хакера или как я показал функция получит адрес начала буфера в памяти, в твоем варианте она получает адрес структуры SafeArray.
Бороться и искать, найти и перепрятать

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Re: Как правильно скопировать символьный массив в байтовый?

Сообщение Dimon111 » 22.03.2013 (Пт) 18:38

ger_kar писал(а):Можешь вообще объявитьByVal pBuffer as Long, а аргумент передавать VarPtr(MyArray(0)) и все прекрасно работает. И до фонаря какой массив статичный или динамичный.
Dimon111 писал(а):Наверно я действительно дурак. Не понимаю. Написал же:Так вот, если ByVal lpszBuffer As String заменить на ByRef lpszBuffer() As Byte в объявленииИли я не понимаю что такое переобъявление...
Ты не понимаешь того, что ты хочешь передать. Разницу ты так и не увидел, хотя она очевидна. В объявлении у Хакера просто переменная, у тебя массив. В Варианте Хакера или как я показал функция получит адрес начала буфера в памяти, в твоем варианте она получает адрес структуры SafeArray.

Там скобок нет. Писал по памяти - ошибся. Результат всё равно был печальный...

Ок. Раз пошла такая пьянка в понедельник попробую. Железо у меня на работе...
Последний раз редактировалось Dimon111 22.03.2013 (Пт) 18:39, всего редактировалось 1 раз.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как правильно скопировать символьный массив в байтовый?

Сообщение ger_kar » 22.03.2013 (Пт) 18:39

Dimon111 писал(а):Тогда предлагаю пробовать самому. Тролить я не собирался. Я получил ответ на свой вопрос.
Все прекрасно работает. Ничего даже и не думает 'падать'.
Бороться и искать, найти и перепрятать

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

Re: Как правильно скопировать символьный массив в байтовый?

Сообщение Хакер » 22.03.2013 (Пт) 18:40

Dimon111 писал(а):Зачем в этой ветке открывать тему, которая к ней не относится мне непонятно.

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

Dimon111 писал(а):Наверно я действительно дурак. Не понимаю. Написал же:

Так вот, если ByVal lpszBuffer As String заменить на ByRef lpszBuffer() As Byte в объявлении

Наверное ты действительно невнимательный.

Читаем ещё раз:
Хакер писал(а):Если ты в объявлении аргумент ByVal lpszBuffer As String заменишь на ByRef lpszBuffer() As Byte, то вызываемая функция будет получать указатель на SafeArray-дескриптор (это неправильный исход дела).

Поэтому переобъявлять надо как ByRef lpBufferFirstElm as Byte и передавать первый элемент буферного массива. (это правильный исход)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Re: Как правильно скопировать символьный массив в байтовый?

Сообщение Dimon111 » 22.03.2013 (Пт) 18:41

ger_kar писал(а):
Dimon111 писал(а):Тогда предлагаю пробовать самому. Тролить я не собирался. Я получил ответ на свой вопрос.
Все прекрасно работает. Ничего даже и не думает 'падать'.

Ну так может покажете код? Я бы сравнил с тем, что писал... Объявление функции, массива, вызов...

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Re: Как правильно скопировать символьный массив в байтовый?

Сообщение Dimon111 » 22.03.2013 (Пт) 18:47

Хакер писал(а):
Dimon111 писал(а):Зачем в этой ветке открывать тему, которая к ней не относится мне непонятно.

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

Dimon111 писал(а):Наверно я действительно дурак. Не понимаю. Написал же:

Так вот, если ByVal lpszBuffer As String заменить на ByRef lpszBuffer() As Byte в объявлении

Наверное ты действительно невнимательный.

Читаем ещё раз:
Хакер писал(а):Если ты в объявлении аргумент ByVal lpszBuffer As String заменишь на ByRef lpszBuffer() As Byte, то вызываемая функция будет получать указатель на SafeArray-дескриптор (это неправильный исход дела).

Поэтому переобъявлять надо как ByRef lpBufferFirstElm as Byte и передавать первый элемент буферного массива. (это правильный исход)

Да написал же выше. Нет там скобок.

Блин. Трудно соображать когда ребёнок орет на ухо. Я задал простой вопрос, не думал что он за собой так глубоко потянет...

Вот так было: ByRef ByteArray As Byte. ByteArray объявлен фиксированным ByteArray(256). Всё равно под семёркой окно становится бледным и убивается только через Диспетчер.

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

Re: Как правильно скопировать символьный массив в байтовый?

Сообщение Хакер » 22.03.2013 (Пт) 18:54

Dimon111, если ты продолжишь грешить оверквоттингом, ты будешь наказан. :!:
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

След.

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

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

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

    TopList