Событие "move" у формы и несколько нагоревших вопросов

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

Событие "move" у формы и несколько нагоревших вопросов

Сообщение Rody66 » 12.10.2011 (Ср) 14:16

Приветствую всех.
Для начала хотел бы узнать, как можно отследить событие передвижения формы по экрану. И раз уж вопрос совсем простой, то очень хотелось бы узнать ответы на несколько простых вопросов по, так сказать, мат части. Итак:
1. Чем отличается Chr(255) от Chr$(255) ? Насколько мне известно, во всех официальных источниках используется Chr$(), но Chr() точно так же отлично работает.
2. В чем разница между следующими записями: Dim s$: s = "any" и Dim s$: s$ = "any" . И та же история с & (long) и т.д.
3. Что такое 0 символ в ascii таблице? То есть, что из себя представляет Chr(0) и зачем он нужен? Также, мне известно что нулевыми байтами разделяется текст в уникоде и исполняемые файлы в основном содержат как раз нулевые байты (ибо кодированы в уникод).
4. Переменная типа байт может содержать максимальное значение 255 (FF) - 1 байт. Переменная же типа Integer (2 байта) по этой логике должна содержать максимальное значение 65535, и никаких отрицательных чисел, ибо байтовый тип отрицательных чисел не содержит, но на деле это получается не 65535, а лишь диапозон от -32768 до 32767 (промежуток между которыми и равен 65535), та же история и с последующими типами (Long, Double и т.д). Так вот почему так происходит и где тут, собственно, логика?
5. Зачем вообще нужна переменная типа Byte, когда строковая переменная может точно с таким же успехом хранить диапазон символов от 0 до 255? И почему байтовый тип везде обозначается как числовой, хотя на деле он отлично хранит символы?
6. Какой самый большой числовой тип в бейсике, и можно ли создать больший? И тут же, что больше Double или Currency ?
7. Что за мистический тип 16-ти байтовый переменной Decimal, который описан в инете, но в бейсике оного я найти не смог.
8. И уж совсем отходя от темы, зная тот факт, что здесь частенько присутствуют крупные специалисты, осмелюсь задать вопрос про архитектуру процессоров и как ее вообще понимать. а) Почему 32 бита называются х86, а 64 бита х64, опять же, где логика? Ну и разница в программах, которые написаны под х86 платформу и теми, которые написаны на х64 платформу. По данному вопросу я конечно же не прошу давать полный, развернутый ответ своими словами, но хотя бы какую-нибудь понятную литературку на эту тему.
Ссылки на литературу приветствуются. Всем добровольцам заранее благодарен за ответы. Был бы рад услышать ответы хоть на часть вопросов.
ЗЫ По мере воспоминаний, возможно, буду чуть-чуть дополнять список вопросов.
ЗЫ2 Либо я что-то пропустил, либо на форуме и правда нету топика для "быстрых" вопросов, то есть для того типа вопросов, что я сейчас задал в этой теме. И это странно.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Событие "move" у формы и несколько нагоревших вопросов

Сообщение iGrok » 12.10.2011 (Ср) 14:36

Мать-мать-мать... - привычно откликнулось эхо.

1) Первый даёт на выходе Variant, второй - String.
2) Никакой.
3) Нулевой символ - это символ с кодом 0. Chr$(0) нужен для того, чтобы его получить. Остальная часть вопроса, начиная с "Также мне известно.." - бред, не имеющий с реальностью ничего общего.
4) Нет логики. Байт - беззнаковый, остальные - знаковые. Запомни.
5) Чтобы работать с байтами, а не со строками. Байтовый тип не хранит символы, он действительно числовой.
6) Что значит "самый большой"?
7) Это подтип типа Variant

32 бита никак не называются.
Одна из 32битных архитектур процессоров называется x86. Архитектуры x64 не существует, существует x86-64. Её, видимо для краткости, называют x64.
label:
cli
jmp label

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

Re: Событие "move" у формы и несколько нагоревших вопросов

Сообщение Хакер » 12.10.2011 (Ср) 14:41

Rody66 писал(а):Так вот почему так происходит и где тут, собственно, логика?

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


Неправильно говорить, что 32 бита = x18.

