Нужно перенести этот код с QB на VB6

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

Нужно перенести этот код с QB на VB6

Сообщение GRS » 08.07.2006 (Сб) 15:30

Приветствую!

Столкнулся с проблемой. Оператор AND в VB6 работает как-то непонятно.

Есть некий код, отлично работающий в QB:
Код: Выделить всё
10 REM----8BITS ----
20 KEY OFF: CLS
30 B = &H3F8: REM COM1
40 N = 8:
50 OUT B + 4, 1
60 FOR T = 0 TO 100: NEXT
70 OUT B + 3, 64
80 FOR T = 0 TO 500: NEXT
90 GOTO 200
100 OUT B + 4, 0: d = 0: REM ACQUISITION
110 FOR F = 0 TO N - l
120 OUT B + 4, 2
130 E = INP(B + 6) AND 16
140 OUT B + 4, 0
150 IF E = 16 THEN d = d + 2 ^ (N - 1 - F)
160 NEXT F
170 d = 5 * d / (2 ^ N - 1)
180 OUT B + 4, 1: RETURN
200 FOR h = 1 TO 500
205 GOSUB 100
210 CLS : LOCATE 1, 1
215 d = INT(100 * d) / 100
220 PRINT d, h
230 FOR z = 1 TO 5000000: NEXT z
240 NEXT h


Объясните мне пожалуйста строчку 130 и как мне ее переписать на VB6? Что вообще делает этот оператор и почему число 16 стоит? Что он сравнивает или записывает? :roll:
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 08.07.2006 (Сб) 15:42

Запускаешь QB, пишешь INP, жмёшь F1. Сделал бы сам, но у меня под рукой QB нету.
Изображение

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 08.07.2006 (Сб) 18:54

INP - ввод из порта, OUT - вывод в порт.
Но из VB напрямую работать с портами нельзя, а если бы было можно - все равно порты могут под Windows иметь совсем другое назначение.

AND 16 - оставить в числе только пятый бит.

GRS
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 186
Зарегистрирован: 29.02.2004 (Вс) 22:23
Откуда: Казахстан, Алматы

Сообщение GRS » 08.07.2006 (Сб) 20:10

Про INP и OUT я знаю - не в этом дело. И, кстати, в VB можно работать напрямую с портами - куча библиотек, та же inpout32.dll.
А, про "оставить в числе только пятый бит" - можно подробнее? Я полагал идет операция сравнивания. Да, и по тексту как-то не сходится - все время пятый бит оставлять? Кажется, тут нечто иное... Кто знает - что?
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.07.2006 (Сб) 21:27

Код: Выделить всё
130 E = INP(B + 6) AND 16
в E записывается пятый бит из порта (B + 6)
Код: Выделить всё
150 IF E = 16 THEN d = d + 2 ^ (N - 1 - F)
если он установлен, d увеличивается
Изображение

GRS
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 186
Зарегистрирован: 29.02.2004 (Вс) 22:23
Откуда: Казахстан, Алматы

Сообщение GRS » 09.07.2006 (Вс) 8:57

tyomitch, почему именно пятый? 16 - это ж не 5, на худой конец - 10000 (binary). E содержит В+6, а оператор AND что делает?

Мля, ну я чё совсем дебил что ли? :roll: нифига не могу понять... Это, кстати, и есть драйвер АЦП, tyomitch.
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 09.07.2006 (Вс) 9:58

Драйвер АЦП? В цитаты :)

GRS, пятый бит, потому что единица в числе 10000 стоит на пятом месте.

Учи матчасть, все объяснять - года не хватит.

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 09.07.2006 (Вс) 10:43

GRS писал(а):tyomitch, почему именно пятый? 16 - это ж не 5, на худой конец - 10000 (binary).
Добавлено в "цитаты" :lol:
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

Efiop
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 69
Зарегистрирован: 06.06.2006 (Вт) 12:14
Откуда: РК

Сообщение Efiop » 10.07.2006 (Пн) 6:58

INP (port% )
INP - возвращает байт, считанный с аппаратного порта ввода/вывода.
port% - число в пределах от 0 до 65535, определяющее порт

а оператор AND что делает?

150 IF E = 16 THEN d = d + 2 ^ (N - 1 - F)
если он установлен, d увеличивается


сделай на васике:
Код: Выделить всё
For i = 0 To 10000
      s = i And 16
      List1.AddItem i & " -" & s
Next i

и увидишь, что происходит.

GRS
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 186
Зарегистрирован: 29.02.2004 (Вс) 22:23
Откуда: Казахстан, Алматы

Сообщение GRS » 10.07.2006 (Пн) 16:15

Всем привет :)

