Страница: 1 | 2 |
И бред этот с LSet не используй. Сам Микрософт в MSDN'е не рекомендует его для копирования пользовательских типов. Warning Using LSet to copy a variable of one user-defined type into a variable of a different user-defined type is not recommended. Сразу поясню что делает ф-я. Long - это двойное слово (DWORD), только со знаком. Т.к. это двойное слово, то его разрядность 32 бита (4 байта). Для доступа к каждому байту двойного слова можно использовать указатели (их нет в VB). Объявляется указатель на Байт (b as Byte PTR), а для доступа к конкретному байту номер его указывается в квадратных скобках. Например b[0] - первый байт. Т.к. указатель - это адрес, то для получения значения по нему в PB нужно перед указателем подставить собаку: @b[0] - значение первого байта. Не надо ругаться. Действительно, последнее, что мне пришлось программировать за последние несколько лет - это микроконтроллеры разных производителей, причем большая часть программ писалась в машинных кодах. С языками высокого уровня как-то всё не складывалось. Наверное поэтому мне гораздо понятней тонкий механизм побитной передачи, чем компактные, но туго закрученные конструкции. Термин "Восьмибитное слово" я употребил совершенно сознательно - поскольку с кишками IBM PC особо не разбираясь, я полагал, что здесь используются 32-разрядные слова - т.е. 16-разрядные байты. Отсюда как мне назвать 8 бит информации? Полубайтом? Я и предпочел термин "Восьмиразрядное слово" мог бы употребить "Два четырех битных байта" или "Четыре двухбитных байта" - вопрос для меня скорее терминологический - поскольку мне приходилось сталкиваться с программируемыми устройствами самой разной разрядности в том числе и самой экзотической, я как-то не склонен считать терминологию IBM единственно верной. Ну и напоследок. Тупая, но ясная конструкция которую я создал совершенно самостоятельно на 4-й день знакомства с языком высокого уровня: ... LOCAL ip11 AS STRING LOCAL ip12 AS STRING LOCAL ip13 AS STRING LOCAL ip14 AS STRING LOCAL ip_txt AS STRING LOCAL hostname AS STRING LOCAL ip11_num AS BYTE LOCAL ip12_num AS BYTE LOCAL ip13_num AS BYTE LOCAL ip14_num AS BYTE LOCAL ip AS LONG ip11="192" 'Для примера IP адрес 192.168.1.1 ip11_num=VAL(ip11) ip12="168" ip12_num=VAL(ip12) ip13="1" ip13_num=VAL(ip13) ip14="1" ip14_num=VAL(ip14) ip11=BIN$(ip11_num) ip11=RIGHT$("0000000"+ip11,8) ip12=BIN$(ip12_num) ip12=RIGHT$("0000000"+ip12,8) ip13=BIN$(ip13_num) ip13=RIGHT$("0000000"+ip13,8) ip14=BIN$(ip14_num) ip14=RIGHT$("0000000"+ip14,8) ip_txt = ip14+ip13+ip12+ip11 ip=VAL("&B"+ip_txt) HOST NAME ip TO hostname ... конечно далеко не оптимальна по стилю, но работает безотказно и довольно быстро. Вот такого простого и ясного механизма я и добивался, и никто не мог мне его показать. Все снобски показывали навороченные листинги, от которых мало проку в плане понимания самого механизма передачи IP адреса. Я не умник, поэтому и задаю здесь вопросы. На мой последний (пока) вопрос касательно использования системных команд пока нет ответа - жду пока меня опять обзовут маразматиком и т.п. Может кто-нибудь всё-таки что-нибудь знает. Заранее спасибо сочуствующим за терпение и дельные ответы касающиеся программирования на PB вообще. )) 2Кто-то: о 8-битном слове - желательно использовать терминологию используемой платформы. Если ты действительно программируешь на машинных кодах микроконтроллеры, неужели для тебя новость, что в 4-байтовом целом обртный порядок байтов, а в строке - прямой? Ведь в этом и заключался ответ на твой вопрос. Твой код выглядит ужасно, другие листинги тоже не очень, но разве мой код огромный (3 строки из которых одна - вывод мсгбокса?) Друзья мои! Можете ещё сколько угодно обзывать меня[sensored]ои, ламером, "странным" и "умником", я не обижаюсь, поскольку являюсь учеником в этом деле. Я учусь и терплю побои как и положено ученику )). Сделаю только одно ехидное замечание. Определение байта согласно стандарту ANSI/ISO C99 (http://mrst.narod.ru/c-cpp/iso_iec_9899-1999_c99_language_standard.pdf) - ... 3.4 [#1] byte addressable unit of data storage large enough to hold any member of the basic character set of the execution environment [#2] NOTE 1 It is possible to express the address of each individual byte of an object uniquely. [#3] NOTE 2 A byte is composed of a contiguous sequence of bits, the number of which is implementation-defined. The least significant bit is called the low-order bit; the most significant bit is called the high-order bit. Где-нибудь присутствует цифра 8? Байт может иметь ЛЮБУЮ длину. На этом и основана мультиплатформенность разрабатываемого ПО. Вообще слово BYTE первоначально использовалось для определения совокупности бит, необходимых для печати символа. Помните матричные принтеры? Длина байта для внутренней архитектуры x86 определена как 8 - с этим я совершенно согласен и ставлю эту икону в свой иконостас )) Хотя иная разрядность байта используется и в нынешнее время на IBM машинах, например для работы по протоколу x.25. Как вам такой скрипт из Dial-Up scripting language for Dial-Up Networking scripting supports: SET PORT DATATBITS 5|6|7|8 Изменяет КОЛИЧЕСТВО БИТ в БАЙТАХ, пересылаемых и получаемых во время сессии. Могу привести ещё массу примеров, когда байт не равен 8-ми битам. Так, что не надо ЛЯ-ЛЯ. Я не лезу со своим уставом в чужой монастырь, просто кроме IBM PC я много разных платформ видел, в том числе и 4-х и 5-ти битных в начале 80-х годов 20 века. А вы воспринимаете это как покушение на незыблемые ценности. Сорри. Всё же кто-нибудь подскажет мне как из PB вызвать системную команду net send {hostname} [message]? ЗЫ про порядок чтения бит в байте я в курсе. Особенность IP адресации как раз в том и состоит, что справа налево читаются не только биты, но и байты в двойном слове IP адреса. А что, вот так уже не получается ? Про байт я ничего не говорил. И вообще, если говорить о байтах, байты памяти IBM PC и многих других состоят из 9 бит, а не из 8, что можно прочитать в Абеле - 8 битов данных и 1 бит контроля четности. Кроме того, бит не обязательно должен иметь 2 состояния, в СССР была разработана ЭВМ на троичной системе, а в 40-х годах появлялись устройства на 10-чной системе счисления. Так что давайте не проводить конкурса умников и умниц (все равно ж я выиграю :D (а потом умру от скромности)). > SET PORT DATATBITS 5|6|7|8 Ты невнимателен. Он устанавливает количество БИТОВ ПЕРЕДАВАЕЫХ ДАННЫХ на один байт, который как и прежде равен 8 битам данных. Остальные 3/2/1/0 бита используются для контроля целостности этих самых передаваемых данных. За SHELL гигантское спасибо, эту команду я проглядел в хелпе ))
Вопрос: Простите за ламерский вопрос, но очень нужно уз...
Добавлено: 11.03.04 18:23
Автор вопроса: Кто-то
Ответы
Всего ответов: 23
Номер ответа: 16
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #16
Добавлено: 16.03.04 03:07
Номер ответа: 17
Автор ответа:
Кто-то
Вопросов: 3
Ответов: 12
Профиль | | #17
Добавлено: 16.03.04 06:53
Номер ответа: 18
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #18
Добавлено: 16.03.04 09:20
Странный вы какой то. Пришли в чужой монастырь со своим уставом и ещё и недовольны исходником от разработчика PB.
Не знаю чтоты там где употреблял, но в х86 (начиная с 16-разрядных процессоров 8086) слово состовляет 16 бит.
В 32-битных процессорах (начиная с 80386 и заканчивая P4) и AMD x86/64 тоже.
Короче у всех процессоров класса х86 длина слова состовляет 16 бит.
---
8-ми битное слово может быть только у 8-ми разрядных процессоров. Таких как, например, Z-80.
Но Байт всегда составляет 8 Бит и никогда не зависит от длины Слова. Этому ещё в школе учили.
---
> "Два четырех битных байта" или "Четыре двухбитных байта"
- Такого в природе не существует.
---
> большая часть программ писалась в машинных кодах.
Судя по твоим высказываниям в машинных кодах писалось 100% всех твоих программ.
Похоже хрень с указателями слишком сложна для тебя.
В машинных кодах тебе не могу розъяснить т.к. не помню наизусть кодов операций процессора.
Могу объяснить на человеческом языке.
Вычисление адреса переменной в памяти
b = VarPtr(ip). В языке Ассемблера эту операцию выполняет команда "LEA Регистр(или метка)".
Получение части переменной
FirsByte? = @b[0]. В языке Ассемблера это можно представить как "MOV Регистр, BYTE PTR Переменная"
---
> Тупая, но ясная конструкция которую я создал
- Действительно абсолютна тупая конструкция и лишний расход памяти - ты объявил аж 11 переменных.
Такой стиль программирования характерен для программирования на VB.
Переходи лучше на него если ты решил начать знакомство с ЯВУ с БЕЙСИКа. Кстати правильно сделал.
Power Basic - это профессиональный язык программирования.
Для полноценного программирования на на нём желательно знать АСМ или Си.
Хотя на уровне VB им тоже можно пользоваться. В этом случае ты будешь использовать его не на полную мощность.
---
> Все снобски показывали навороченные листинги, от которых мало проку в плане понимания самого механизма передачи IP адреса
- Если ты заметил то диапазон всех адресов от 0 до 255. Всего может быть 4 подадреса.
Простым умозаключением можно понять раз диапазон подадреса(ну не знаю я как это называется) 0-255, значит это Байт.
Раз "подадресов" 4 (255.255.255.255) значит полная длина адреса 4 Байта (или 32 бита).
Вот и извлекай эти байты для получения нужного подадреса.
В адресе 192.168.1.1: "192" - 1-й Байт, "168" - 2-й, "1","1" - 3-й и 4-й соответственно.
Номер ответа: 19
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #19
Добавлено: 16.03.04 13:34
Номер ответа: 20
Автор ответа:
Кто-то
Вопросов: 3
Ответов: 12
Профиль | | #20
Добавлено: 16.03.04 16:09
Номер ответа: 21
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #21
Добавлено: 16.03.04 17:05
Shell "net send" & sName & sText
На VB форуме сечас осуждалось то же самое...
Номер ответа: 22
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #22
Добавлено: 16.03.04 18:57
Номер ответа: 23
Автор ответа:
Кто-то
Вопросов: 3
Ответов: 12
Профиль | | #23
Добавлено: 17.03.04 05:56