Первый 4-битный процессор от Intel имел название i4004.
Первый 8-битный — i8008
Второе поколение 8-битных — i8080.
Третье поколение 8-битных — i8085.
Потом прибавили ещё одну единичку, и это стало обозначением первого 16-битного:
Первый 16-битрый процессор — i8086
Потом были i8086, i80186.
Потом был i80286, в котором появился защищённый режим, но он по прежнему оставался 16-битным.
Потом появился i80386, в котором был защ. режим, и который мог на выбор программиста работать либо как 16-, либо как 32- битный процессор. Причём, не целиком, а каждая задача в отдельности могла быть 16- или 32-битной.
Потом были i80486, i80586 (начиная с котороых пошли словесные наименования, вроде «Пентиумов»).
Аспект с выбором разрядности наследуется с i386 дальше всей последующей линейкой.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение Qwertiy » 12.10.2011 (Ср) 14:57

3. Для большинства фкнкций WinApi и функций, написанных на Си++, символ с кодом 0 является признаком конца строки. Аналогично, для юникода используется двухбайтный ноль.
4. За логикой иди в MicroSoft к разработчикам VB6. Во многих языках (Си, Си++, все .NET) все целые типы (int8, int16, int32, int64) имеют как знаковый, так и беззнаковый вариант.
5. Одно число, другое - строка.
6а. Подозреваю, что Long. Если очень постараться, то можно всё.
6б. Currency - это тип с фиксированной точкой, Double - с плавающей. Нелогично их сравнивать по диапазону.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Событие "move" у формы и несколько нагоревших вопросов

Сообщение iGrok » 12.10.2011 (Ср) 15:39

Ах, да. :)
Перемещение формы по экрану можно отследить, сделав сабклассинг и обрабатывая сообщение WM_MOVE. За подробностями - в поиск по этим двум ключевым словам.
label:
cli
jmp label

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Событие "move" у формы и несколько нагоревших вопросов

Сообщение Rody66 » 12.10.2011 (Ср) 16:09

Сколько добровольцев слетелось, всем большое спасибо. Но все-таки по некоторым пунктам хочу провести некоторые уточнения.
5) Чтобы работать с байтами, а не со строками. Байтовый тип не хранит символы, он действительно числовой.

5. Одно число, другое - строка.

И тем не менее, если в байтовый массив загнать текст, и вызвать мессагу с содержанием этого байта, то будет выведет именно текст, без каких либо дополнительных преобразований.
6) Что значит "самый большой"?

Тот, который умещает самые большие числовые значения, и может спокойно производить манипуляции с ними.
7) Это подтип типа Variant

А это Вы, собственно, как выяснили?

32 бита никак не называются.
Одна из 32битных архитектур процессоров называется x86. Архитектуры x64 не существует, существует x86-64. Её, видимо для краткости, называют x64.

Неправильно говорить, что 32 бита = x18.

Ну, то, что 32 бита = x18 никто и не говорил. А по делу, я так и не понял, что же все-таки считается правильным? 32 бита, 64 бита - верно; х86, х64 - неверно. если смотреть с чисто технически-педантичной стороны, так?
3. Для большинства фкнкций WinApi и функций, написанных на Си++, символ с кодом 0 является признаком конца строки. Аналогично, для юникода используется двухбайтный ноль.

Уж очень хочется лицезреть пример такого использования нулевого бита :)
6а. Подозреваю, что Long. Если очень постараться, то можно всё.

Число размером всего в ~ 2 миллиарда? (4.2 при самом наилучшем раскладе). Дабл же вроде как в сотни раз больше.. Или я чего-то не знаю?
6б. Currency - это тип с фиксированной точкой, Double - с плавающей. Нелогично их сравнивать по диапазону.

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

Таким образом, "размер" переменной Integer равен FFFF, в то время как ее максимальное значение равно 7FFF, а чему же тогда равно минимальное значение в хексе?
Перемещение формы по экрану можно отследить, сделав сабклассинг и обрабатывая сообщение WM_MOVE. За подробностями - в поиск по этим двум ключевым словам.

Я уж думал и не вспомните.. Спасибо, посмотрю.
Хакеру так же отдельное спасибо за небольшую прогулку в прошлое.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Событие "move" у формы и несколько нагоревших вопросов

Сообщение iGrok » 12.10.2011 (Ср) 17:07

Rody66 писал(а):без каких либо дополнительных преобразований

Не так. "Без каких-либо явных преобразований".