Amed, "драйвер" и есть код:
Код: Выделить всё
10 REM----8BITS ----
20 KEY OFF: CLS
30 B = &H3F8: REM COM1
40 N = 8:
50 OUT B + 4, 1
60 FOR T = 0 TO 100: NEXT
70 OUT B + 3, 64
80 FOR T = 0 TO 500: NEXT
90 GOTO 200
100 OUT B + 4, 0: d = 0: REM ACQUISITION
110 FOR F = 0 TO N - l
120 OUT B + 4, 2
130 E = INP(B + 6) AND 16
140 OUT B + 4, 0
150 IF E = 16 THEN d = d + 2 ^ (N - 1 - F)
160 NEXT F
170 d = 5 * d / (2 ^ N - 1)
180 OUT B + 4, 1: RETURN
200 FOR h = 1 TO 500
205 GOSUB 100
210 CLS : LOCATE 1, 1
215 d = INT(100 * d) / 100
220 PRINT d, h
230 FOR z = 1 TO 5000000: NEXT z
240 NEXT h


где с 20 по 80 строку - "инициализация",
а с 100 по 180 - сама программа считывания. 200-240 - Это цикл для считывания, а так: FOR z = 1 TO 5000000: NEXT z я задаю задержку на своем Athlon64 :D
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

GRS
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 186
Зарегистрирован: 29.02.2004 (Вс) 22:23
Откуда: Казахстан, Алматы

Сообщение GRS » 10.07.2006 (Пн) 18:55

Efiop, я нифига понять не могу... Запустил код (и в VB6, и в QB - выдает одинаковый результат) и увидел:
Код: Выделить всё
0 - 0
1 - 0
2 - 0
......
14 - 0
15 - 0
16 - 16
17 - 16
18 - 16
......
30 - 16
31 - 16
32 - 0
33 - 0
......
......


Заменял 16 на 2, получается то же самое, только интервал 2 числа. А, если ставить 3 - вообще: 0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3......... и т.д.

Кто-нибудь можется сказать: ЧТО ДЕЛАЕТ AND?

По идее, АЦП выдает число от 0 до 255, как результат своих преобразований. Т.е. 0 эквивалентен напряжению +0В, а 255 напряжению +5В, таковы пределы его преобразований. Еще сказано, что он 8-битный. Получается, что из порта нельзя прочитать число как таковое? Этот "драйвер" его по битам вытаскивает, так что ли? Ну, тогда я вообще не понимаю... Получается, что INP(B + 6) даст нам или 0 или 1, а цикл мы повторяем 8 раз (from 0 to N-1, при N = 8, я так понимаю это 8 бит означает...) и из полученных 0 или 1 формируем число d = d + 2 ^ (N - 1 - F) - это так работает? Тогда зачем нам вообще эта строчка E = INP(B + 6) AND 16?
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 10.07.2006 (Пн) 21:07

And делает логическое и.
У 16 все биты кроме пятого нули. Если у второго числа пятый бит тоже не ноль, то будет 16 если ноль, то ноль.

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 11.07.2006 (Вт) 0:25

And делает логическое и.

Не совсем так! And здесь не логическая, а побитовая операция.
1) Берётся 1-й операнд
2) Смотрят на старший бит
3) Если от 0 до 7 -- значит число положительное и кодируется в прямом коде
Если от 8 до F, то берётся дополнительный код числа
4) то же со 2-м
5) И только теперь делается побитовая операция.
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.07.2006 (Вт) 2:14

GRS писал(а):Получается, что из порта нельзя прочитать число как таковое? Этот "драйвер" его по битам вытаскивает, так что ли?

Именно так.
COM-порт потому и называется последовательным, что передаёт биты последовательно, по одному. Склеивать их в байты -- обязанность приёмника.


Роман-вб, не бредь. Перед операцией AND ни одно из чисел ни в каком коде не кодируется, потому что в программе (и вообще в компьютере) они все уже закодированы.
Т.ч. в твоём "алгоритме" все шаги, кроме пятого, -- чепуха.
Изображение

GRS
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 186
Зарегистрирован: 29.02.2004 (Вс) 22:23
Откуда: Казахстан, Алматы

Сообщение GRS » 11.07.2006 (Вт) 10:14

Для отображения чисел от 0 до 255 достаточно 8 бит. А по тексту и Вашим поправкам выходит, что каждый бит этого числа выдается еще раз по-битно?? Если 1 - то ооо1оооо, а если 0 - тогда ооо0оооо... Как считаете - это правильно? Почему все крутится вокруг пятого бита?
Что за строчка магическая E = INP(B + 6) AND 16?...
Встану рано утром, выпью чашку ртути... Всё равно я сдохну в этом институте...

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 11.07.2006 (Вт) 10:18

Роман-вб писал(а):
And делает логическое и.

Не совсем так! And здесь не логическая, а побитовая операция.
1) Берётся 1-й операнд
2) Смотрят на старший бит
3) Если от 0 до 7 -- значит число положительное и кодируется в прямом коде
Если от 8 до F, то берётся дополнительный код числа
4) то же со 2-м
5) И только теперь делается побитовая операция.

2vvs_adm: и это в цитаты

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 11.07.2006 (Вт) 12:34

Nicky
tyomitch
НЕТ СЛОВ!!!

