Давайте продолжим тему здесь…
Вопросы новичка (продолжение…)
Сообщений 1 страница 30 из 990
Поделиться223.12.2010 14:40:19
Наверно многие знают этот код, но может новички и не видели. Лаконично и очень наглядно показывает, как образуются цвета, как влияет та или иная составляющая на образование общего цвета:
Procedure UpdateColorz() Shared rot, gruen, blau Wert = (blau << 16) | (gruen << 8) | (rot) ImageID(1): StartDrawing(ImageOutput(1)) Box(0, 0, 260, 20, RGB(rot, gruen, blau)) StopDrawing() SetGadgetState(50,ImageID(1)) SetGadgetText(30, "#"+RSet(Hex(rot),2,"0")+RSet(Hex(gruen),2,"0")+RSet(Hex(blau),2,"0")) ImageID(2): StartDrawing(ImageOutput(2)) Box(0, 0, 260, 20, Wert) StopDrawing() SetGadgetState(51,ImageID(2)) SetGadgetText(40, StrU(Wert,2)) EndProcedure If OpenWindow(0, 0, 0, 340, 140, "Определитель цвета для HTML", #PB_Window_MinimizeGadget| #PB_Window_ScreenCentered) ;If CreateGadgetList(WindowID(0)) TextGadget(0, 5, 5, 25, 20, "Крас") TrackBarGadget(1, 35, 5, 265, 20, 0, 255) StringGadget(2, 305, 5, 30, 20, "0", #PB_String_ReadOnly) TextGadget(10, 5, 30, 25, 20, "Зел") TrackBarGadget(11, 35, 30, 265, 20, 0, 255) StringGadget(12, 305, 30, 30, 20, "0", #PB_String_ReadOnly) TextGadget(20, 5, 55, 25, 20, "Син") TrackBarGadget(21, 35, 55, 265, 20, 0, 255) StringGadget(22, 305, 55, 30, 20, "0", #PB_String_ReadOnly) StringGadget(30, 5, 90 , 60, 20, "#000000", #PB_String_ReadOnly) StringGadget(40, 5, 115, 60, 20, "0" , #PB_String_ReadOnly) CreateImage(1, 260, 20) CreateImage(2, 260, 20) ImageGadget(50,75, 90,260,20,ImageID(1)) ImageGadget(51,75,115,260,20,ImageID(2)) ;EndIf EndIf Repeat Select WaitWindowEvent() Case #PB_Event_Gadget GadgetID = EventGadget() Select GadgetID Case 1 rot = GetGadgetState(1) SetGadgetText(2, Str(rot)) Case 11 gruen = GetGadgetState(11) SetGadgetText(12, Str(gruen)) Case 21 blau = GetGadgetState(21) SetGadgetText(22, Str(blau)) EndSelect If GadgetID=1 Or GadgetID=11 Or GadgetID=21 UpdateColorz() EndIf Case #PB_Event_CloseWindow End EndSelect ForEver
Поделиться323.12.2010 15:34:24
Наверно многие знают этот код, но может новички и не видели. Лаконично и очень наглядно показывает, как образуются цвета, как влияет та или иная составляющая на образование общего цвета:
Спасибо сам код не попадался… действительно наглядно, хотя идея и простая… :о)
Поделиться423.12.2010 18:03:23
Ребят подскажите, почему здесь ( http://www.delphibasics.ru/Xor.php ) бинарное значение числа 25 равно 0010 0101 , а не 0001 1001 и 32 тут показано как 0011 0010 , а не 0010 0000. Здесь ошибка или я что-то не учитываю, может символ $ тоже как-то влияет…?
И еще, можно сказать, что операция a=255; a << 8 (Оператор сдвига бит влево) превращает число «a» из 8-ми битового (так как 255 можно описать 8-ми битами) в 16-ти битовое число 65280…
Просто в учебники PB (раздел операторы: http://pure-basic.narod.ru/docs/books/3.htm ) написана такая фраза про эту операцию «При переключении битов влево создаются нули справа от имеющихся битов, а крайние слева биты будут сдвинуты и будут потеряны навсегда.» Т.е. на самом деле они просто смещаются влево, но не теряются навсегда, иначе было бы 0…
Отредактировано Lucagin (23.12.2010 18:05:15)
Поделиться523.12.2010 18:17:23
бинарное значение числа 25 равно 0010 0101 , а не 0001 1001 и 32 тут показано как 0011 0010 , а не 0010 0000. Здесь ошибка или я что-то не учитываю, может символ $ тоже как-то влияет…?
Там $25 это шестнадцатеричное ( что в Паскале, что в Пурике обозначается одинаково), а значит все правильно, Hex=25, Dec = 37, Bin = 0010 0101
Поделиться623.12.2010 18:23:41
Там $25 это шестнадцатеричное ( что в Паскале, что в Пурике обозначается одинаково), а значит все правильно, Hex=25, Dec = 37, Bin = 0010 0101
Блин, опять на теже грабли наступил, ну конечно 16-тиричное…
Спасибо!!!
Поделиться723.12.2010 18:33:34
Т.е. на самом деле они просто смещаются влево, но не теряются навсегда, иначе было бы 0…
Лучше запомни то, что в справке написано - сдвиг на 1 знак влево это как умножение на 2, соответственно на 2 знака умножение на 4 и т.д. Ни чего ни куда не теряется, значения переменной меняется именно так. Соответственно сдвиги вправо это деление.
Про "пропадание" знаков возможно речь идет о конкретной ячейке памяти? Хотя надо у Петра спросить, что он имел в виду
Поделиться823.12.2010 18:44:29
Лучше запомни то, что в справке написано - сдвиг на 1 знак влево это как умножение на 2, соответственно на 2 знака умножение на 4 и т.д. Ни чего ни куда не теряется, значения переменной меняется именно так. Соответственно сдвиги вправо это деление.
Про умножение на 2 или деление как-то и не подумал, обязательно запомню…
Но в данном случае умножение не даст ясности этой операции Wert = (blau << 16) | (gruen << 8) | (rot) (твой пример выше, пост №2) . А если пример a=255 b=a<<8 представить как : a = 1111 1111; b= 1111 1111 0000 0000; Тогда операция становится понятной… :о))) В начале из-за той фразы в учебники всю голову сломал над этим местом в программе…
А безвозвратные потери (Вероятно, имелось в виду) происходят при смещении вправо(>>)… a=1 b=a>>1, получаем b=0...
Отредактировано Lucagin (23.12.2010 19:02:08)
Поделиться923.12.2010 19:23:36
Но в данном случае умножение не даст ясности этой операции Wert = (blau << 16) | (gruen << 8) | (rot) (твой пример выше, пост №2) . А если пример a=255 b=a<<8 представить как : a = 1111 1111; b= 1111 1111 0000 0000; Тогда операция становится понятной…
В смысле наглядности да, реальный сдвиг. Но суть от этого не меняется. Лично я видел и такую реализацию кода - умножения и сложения:
Wert = blau*65536 + gruen*256 + rot
Или даже так (что ещё проще):
Wert = RGB(rot,gruen,blau)
Работает аналогично и некоторым так понятнее.
Отредактировано ВиниПур (23.12.2010 19:32:33)
Поделиться1023.12.2010 19:55:56
ично я видел и такую реализацию кода - умножения и сложения:
Код:Wert = blau*65536 + gruen*256 + rot
Да твои варианты не менее наглядные(Wert = blau*(2 в степени 16) + gruen*(2 в степени 8) + rot), просто когда я в примере увидел бинарые операции, да еще в такой связке у меня глаза на лоб полезли , потом только дошло, что RGB(rot,gruen,blau) дало бы тот же результат… Зато разобрался наконец… :о)))
Отредактировано Lucagin (23.12.2010 20:13:08)
Поделиться1123.12.2010 20:45:51
Хотя надо у Петра спросить, что он имел в виду
Это перевод книги "PureBasic - A Beginners Guide".
Переводил не я.
Поделиться1223.12.2010 21:13:58
Просто в учебники PB (раздел операторы: http://pure-basic.narod.ru/docs/books/3.htm ) написана такая фраза про эту операцию «При переключении битов влево создаются нули справа от имеющихся битов, а крайние слева биты будут сдвинуты и будут потеряны навсегда.» Т.е. на самом деле они просто смещаются влево, но не теряются навсегда, иначе было бы 0…
Все написано правильно, если трудно попробуйте почитать Калашникова "Ассемблер это просто".
ну и сам попробую еще раз:
00011110
после работы оператора <<4
получается:
11100000
Как видите значение одного бита пропало(стало нулем), хоть число и выросло в несколько раз... Но есть в асме операторы, которые не теряют биты, а переносят, "но это совсем другая история"
Отредактировано haav (23.12.2010 21:16:26)
Поделиться1323.12.2010 21:30:45
00011110после работы оператора <<4получается:11100000
Было число 30 стало число 480, как число 480 представить в виде 8 бит??? это уже 1 1110 0000 (9 бит)
a=30 b=a<<4 Debug b
Есть какая-то возможность определить сколько бит занимает число b???
Отредактировано Lucagin (23.12.2010 21:33:58)
Поделиться1423.12.2010 21:37:47
Есть какая-то возможность определить сколько бит занимает число b???
По умолчани, 32 при компиляции 32 разрядном компиляторе и 64, при компиляции в 64 разрядном компиляторе.
Это тип Integer.
представить в виде 8 бит??
Тогда надо так
a=30 b.a=a<<4 Debug b
Поделиться1523.12.2010 21:43:00
По умолчани, 32 при компиляции 32 разрядном компиляторе и 64, при компиляции в 64 разрядном компиляторе.Это тип Integer.
Блин, я не учел, что переменные описывались 32-мя битами. Тогда прошу прощения,всё абсолютно верно!!!
Поделиться1623.12.2010 21:46:02
ну и сам попробую еще раз:
00011110
после работы оператора <<4
получается:
11100000
Это логика для 1-байтовых чисел. В работе с цветом нужно как минимум 3 байта - мах число = 16777215. Но т.к. 3-х байтовых чисел в Пурике нет, то используются 4-х байтные типа long. И по этому :
00011110
после работы оператора <<4
получается:
480 а это уже 111100000, а не 11100000, что всего лишь 224.
И даже если ты принудительно объявишь переменную типа а( 1 байт)
b.a=%00011110 << 4
Debug b
то у тебя ни как не получится выполнить этот код - будет ошибка ( число должно быть от 0 до 255).
Так что ни чего не пропадает в Пурике. В Ассемблере Калашникова может быт
Поделиться1723.12.2010 21:53:04
Это логика для 1-байтовых чисел. В работе с цветом нужно как минимум 3 байта - мах число = 16777215. Но т.к. 3-х байтовых чисел в Пурике нет, то используются 4-х байтные типа long. И по этому :
a.l=255
0000 0000 0000 0000 0000 0000 1111 1111
b=a<<8
b=65280
0000 0000 0000 0000 1111 1111 0000 0000
функция отработала совершенно верно, формально первые 8-мь нулей реально исчезли безвозвратно…. :о)
Отредактировано Lucagin (23.12.2010 21:53:44)
Поделиться1823.12.2010 21:57:23
b.a=%00011110 << 4
А это уже из области ленивых вычислений...
Скомпилированная программа не выполняет операцию сдвига, т к. компилятор обнаружил что это константы и поэтому они не меняются во время работы проги, и он сам произвёл сдвиг и попытался результат сдвига запихнуть в переменную, но результат туда не поместился...
Поделиться1923.12.2010 22:03:29
то у тебя ни как не получится выполнить этот код - будет ошибка ( число должно быть от 0 до 255).Так что ни чего не пропадает в Пурике. В Ассемблере Калашникова может быт
Не я балдею конечно. Я объяснил на уровне одной ячейки регистра(как бы единого целого процессора), чтобы было понятно. Есть авторы, которые объясняют на уровне 4 бит....
Поделиться2023.12.2010 22:11:52
Не я балдею конечно. Я объяснил на уровне одной ячейки регистра(как бы единого целого процессора), чтобы было понятно.
Извини, я сам дурак, зря сбаламутил… В учебнике всё описано абсолютно верно, я просто не учел что переменная описана 32 битами…
Поделиться2123.12.2010 22:19:29
Извини, я сам дурак, зря сбаламутил…
Да ерунда, но про сдвиги, если плохо понятно, лучше читать у мастеров своего дела. Я уже упомянул Калашникова, еще есть один умница: Крупник "самоучитель ассемблер" В этой книжке тоже про сдвиги хорошо расказано, да и не только. Многое в пурике потом понятнее становится.
Кстати вышла новая версия Ольки, если интересно http://www.ollydbg.de/
Поделиться2223.12.2010 22:24:04
Я уже упомянул Калашникова, еще есть один умница: Крупник "самоучитель ассемблер" В этой книжке тоже про сдвиги хорошо расказано, да и не только. Многое в пурике потом понятнее становится.
Обязательно постараюсь найти эти книги...
Кстати вышла новая версия Ольки, если интересно http://www.ollydbg.de/
А олька эта зачем???
Поделиться2323.12.2010 22:26:19
Если будешь читать самоучитель ассемблер , будет понятнее для чего, но вообще это отладчик программ под windows.
Поделиться2423.12.2010 22:29:13
Если будешь читать самоучитель ассемблер , будет понятнее для чего, но вообще это отладчик программ под windows.
Хорошо, спасибо, попробую разобраться...
Кому интересно, вот ссылки на указанные учебники…
http://www.log-in.ru/books/21131/ Крупник самоучитель ассемблер
http://www.kalashnikoff.ru/ Калашников…
Отредактировано Lucagin (23.12.2010 22:35:38)
Поделиться2523.12.2010 22:38:28
к. компилятор обнаружил что это константы
Вообще то в Пурике константы обозначаются так #.
b.a - это переменная.
Я объяснил на уровне одной ячейки регистра(как бы единого целого процессора), чтобы было понятно.
Я конечно понимаю, что в масштабе 32 битных операций сдвиг несомненно происходит. И теряются первые биты. Но в случае с цветами это не актуально - число цветов ограничено и существенно меньше, чем может уместиться в одной ячейке. Только и всего.
Поделиться2623.12.2010 22:41:12
Вообще то в Пурике константы обозначаются так #.
Под константами подразумевались не изменяемые данные, а конкретно, эти:
%00011110 << 4
Поделиться2724.12.2010 20:37:26
Здравствуйте, у меня есть несколько вопросов:
1 вопрос - Я вывожу с помощью PrintN в консоле определённую строку "play game", всё выводится правильно, а если хочу вывести "Играть в игру", то вместо этого разные символы, можно ли всё же в консоле вывести русские буквы?
2 вопрос - в vb6 есть функция split, она позволяет разделить текст по определённому знаку, а в PureBasic за это отвечает какая функция?
3 вопрос - я не совсем понял про окна, то есть, как в IDE создать я понял, с помощью команды OpenWindow(), но я хочу в визуальном конструкторе весь интерфейс составить и уже в IDE вызвать это окно, как мне это сделать? А так же, как потом привязать определённые действия после нажатия определённой кнопки?
4 вопрос - в vb6 есть функция Instr, у меня есть текстовая переменная хранящая примерно такую строку "Самолёт: А, В, С, Z" и мне нужно найти в ней либо "А", либо "F", если нашлось, тогда следующие действие, при этом должно вывестись какой именно был элемент найден, "А", или "F", с помощью какой функции мне это сделать?
Поделиться2824.12.2010 21:04:25
2 вопрос - в vb6 есть функция split, она позволяет разделить текст по определённому знаку, а в PureBasic за это отвечает какая функция?
Result$ = StringField(String$, Index, Delimiter$)
Описание
String$ - это строка.
Index - это индекс.
Delimiter$ - символ используемый в качестве разделителя.
Разделяет строку на части, используя символы-разделители.
Укажите в 'Delimiter$' символ по которому нужно разделить строку. Первое значение 'Index' равно 1.
Пример:
For k=1 To 6
Debug StringField("Hello I am a split string", k, " ")
Next
4 вопрос - в vb6 есть функция Instr, у меня есть текстовая переменная хранящая примерно такую строку "Самолёт: А, В, С, Z" и мне нужно найти в ней либо "А", либо "F", если нашлось, тогда следующие действие, при этом должно вывестись какой именно был элемент найден, "А", или "F", с помощью какой функции мне это сделать?
Position = FindString(String$, StringToFind$, StartPosition)
Описание
String$ - это строка.
StringToFind$ - это подстрока для поиска в строке.
StartPosition - стартовая позиция.
Ищет подстроку 'StringToFind$' в строке 'String$' начиная с указанной позиции 'StartPosition'. Если подстрока найдена, возвращается ее позиция (с учетом смещения, начиная с 1). Если строка не найдена, вернется 0.
Position = FindString("PureBasic", "Bas", 1) ; 'Position' will get the value '5'
Отредактировано Lucagin (24.12.2010 21:05:30)
Поделиться2924.12.2010 21:15:29
1 вопрос - Я вывожу с помощью PrintN в консоле определённую строку "play game", всё выводится правильно, а если хочу вывести "Играть в игру", то вместо этого разные символы, можно ли всё же в консоле вывести русские буквы?
Посмотрите этот видеоурок Урок 14. Создание программы с поддержкой Unicode кодировки
3 вопрос - я не совсем понял про окна, то есть, как в IDE создать я понял, с помощью команды OpenWindow(), но я хочу в визуальном конструкторе весь интерфейс составить и уже в IDE вызвать это окно, как мне это сделать? А так же, как потом привязать определённые действия после нажатия определённой кнопки?
Прочитать как это нужно делать, можно здесь
Урок 14. Создание программы с поддержкой Unicode кодировки
ftp://ftp.radio.ru/pub/2008/05/PureBasic.zip
Поделиться3024.12.2010 22:07:09
Lucagin, Пётр благодарю за помощь, у меня есть вопрос по StringField:
Вот я пишу такую штуку
For k=1 To 6 tekst.s=StringField("Hello, I am a split string", k, " ") Debug tekst Next k
Но у меня текст постоянно разной длины будет и поэтому неизвестно какое значение имеет К каждый раз, как мне обойти эту проблему?
Могу ли я в строке:
StringField("Hello I am a split string", k, " ")
Указать не только один элемент, по которому буду делить, а к примеру 10 разных эллементов, я пробовал сделать и ни как не получается. Как мне это сделать?
Похожие темы
Какая версия? | OffTop | 03.10.2021 |
Мне постоянно пищет вот это | Вопросы по PureBasic | 14.10.2011 |
Размер экрана в пикселях | Вопросы по PureBasic | 13.02.2011 |
консоль | Вопросы по PureBasic | 19.03.2015 |
Полноэкранные приложения на purebasic | Вопросы по PureBasic | 08.03.2011 |