Rody66 писал(а):Тот, который умещает самые большие числовые значения, и может спокойно производить манипуляции с ними.

Rody66 писал(а):Число размером всего в ~ 2 миллиарда? (4.2 при самом наилучшем раскладе). Дабл же вроде как в сотни раз больше.. Или я чего-то не знаю?

Rody66 писал(а):А по мне так, любые числовые значения логично сравнивать. Но судя по всему, дабл все-таки будет побольше.

При помощи Double можно представить число вплоть до 1,79 * 10^308. Вот только точность будет небольшой, хотя манипуляции с такими числами это производить не мешает.

Rody66 писал(а):А это Вы, собственно, как выяснили?

Прочитал на этом форуме.

Rody66 писал(а):Ну, то, что 32 бита = x18 никто и не говорил.

Хакер опечатался, должно было быть x86.

Rody66 писал(а):А по делу, я так и не понял, что же все-таки считается правильным? 32 бита, 64 бита - верно; х86, х64 - неверно. если смотреть с чисто технически-педантичной стороны, так?

Что значит "правильным"? В отрыве от контекста нельзя определить, верно оно или неверно.

Rody66 писал(а):нулевого бита

Байта. Какой пример ты хочешь-то? Некоторые api-функции возвращают строки, терминированные нулём. Тебе пример такой функции что ли привести?

Rody66 писал(а):Таким образом, "размер" переменной Integer равен FFFF, в то время как ее максимальное значение равно 7FFF, а чему же тогда равно минимальное значение в хексе?

"Размер" равен двум байтам. 0xFFFF - это максимальное целое значение, которое можно уместить в беззнаковую двухбайтную переменную. "Минимальное" знаковое - 0x8000.

Rody66 писал(а):Я уж думал и не вспомните.

Ну, просто надо было его хотя бы нулевым пунктом обозначить. А так когда дочитаешь до конца вопросов про то, что было что-то до пункта "1)" уже забываешь.
label:
cli
jmp label

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

Re: Событие "move" у формы и несколько нагоревших вопросов

Сообщение Хакер » 12.10.2011 (Ср) 18:37

Rody66 писал(а):И тем не менее, если в байтовый массив загнать текст, и вызвать мессагу с содержанием этого байта, то будет выведет именно текст, без каких либо дополнительных преобразований.

А третьим пунктом — расстрелять программиста. Во-первых, потому что неандерталец, а во-вторых.


ч
Rody66 писал(а):Тот, который умещает самые большие числовые значения, и может спокойно производить манипуляции с ними.

Тогда я предлагаю однобитный (даже не однобайтный тип) тип. Если бит сброшен, то это ноль, а если установлен то 1000010000000000000. Ура, этот тип умещает самое большое число, но можно придумать точно такой же однобитный тип, который умещает ещё большое число. Доволен? Нет? Не надо задавать глупых вопросов.

Rody66 писал(а):А это Вы, собственно, как выяснили?

Всплывающие подсказки для кого сделаны?

Rody66 писал(а):Уж очень хочется лицезреть пример такого использования нулевого бита :)

Бита? :pale:
Rody66 писал(а):Число размером всего в ~ 2 миллиарда? (4.2 при самом наилучшем раскладе). Дабл же вроде как в сотни раз больше.. Или я чего-то не знаю?

Не знаешь, что чем больше числа, тем больше они «округляются». Учи, что такое числа с плавающей точкой. И учи теорию информация, суть которой заключается в том, что нельзя вписать в 32-бита невписуемое.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение Qwertiy » 12.10.2011 (Ср) 20:12

Rody66 писал(а):Уж очень хочется лицезреть пример такого использования нулевого бита :)

Ну что байта (или двух для юникода) уже поправили...
А так, без проблем, даже без WinApi и C++ :)
Код: Выделить всё
Private Sub Form_Load()
  Dim Str As String
  Str = "QQQ" & ChrW$(0) & "WWW"
  MsgBox Str, , Len(Str)
End Sub

Rody66 писал(а):Число размером всего в ~ 2 миллиарда? (4.2 при самом наилучшем раскладе). Дабл же вроде как в сотни раз больше.. Или я чего-то не знаю?

Я думал, ты про целый тип. В дробных есть проблемы с точностью и оценивать их с точки зрения границ по сравнению с целыми неправильно.