tyomitch
Да, я согласен, что отрицательные десятичные числа при вводе в машину автоматически преобразуются в обратный или дополнительный двоичный код и в таком виде хранятся, перемещаются и участвуют в операциях. При выводе таких чисел из машины происходит обратное преобразование в отрицательные десятичные числа и этот алгоритм можно было не приводить. Но этот алгоритм действительно правильный (может не подробный)

Исходя из этого, товарищи, заявление
Т.ч. в твоём "алгоритме" все шаги, кроме пятого, -- чепуха.
ОТКЛОНЯЕТСЯ!

Это я только обяснил:

Перед операцией AND ни одно из чисел ни в каком коде не кодируется, потому что в программе (и вообще в компьютере) они все уже закодированы.


Nicky
А то, что ты пытаешься опровергнуть утверждение, что в данном случае And -- это не побитовая, а логическая опреация -- вот это и есть бред!

Логические операции применимы только над логическими преременными, и их резулттат -- True или False. А результат побитовой операции -- число!
:wink:
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.07.2006 (Вт) 12:40

Роман-вб, в VB6 вообще нет логических операций, только побитовые ;-)



Иллюстрация:
Код: Выделить всё
Private Declare Function Disguise Lib "msvbvm60" Alias "VarPtr" (ByVal Value As Integer) As Boolean

Sub Main()
Dim a As Boolean, b As Boolean
    a = Disguise(1): b = Disguise(2)
    Debug.Print a, b, a And b
End Sub
Последний раз редактировалось tyomitch 11.07.2006 (Вт) 12:46, всего редактировалось 1 раз.
Изображение

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 11.07.2006 (Вт) 12:42

Одного не понимаю, что мешает логической операции быть побитовой?

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 11.07.2006 (Вт) 12:50

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

Роман-вб

Они все побитовые. Не поверишь, но все :)

Разница только в интерпретации результата.

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 11.07.2006 (Вт) 12:51

GAGArin
всё строго регламентированно: для логич. переменных -- логичесие опрерации, а вот для целых чисел -- побитовая.

tyomitch
знаю, но это формальность. У нас есть 2 логические константы, и нам не прихордится задумываться, что на самом деле в них какие-то числа. А вот побитовые опрерации с чисщами -- другое дело
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 11.07.2006 (Вт) 12:55

RayShade
да, но речь была не об этом :D . Я просто описал, как действует And и т.д. с числами! Не более.

И по-моему, я не утверждал, что "они не все побитовые".

Они все побитовые. Не поверишь, но все
Разница только в интерпретации результата.


Почему же не поверю? :roll:
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 11.07.2006 (Вт) 12:59

Роман-вб писал(а):RayShade
да, но речь была не об этом :D .
Таки где конкретно поезд, хотелось бы знать? Изображение
Лучший способ понять что-то самому — объяснить это другому.

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 11.07.2006 (Вт) 13:05

Antonariy писал(а):
Роман-вб писал(а):RayShade
да, но речь была не об этом :D .
Таки где конкретно поезд, хотелось бы знать? Изображение

ЖЖЁШЬ :D
Я имел в виду , что речь не о том, что "они все побитовые" :D
Последний раз редактировалось Роман-вб 11.07.2006 (Вт) 16:04, всего редактировалось 1 раз.
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

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

Сообщение Viper » 11.07.2006 (Вт) 13:05

.Мдя! Нет слов! Автору срочно рекомендуется учить матчасть в разделе "биты и байты", а Роману-vb изучать представление целых чисел г компе.
Весь мир матрица, а мы в нем потоки байтов!

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 11.07.2006 (Вт) 13:11

!Viper!

а Роману-vb изучать представление целых чисел г компе

Это голословная фраза. Ну где я ошибся, говоря о представлении целых чисел
ты меня убил. я КОНСТАТИРУЮ лишь факты, а не высказываю предположения
хочешь ссылку на научный источник???
Лейла Залим-Гериевна
Кандидат технических наук, доцент кафедры информатики и математического обеспечения автоматизированных систем Кабардино-Балкарского государственного университета
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 11.07.2006 (Вт) 13:55

Странные факты, чесслово.

Я даже, не знаю что и ответить.

Помнится, один француз (Руссо?) сказал как то что наполовину образованный - вдвойне дурак.

По моему, этот топик хорошая тому иллюстрация.

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 11.07.2006 (Вт) 14:46

RayShade
Если где-то ошибся, споритть не буду. Где конкретно я ошибся, говоря о представлении целых чисел ?

А вот это ничего абсолютно не значит
наполовину образованный - вдвойне дурак
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.07.2006 (Вт) 15:16

Роман-вб писал(а):GAGArin
всё строго регламентированно: для логич. переменных -- логичесие опрерации, а вот для целых чисел -- побитовая.

Какая, по-твоему, разница между целыми числами и логическими переменными? (Сейчас дойдём до "пяти истинных типов данных" :twisted:)
Изображение

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 11.07.2006 (Вт) 15:19

Я писал(а):tyomitch
знаю, но это формальность. У нас есть 2 логические константы, и нам не прихордится задумываться, что на самом деле в них какие-то числа. А вот побитовые опрерации с чисщами -- другое дело
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

След.

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

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

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

    TopList