Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Преобразование типов / 25 сообщений из 29, страница 1 из 2
18.03.2008, 11:38
    #35197266
Anton_85
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
Есть массив
Dim x(0 To 3) As Byte

Есть переменная integer
Dim xx As Integer

при выполнении
xx = CInt(x) - получаем ошибку
Error 1 Value of type '1-dimensional array of Byte' cannot be converted to 'Integer'.
Form1.vb

ПОЧЕМУ?????
...
Рейтинг: 0 / 0
18.03.2008, 11:44
    #35197296
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
ты массив байт пытаешься преобразовать в одну переменную integer, поэтому и ошибка.
нужно преобразовывать конкретный элемент массива.

Код: plaintext
xx=CInt(x( 0 ))
...
Рейтинг: 0 / 0
18.03.2008, 11:56
    #35197337
Anton_85
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
а как тогда получить из этих четырех элементов массива получить одно число типа integer
желательно пример в одну строчку
...
Рейтинг: 0 / 0
18.03.2008, 12:03
    #35197371
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
Anton_85,
а ты сам как представляешь правила перевода массива из четырёх байтовых элементов в двухбайтное целое?
...
Рейтинг: 0 / 0
18.03.2008, 12:07
    #35197388
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
> Автор: Anton_85
> а как тогда получить из этих четырех элементов массива получить одно
> число типа integer
> желательно пример в одну строчку
разберёшся?

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
18.03.2008, 12:29
    #35197487
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
Можно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Option Explicit

Type tByte4
    b( 0  To  3 ) As Byte
End Type
Type tLong
    x As Long
End Type

Public Sub Main()
    Dim t As tLong, b As tByte4
    
    b.b( 0 ) =  0 
    b.b( 1 ) =  4 
    
    LSet t = b

    Debug.Print t.x
End Sub
...
Рейтинг: 0 / 0
18.03.2008, 12:32
    #35197501
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
А если на выходе надо иметь именно Integer (точнее их будет 2-а, ведь 4-ре байта), то:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Option Explicit

Type tByte4
    b( 0  To  3 ) As Byte
End Type
Type tLong
    x As Integer
    y As Integer
End Type

Public Sub Main()
    Dim t As tLong, b As tByte4
    
    b.b( 0 ) =  0 
    b.b( 1 ) =  4 
    
    LSet t = b

    Debug.Print t.x, t.y
End Sub
...
Рейтинг: 0 / 0
18.03.2008, 15:24
    #35198216
Anton_85
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
а как мне его загнать в этот код???

Public Class Form1
Dim x(0 To 3) As Byte
Dim z As String
Dim xx As Integer
Dim myob As Object
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim b As FileStream = New FileStream("c:\1.bmp", FileMode.Open)
b.Position = 2
b.Read(x, 0, 4)
xx = CInt(x(0))
myob = x
' x(0) = 1
'x(1) = 1
'x(2) = 1
'x(3) = 2
z = CStr(x(0))
Dim q As Integer = CInt(x(0))

MsgBox(CStr(CInt(x(0))))

b.Close()
End Sub
End Class
...
Рейтинг: 0 / 0
18.03.2008, 16:16
    #35198449
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
Anton_85,
Если ваш код из .NET, то милости просим в .NET форум. Здесь VB6, VBA, VBS
...
Рейтинг: 0 / 0
19.03.2008, 15:10
    #35200847
Eric-S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
Выдераю из рабочего кода.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
dim fbyte( 0  to  3 ) As Byte
dim c as long
dim t as long
dim o as long
dim e as long
 
t =  0 
For E =  3  To  0  Step - 1 
c =  256  ^ E
t = t + c * fbyte(E)
Next E
o = t
MsgBox o

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

Есть и обратная процедура.
...
Рейтинг: 0 / 0
19.03.2008, 15:50
    #35200994
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
Извращенцы вы все...
Код: plaintext
1.
2.
dim fbyte( 0  to  3 ) As Byte
dim c as long
CopyMemory с, fbyte( 0 ),  4 
...
Рейтинг: 0 / 0
19.03.2008, 15:58
    #35201023