Rody66 писал(а):Таким образом, "размер" переменной Integer равен FFFF, в то время как ее максимальное значение равно 7FFF, а чему же тогда равно минимальное значение в хексе?

&H8000. Вообще, с точки зрения математики, все вычисления делаются по модулю 2^n, где n - разрядность в битах. При этом есть два варианта вычислений: беззнаковый (диапазон 0 to 2^n-1) и знаковый (диапазон -2^(n-1) to 2^(n-1)-1). В таких языках, как ассемблер, С, С++, C#, VB.NET (в отличие от Джавы) представлены оба варианта для всех размерностей.

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

Re: Событие "move" у формы и несколько нагоревших вопросов

Сообщение Хакер » 13.10.2011 (Чт) 4:59

Qwertiy писал(а):А так, без проблем, даже без WinApi и C++ :)

Это не без WinAPI. Это косяк MessageBoxA, что он не всю строку отобразил, а остановился на первом ZC.


Qwertiy писал(а):При этом есть два варианта вычислений: беззнаковый (диапазон 0 to 2^n-1) и знаковый (диапазон -2^(n-1) to 2^(n-1)-1)

Вообще то нет никаких двух вариантов вычислений, знаковых и беззнаковых. Это заблуждение. Вычисления происходят единым во всех случаях образом.
—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: Событие "move" у формы и несколько нагоревших вопросов

Сообщение ger_kar » 13.10.2011 (Чт) 8:10

Хакер писал(а):Вообще то нет никаких двух вариантов вычислений, знаковых и беззнаковых. Это заблуждение. Вычисления происходят единым во всех случаях образом.
Если рассматривать это на низком уровне, так как считает процессор то разницы нет. Разница проявляется на языках высокого уровня, но разница не в вычислениях конечно, а в диапазонах. Если например для без знакового целого типа операция 32 767 + 1 вполне корректная, то для знакового это вызовет переполнение. Другой пример, скажем счетчик, значение которого увеличивается в подпрограмме в машинных кодах, а на VB идет его считывание и отображение. В этом случае процессор без проблем сложит 32 767 + 1, но на VB последовательность будет 32 767, а за нем -32 768, что будет выглядеть несуразно. Поэтому, судя по контексту Qwertiy это и имел ввиду.
Бороться и искать, найти и перепрятать

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

Re: Событие "move" у формы и несколько нагоревших вопросов

Сообщение Хакер » 13.10.2011 (Чт) 8:19

ger_kar писал(а):Разница проявляется на языках высокого уровня, но разница не в вычислениях конечно, а в диапазонах.

Разницы при вычислениях не проявляется никакой.

Разница проявляется только в двух случаях: при сравнении чисел и при конвертации числа в текстовое человеко-понятное представление числа в одной из существующих для людей системе счисления.

Вот при сравнении чисел нужно знать, знаковые они или нет.
00 > FF если знаковые и 00 < FF если беззнаковые.

И при конвертации нужно знать: преобразовывать ли FF в "255" (или же "FF" или же "377" или т.п.) или же преобразовывать FF в "–1" (или же в "-1" или же "-1" и т.п.).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение Qwertiy » 13.10.2011 (Чт) 9:27

Хакер писал(а):Вообще то нет никаких двух вариантов вычислений, знаковых и беззнаковых.

Я знаю. Я же написал, по модулю 2^n. Под доступностью обоих вариантов я имел в виду возможность (неявного, без ассемблерных вставок) использования соттветсятвующих команд условного перехода при сравнении чисел (например, ga & ge).

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

Сообщение Qwertiy » 13.10.2011 (Чт) 11:31

Хакер писал(а):Это не без WinAPI. Это косяк MessageBoxA, что он не всю строку отобразил, а остановился на первом ZC.

Во-первых, почему A, а не W?
Во-вторых, я имел в виду без объявления WinApi-функций. Ясно же, что VB вызывает WinApi'шный MessageBox.
В-третьих, это не косяк MessageBox'а, т. к. он получает на вход null-terminated string. Если уж считать это косяком, то функции MsgBox в VB, которая не заменяет '\0' на пробел перед вызовом MessageBox. Кстати, в .NET работает так же.

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Событие "move" у формы и несколько нагоревших вопросов

Сообщение Rody66 » 13.10.2011 (Чт) 11:56

С переменными интересная вещь. Сейчас немножко потестил на бейсике перевод из одной системы счисления в другую, и вывод результатов в текст, так вот, -32768 и правда равно 8000, в то время как 32767 равно 7FFF, то есть произошло как раз то, о чем вы и говорили. Так вот, если перевести -32768 в хекс, а потом обратно из него, то результат будет 32768, либо же, если перевод выполнить в переменную типа integer, то будет переполнение. С переменными все стало куда яснее, всем спасибо за объяснения.
При помощи Double можно представить число вплоть до 1,79 * 10^308. Вот только точность будет небольшой, хотя манипуляции с такими числами это производить не мешает.

Можно? Много чего можно.. А вот как на практике выполнить?
Ну что байта (или двух для юникода) уже поправили...

Это верно, байта конечно же. Но то, что после Chr(0) данные перестают считываться мне итак известно, и точно с таким же успехом я мог написать и такой пример: s = "rr" & Chr(0) & "zz": Text1 = s . Я хотел увидеть пример реального использования нулего байта, когда без него просто не обойтись. Надеюсь в этот раз ясно выразился..
Это косяк MessageBoxA, что он не всю строку отобразил, а остановился на первом ZC.

А можно подробнее, почему нулевой байт = ZC ?
И спасибо за статью, весьма познавательно. Хоть стало ясно почему бинарники содержат так много нулевых байтов.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Событие "move" у формы и несколько нагоревших вопросов

Сообщение iGrok » 13.10.2011 (Чт) 12:12

Rody66 писал(а):Так вот, если перевести -32768 в хекс, а потом обратно из него, то результат будет 32768

Такой результат невозможно получить ни при одном варианте преобразований. Как ты это получил? Покажи код.

Rody66 писал(а):Можно? Много чего можно.. А вот как на практике выполнить?

В смысле? Так и выполнить. a# = 1.79E+308: print a

Rody66 писал(а):Я хотел увидеть пример реального использования нулего байта, когда без него просто не обойтись.

Всё равно не понятно. Пример чего? Открой любой бинарный файл в хекс-редакторе, и увидишь кучу нулевых байтов.
Реальное использование нулевого байта - двоичное представление числа 0, числа 256 (0x0100), 512 (0x0200), и так далее.

Rody66 писал(а):А можно подробнее, почему нулевой байт = ZC

Zero Character.

Rody66 писал(а):Хоть стало ясно почему бинарники содержат так много нулевых байтов.

Между статьёй про юникод и нулевыми байтами в бинарниках связь весьма слабая. То есть они там могут быть и в юникодных строках, и как представления чисел, и как части команд машинного кода. А ещё это может быть обозначение чёрного цвета на картинках. Да всё, что угодно это может быть...
label:
cli
jmp label

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

Re: Событие "move" у формы и несколько нагоревших вопросов

Сообщение Хакер » 13.10.2011 (Чт) 12:13

Qwertiy писал(а):Во-первых, почему A, а не W?

Потому что рантайм использует Ansi-функции, а не Wide-версии.

Qwertiy писал(а):В-третьих, это не косяк MessageBox'а, т. к. он получает на вход null-terminated string.

Потому что они, как и всё остальное WinAPI-ное хочет получить ZT-строку, вместо цивилизованного способа — строка с хранимой подсчитанной длиной. Что хакартерно, написанные через-одно-место WinAPI в конечном счёте вызвают NT Api, и вот уже NT-апи принимают
1) Всегда юникодные строки
2) Всегда строки, длина которых явно хранится в структуре UNICODE_STRING.

То есть WinAPI-функции — это в своём большинстве посредники, которые сами ничего не делают, но пропускаемые через себя данные «портят».

Rody66 писал(а):Сейчас немножко потестил на бейсике перевод из одной системы счисления в другую, и вывод результатов в текст, так вот

Уверяю тебя: не было перевода из одной системы счисления в другую.

Rody66 писал(а):Я хотел увидеть пример реального использования нулего байта, когда без него просто не обойтись. Надеюсь в этот раз ясно выразился..

Ну передай MessageBoxA какой-нибудь текст без нулевого символа в конце. В лучшем случае она покажет ещё огромный кусок бреда после сообщения, а в худшем — всё просто рухнет, потому что она дойдёт до памяти, чтение которой запрещено.

Rody66 писал(а):А можно подробнее, почему нулевой байт = ZC ?