Eric-S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
AntonariyИзвращенцы вы все...
Код: plaintext
1.
2.
dim fbyte( 0  to  3 ) As Byte
dim c as long
CopyMemory с, fbyte( 0 ),  4 


Ну а что делать, тем, кто не является, счастливым обладателем понятного справочника? Остаётся извращатся!

Я так понял, что CopyMemory
берёт x байт, в третьем аргументе, начиная с адреса второго, и всё это помещает в первый?
CopyMemory [результат], [что], [сколько]

А как проделать обратное преобразование? Т.е. из длинного целого записать эти 4 байта?
...
Рейтинг: 0 / 0
19.03.2008, 16:31
    #35201153
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
Eric-SНу а что делать, тем, кто не является, счастливым обладателем понятного справочника?Не забывать, что они являются счастливыми обладателями интернета, посредством которого доступен понятный справочник msdn.microsoft.com )))
Eric-SА как проделать обратное преобразование?Мог бы уже догадаться))
Код: plaintext
CopyMemory fbyte( 0 ), с,  4 
...
Рейтинг: 0 / 0
19.03.2008, 16:45
    #35201208
Eric-S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
msdn там всё самое интересное на английском.
В прочем у меня есть локальная версия, так же не русифицированная.

А я вот тут, подумал, ведь long, ну и другие переменные немного не в той форме значение хранят.
Т.е. значение-то будет сохранено и востановлено, только вот, формат его записи будет другой.
А ещё целый бит тратится на знак "-" (минус)!
...
Рейтинг: 0 / 0
19.03.2008, 16:59
    #35201261
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
А я вот тут, подумал, ведь long, ну и другие переменные немного не в той форме значение хранят.
Т.е. значение-то будет сохранено и востановлено, только вот, формат его записи будет другой.В смысле старший-младший байты? Возможно. Зависит от смысла преобразования и использования массива.
А ещё целый бит тратится на знак "-" (минус)!Нет, знак получается из формата записи. -1 = FF FF FF FF, -2 = FE FF FF FF, -3 = FD FF FF FF и т.д.
...
Рейтинг: 0 / 0
19.03.2008, 18:38
    #35201592
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
Eric-SВыдераю из рабочего кода.Это нерабочий код. Не учтён случай старшего байта, большего 127.
...
Рейтинг: 0 / 0
19.03.2008, 18:41
    #35201597
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
Eric-SА ещё целый бит тратится на знак "-" (минус)!Неправда. "Родным" для 80x86 архитектуры является представление 32-битных целых в дополнительном коде.
...
Рейтинг: 0 / 0
19.03.2008, 18:53
    #35201642
Eric-S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
Бенедикт Eric-SА ещё целый бит тратится на знак "-" (минус)!Неправда. "Родным" для 80x86 архитектуры является представление 32-битных целых в дополнительном коде.

Но мы то говорим о бэйсиковских integer и long!

Про рабочий код... Там это в другом месте проверяется. Здесь вообще число не может быть очень большим. Обычно два старших байта вообще в ноль. Это не универсальная функция, а именно конкретный случай.
Кому понадобится писать имя файла размером 4 gb?
...
Рейтинг: 0 / 0
19.03.2008, 20:03
    #35201787
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
Eric-SНо мы то говорим о бэйсиковских integer и long!Угу. Напрямую использующих соответствующие машинные типы. Что должен выдать код
Код: plaintext
1.
2.
Dim i As Integer, l As Long
i = &H8000: l = &HFFFFFFFF
Debug.Print i, l
? Почему? Почему выдаёт, что выдаёт?
Eric-SПро рабочий код... Там это в другом месте проверяется. Здесь вообще число не может быть очень большим. Обычно два старших байта вообще в ноль. Это не универсальная функция, а именно конкретный случай.Было бы это указано - ни слова бы не сказал.
Eric-SКому понадобится писать имя файла размером 4 gb?Откуда взялось имя файла?
...
Рейтинг: 0 / 0
19.03.2008, 20:27
    #35201835