Потому что английский язык. Zero-Character.

Rody66 писал(а):Хоть стало ясно почему бинарники содержат так много нулевых байтов.

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

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Событие "move" у формы и несколько нагоревших вопросов

Сообщение Rody66 » 13.10.2011 (Чт) 12:46

Такой результат невозможно получить ни при одном варианте преобразований. Как ты это получил? Покажи код.

Прошу:
Код: Выделить всё
Dim x As Integer, s As Integer
x = -32768
s = Hex(x)
Text1 = s '8000
Text2 = CLng("&H" & s) '32768

Уверяю тебя: не было перевода из одной системы счисления в другую.

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

Хорошо. Таким образом, какое максимальное значение может принимать Double переменная?
Пример чего? Открой любой бинарный файл в хекс-редакторе, и увидишь кучу нулевых байтов.

То, что в бинарнике преобладают нулевые байты мне итак прекрасно известно, а вот Хакер дал точно понять для чего он (нулевой байт) может быть нужен, например, в вызове мессаги. Хотя тут тоже есть кое-какие непонятки.
Ну передай MessageBoxA какой-нибудь текст без нулевого символа в конце. В лучшем случае она покажет ещё огромный кусок бреда после сообщения, а в худшем — всё просто рухнет, потому что она дойдёт до памяти, чтение которой запрещено.

Если речь о Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long, то я данную функцию отлично использую и без вставки zc в конец текста. Может я опять чего то не понял?
Не стало. Вернее, наверняка стало, но эта причинно-следственна связь, построенная тобою в твоей же голове — полностью ошибочна.

Вероятнее всего.. Можно тогда вопрос: в какую кодировку компилируются екзешники? Заранее извиняюсь за свою безграмотность, но из той статьи я так и не понял, в какой из большого множества UTF кодируются exe.
Последний раз редактировалось Rody66 13.10.2011 (Чт) 13:26, всего редактировалось 1 раз.

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

Re: Событие "move" у формы и несколько нагоревших вопросов

Сообщение Хакер » 13.10.2011 (Чт) 13:18

Заранее извиняюсь за свою безграмотность, но из той статьи я так и не понял, в какой из большого множества UTF кодируются exe.

На башорг. Более бредового уже ничего не было года 4.

Вернусь, отвечу.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение Qwertiy » 13.10.2011 (Чт) 15:17

Rody66 писал(а):Если речь о
Код: Выделить всё
Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long

то я данную функцию отлично использую и без вставки zc в конец текста. Может я опять чего то не понял?

Именно не понял. VB самостоятельно конвертирует из String в Byte(), добавляя при этом '\0' в конец.
Замени ByVal lpText As String на массив байтов и передай соответствующий массив, но убедившись предварительно, что он не содержит нулей. Правда, всё равно может повезти, если 0 попадётся в следующем за массивом байте.

Rody66 писал(а):Можно тогда вопрос: в какую кодировку компилируются екзешники?

В исполняемый код. Если ты имел в виду строки в них, то в ту, какую захочет программист. Если говорить о String в VB, wchar_t в Си++, String в .NET, то в Юникод (в узком смысле, тот который 2 байта на символ), если о char в Си++, то в ASCII (иногда пишут ASCIIZ, показывая таким образом роль завершающего нуля).

Rody66 писал(а):Прошу:
Код: Выделить всё
Dim x As Integer, s As Integerx = -32768s = Hex(x)Text1 = s '8000Text2 = CLng("&H" & s) '32768

Ты в курсе, что тут есть конвертирование в строку?

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

Re: Событие "move" у формы и несколько нагоревших вопросов

Сообщение Хакер » 13.10.2011 (Чт) 17:53

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

Не бело перевода из одной в другую.

Было одно число, стало несколько чисел, обозначающих коды символов, обозначающих арабские цифры и буквы латинского алфавита, последовательность которых задаёт первоначальное число.
Это называется «не из одной системы счисления в другую», а «сделать человеко-понятный текст из числа».

Rody66 писал(а):Вероятнее всего.. Можно тогда вопрос: в какую кодировку компилируются екзешники? Заранее извиняюсь за свою безграмотность, но из той статьи я так и не понял, в какой из большого множества UTF кодируются exe.

Абсурдность ситуации заключается вот в чём: статья была посвящена проблемам хранения и представления текста в памяти компьютера. И различные UTF (UTF-7, UTF-8) являются способами кодирования текста, о чём говорит буква T посередине этих аббревиатур.

EXE-файл это даже близко не файл с текстом. С чего ради UTF должны иметь к EXE-файлу какие-то отношения? К EXE-файлу не применим термин «кодировка», а применим термин «формат». Формат EXE-файла — PE-формат.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Событие "move" у формы и несколько нагоревших вопросов

Сообщение iGrok » 13.10.2011 (Чт) 20:02

Rody66 писал(а):То, что в бинарнике преобладают нулевые байты мне итак прекрасно известно

С какого это рожна?
Взял сейчас несколько разных бинарников.
В одном "преобладает" (с долей всего в 3.08%) символ с кодом 0xFF
В другом 6.73% за 0x72
В третьем с долей в 0.51% "преобладает" действительно 0x00, но следом за ним с долей 0.46% идёт снова 0xFF.

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

Не было. И даже если не учитывать комментарии про строки и т.п., байты 0x8000 могут означать как 32768 (если интерпритировать их как беззнаковое двухбайтное целое, или как младшее слово в четырёхбайтном беззнаковом целом), так и -32768, если считать его двухбайтным целым со знаком. В твоих преобразованиях как раз этот-то момент и не учитывается. Изначально у тебя двухбайтное целое со знаком, а потом ты получаешь четырёхбайтное целое со знаком. Т.е. CLng("&H" & 8000) на самом деле выдаёт тебе не 0x8000, а 0x00008000. Вот CInt("&H" & 8000) - совсем другое дело.

Rody66 писал(а):Хорошо. Таким образом, какое максимальное значение может принимать Double переменная?

1.79769313486231E+308. То есть 1797693134862310000 и ещё 290 нулей. Это достаточно много, по-моему.
label:
cli
jmp label

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Событие "move" у формы и несколько нагоревших вопросов

Сообщение Rody66 » 22.11.2011 (Вт) 12:14

1.79769313486231E+308. То есть 1797693134862310000 и ещё 290 нулей. Это достаточно много, по-моему.

1 байт - 256, 2 байта - 256^2 ~ 65 000, 4 байта 256^4 ~ 4 000 000 000, 8 байт - 256^8 = (9223772036854775807 * 2) ~ 18440000000000000000 (всего 19 знаков после запятой, далеко не 308, как у Вас.)
Калькулятор считает максимум 8 байт и переменные там со знаком, поэтому следующее после 9223772036854775807 число - это -1. И поэтому максимальное значение переменной совсем приблизительное. Откуда же тогда Вы взяли такое большое число?
EXE-файл это даже близко не файл с текстом. С чего ради UTF должны иметь к EXE-файлу какие-то отношения? К EXE-файлу не применим термин «кодировка», а применим термин «формат». Формат EXE-файла — PE-формат.

Спасибо. А также спасибо Qwertiy за более подробную информацию.

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

Сообщение Qwertiy » 22.11.2011 (Вт) 13:00

Rody66 писал(а):1 байт - 256, 2 байта - 256^2 ~ 65 000, 4 байта 256^4 ~ 4 000 000 000, 8 байт - 256^8 = (9223772036854775807 * 2) ~ 18440000000000000000 (всего 19 знаков после запятой, далеко не 308, как у Вас.)Калькулятор считает максимум 8 байт и переменные там со знаком, поэтому следующее после 9223772036854775807 число - это -1. И поэтому максимальное значение переменной совсем приблизительное. Откуда же тогда Вы взяли такое большое число?

Здесь речь идёт о целочисленных значениях. А 10^308 - это для double. Подробнее тут и тут. А ещё можно погуглить что-нибудь типа "double представление в памяти".

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Событие "move" у формы и несколько нагоревших вопросов

Сообщение iGrok » 22.11.2011 (Вт) 14:43

Rody66 писал(а):Откуда же тогда Вы взяли такое большое число?

Где почитать про формат double тебе уже ответил Qwertiy.

Я лишь ещё раз упомяну, что тут увеличение диапазона идёт за счёт уменьшения точности.
Т.е. 1.79769313486231E+308 - можно. А 1.7976931348623155544444444E+308 - уже "нельзя". С точки зрения double эти два числа равны.
label:
cli
jmp label


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

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

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

    TopList  
cron