Eric-S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
Ладно с типами данных и способами их хранения, могу и ошибатся.
[quote]
are stored as 16-bit (2-byte) numbers ranging in value from -32,768 to 32,767. The...
[/quote]
Здесь я вижу отрицательное число. Дальше, в 16 битах у нас 2^16 возможных значений. Т.е. 65536, отсюда пришел к выводу, что один байт означает отрицательное число.

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


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

На асме это бы выглядело бы ещё веселее, но мне и этот вариант подходит. Там же по сути просто dword грузится в 32 битный регистр, и это уже не 4 соседних байта, а длинное целое число.


С 4 гиговым именем файла, немного преувеличил. На самом деле моя процедура работает с размерами текстовых документов. А многие редакторы хоть и хвалятся способностью прожевать 2 гиговый текстовик, но делают это очень долго и в принципе это никому не нужно.
...
Рейтинг: 0 / 0
19.03.2008, 20:37
    #35201864
Eric-S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
Задаю вопрос, который так же подпадает под заголовок данный темы.

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
dim b() as byte
dim s as string
s = "привет, люди!"

redim b( 1  to len(s))

' на этой строке ошибка
b = ascb(s)

' на этой тоже
s = chrb$(b)

Пока извратился и написал свой перевод, но он естественно работает медленнее. И copyMem здесь не подайдёт, поскольку s, кажется, в уникоде. Кстати эта же функция в какой-то dll'ке?
...
Рейтинг: 0 / 0
20.03.2008, 10:37
    #35202604
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
StrConv или опять же CopyMemory.
...
Рейтинг: 0 / 0
20.03.2008, 10:38
    #35202610
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
Или просто b = s =)
...
Рейтинг: 0 / 0
20.03.2008, 15:37
    #35203896
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
Eric-SЛадно с типами данных и способами их хранения, могу и ошибатся.

are stored as 16-bit (2-byte) numbers ranging in value from -32,768 to 32,767. The...

Здесь я вижу отрицательное число. Дальше, в 16 битах у нас 2^16 возможных значений. Т.е. 65536, отсюда пришел к выводу, что один байт означает отрицательное число.

На сколько я помню, в машине об отрицательных числах реч вообще не идёт. Там отдельный флаг процессора."В огороде бузина, в Киеве дядька." IA-32 Intel(R) Architecture Software Developer's Manual. Volume 1: Basic Architecture4 Data Types
...
4.2.1. Integers
The IA-32 architecture defines two typed of integers: unsigned and signed. Unsigned integers are ordinary binary values ranging from 0 to the maximum positive number that can be encoded in the selected operand size. Signed integers are two’s complement binary values that can be used to represent both positive and negative integer values.
Some integer instructions (such as the ADD, SUB, PADDB, and PSUBB instructions) operate on either unsigned or signed integer operands. Other integer instructions (such as IMUL, MUL, IDIV, DIV, FIADD, and FISUB) operate on only one integer type.
The following sections describe the encodings and ranges of the two types of integers.
4.2.1.1. UNSIGNED INTEGERS
...
4.2.1.2. SIGNED INTEGERS
...
...
Рейтинг: 0 / 0
20.03.2008, 16:59
    #35204198
Eric-S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование типов
Бенедикт
"В огороде бузина, в Киеве дядька."

Именно. Я цитировал msdn, про vb6, а вы архитектуру 32 разрядного проца. Как я уже писал типы разные, хоть названия и одинаковые.
CopyMem будет копировать именно бэйсиковский формат никуда его не преобразуя.
На то я и писал функцию, чтобы привести данные из одного формата в другой.

Если кто работал с FreeBasic, поймёт всю нелепость сложившейся ситуации, поскольку в нём этих типов данных ещё больше.
Например В нём есть integer и uinteger, первая стандартная бэйсиковская, а вторая именно стандартная машинная, т.е. положительное целое.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Преобразование типов / 25 сообщений из 29, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]