PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка (продолжение…)


Вопросы новичка (продолжение…)

Сообщений 1 страница 30 из 974

1

Давайте продолжим тему здесь…

0

2

Наверно многие знают этот код, но может новички и не видели. Лаконично и очень наглядно показывает, как образуются цвета, как влияет та или иная составляющая на образование общего цвета:

Код:
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

0

3

ВиниПур написал(а):

Наверно многие знают этот код, но может новички и не видели. Лаконично и очень наглядно показывает, как образуются цвета, как влияет та или иная составляющая на образование общего цвета:

Спасибо сам код не попадался… действительно наглядно, хотя идея и простая… :о)

0

4

Ребят подскажите, почему здесь ( 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)

0

5

Lucagin написал(а):

бинарное значение числа 25 равно 0010 0101 , а не 0001 1001 и 32 тут показано как 0011 0010 , а не 0010 0000. Здесь ошибка или я что-то не учитываю, может символ $ тоже как-то влияет…?

Там $25 это шестнадцатеричное ( что в Паскале, что в Пурике обозначается одинаково), а значит все правильно, Hex=25, Dec = 37, Bin = 0010 0101

0

6

ВиниПур написал(а):

Там $25 это шестнадцатеричное ( что в Паскале, что в Пурике обозначается одинаково), а значит все правильно, Hex=25, Dec = 37, Bin = 0010 0101

Блин, опять на теже грабли наступил, ну конечно 16-тиричное…  :blush:
Спасибо!!!

0

7

Lucagin написал(а):

Т.е. на самом деле они просто смещаются влево, но не теряются навсегда, иначе было бы 0…

Лучше запомни то, что в справке написано - сдвиг на 1 знак влево это как умножение на 2, соответственно на 2 знака умножение на 4 и т.д. Ни чего ни куда не теряется, значения переменной меняется именно так. Соответственно сдвиги вправо это деление.
Про "пропадание" знаков возможно речь идет о конкретной ячейке памяти? Хотя надо у Петра спросить, что он имел в виду :question:

0

8

ВиниПур написал(а):

Лучше запомни то, что в справке написано - сдвиг на 1 знак влево это как умножение на 2, соответственно на 2 знака умножение на 4 и т.д. Ни чего ни куда не теряется, значения переменной меняется именно так. Соответственно сдвиги вправо это деление.

Про умножение на 2 или деление как-то и не подумал, обязательно запомню…  :idea:
Но в данном случае умножение не даст ясности этой операции Wert = (blau << 16) | (gruen << 8) | (rot) (твой пример выше, пост №2) . А если пример  a=255 b=a<<8  представить как : a =  1111 1111; b= 1111 1111 0000 0000; Тогда операция становится понятной… :о))) В начале из-за той фразы в учебники всю голову сломал над этим местом в программе…  :D

А безвозвратные потери (Вероятно,  имелось в виду) происходят при смещении вправо(>>)… a=1 b=a>>1, получаем  b=0...

Отредактировано Lucagin (23.12.2010 19:02:08)

0

9

Lucagin написал(а):

Но в данном случае умножение не даст ясности этой операции 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)

0

10

ВиниПур написал(а):

ично я видел и такую реализацию кода  - умножения и сложения:
Код:Wert = blau*65536 + gruen*256 + rot

Да твои варианты не менее наглядные(Wert = blau*(2 в степени 16) + gruen*(2 в степени 8) + rot), просто когда я в  примере увидел бинарые операции, да еще в такой связке у меня глаза на лоб полезли o.O , потом только дошло, что RGB(rot,gruen,blau) дало бы тот же результат…  :D  Зато разобрался наконец… :о)))

Отредактировано Lucagin (23.12.2010 20:13:08)

0

11

ВиниПур написал(а):

Хотя надо у Петра спросить, что он имел в виду

Это перевод книги "PureBasic - A Beginners Guide".
Переводил не я.

0

12

Просто в учебники PB (раздел операторы:  http://pure-basic.narod.ru/docs/books/3.htm ) написана такая фраза про эту операцию «При переключении битов влево создаются нули справа от имеющихся битов, а крайние слева биты будут сдвинуты и будут потеряны навсегда.» Т.е. на самом деле они просто смещаются влево, но не теряются навсегда, иначе было бы 0…

Все написано правильно, если трудно попробуйте почитать Калашникова "Ассемблер это просто".

ну и сам попробую еще раз:

00011110
после работы оператора <<4
получается:
11100000

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

Отредактировано haav (23.12.2010 21:16:26)

0

13

haav написал(а):

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)

0

14

Lucagin написал(а):

Есть какая-то  возможность определить сколько бит занимает число b???

По умолчани, 32 при компиляции 32 разрядном компиляторе и 64, при компиляции в 64 разрядном компиляторе.
Это тип Integer.

Lucagin написал(а):

представить в виде 8 бит??

Тогда надо так

Код:
a=30

b.a=a<<4

Debug b

0

15

Пётр написал(а):

По умолчани, 32 при компиляции 32 разрядном компиляторе и 64, при компиляции в 64 разрядном компиляторе.Это тип Integer.

Блин, я не учел, что переменные описывались 32-мя битами. Тогда прошу прощения,всё абсолютно верно!!! :blush:  :shine:

0

16

haav написал(а):

ну и сам попробую еще раз:

00011110
после работы оператора <<4
получается:
11100000

Это логика для 1-байтовых чисел. В работе с цветом нужно как минимум 3 байта - мах число = 16777215. Но т.к. 3-х байтовых чисел в Пурике нет, то используются 4-х байтные типа long. И по этому :

00011110
после работы оператора <<4
получается:
480 а это уже 111100000, а не 11100000, что всего лишь 224.
И даже если ты принудительно объявишь переменную типа а( 1 байт)

b.a=%00011110 << 4
Debug b

то у тебя ни как не получится выполнить этот код - будет ошибка ( число должно быть от 0 до 255).
Так что ни чего не пропадает в Пурике. В Ассемблере Калашникова может быт :D

0

17

ВиниПур написал(а):

Это логика для 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)

0

18

ВиниПур написал(а):

b.a=%00011110 << 4

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

0

19

ВиниПур написал(а):

то у тебя ни как не получится выполнить этот код - будет ошибка ( число должно быть от 0 до 255).Так что ни чего не пропадает в Пурике. В Ассемблере Калашникова может быт

Не я балдею конечно. Я объяснил на уровне  одной ячейки регистра(как бы единого целого процессора), чтобы было понятно. Есть авторы, которые объясняют на уровне 4 бит....

0

20

haav написал(а):

Не я балдею конечно. Я объяснил на уровне  одной ячейки регистра(как бы единого целого процессора), чтобы было понятно.

Извини, я сам дурак, зря сбаламутил… В учебнике всё описано абсолютно верно, я просто не учел что переменная описана 32 битами…  :dontknow:

0

21

Lucagin написал(а):

Извини, я сам дурак, зря сбаламутил…

Да ерунда, но про сдвиги, если плохо понятно, лучше читать у мастеров своего дела. Я уже упомянул Калашникова, еще есть один умница: Крупник "самоучитель ассемблер" В этой книжке тоже про сдвиги хорошо расказано, да и не только. Многое в пурике потом понятнее становится.

Кстати вышла новая версия Ольки, если интересно http://www.ollydbg.de/

0

22

haav написал(а):

Я уже упомянул Калашникова, еще есть один умница: Крупник "самоучитель ассемблер" В этой книжке тоже про сдвиги хорошо расказано, да и не только. Многое в пурике потом понятнее становится.

Обязательно постараюсь найти эти книги... :writing:

haav написал(а):

Кстати вышла новая версия Ольки, если интересно http://www.ollydbg.de/

А олька эта зачем??? :blush:  :question:

0

23

Если будешь читать самоучитель ассемблер , будет понятнее для чего, но вообще это отладчик программ под windows.

0

24

haav написал(а):

Если будешь читать самоучитель ассемблер , будет понятнее для чего, но вообще это отладчик программ под windows.

Хорошо, спасибо, попробую разобраться...

Кому интересно, вот ссылки на указанные учебники…
http://www.log-in.ru/books/21131/     Крупник самоучитель ассемблер
http://www.kalashnikoff.ru/      Калашников…

Отредактировано Lucagin (23.12.2010 22:35:38)

0

25

Пётр написал(а):

к. компилятор обнаружил что это константы

Вообще то в Пурике константы обозначаются так #.
b.a - это переменная.

haav написал(а):

Я объяснил на уровне  одной ячейки регистра(как бы единого целого процессора), чтобы было понятно.

Я конечно понимаю, что в масштабе 32 битных операций сдвиг несомненно происходит. И теряются первые биты. Но в случае с цветами это не актуально - число цветов ограничено и существенно меньше, чем может уместиться в одной ячейке. Только и всего.

0

26

ВиниПур написал(а):

Вообще то в Пурике константы обозначаются так #.

Под константами подразумевались не изменяемые данные, а конкретно, эти:

ВиниПур написал(а):

%00011110 << 4

0

27

Здравствуйте, у меня есть несколько вопросов:
1 вопрос - Я вывожу с помощью PrintN в консоле определённую строку "play game", всё выводится правильно, а если хочу вывести "Играть в игру", то вместо этого разные символы, можно ли всё же в консоле вывести русские буквы?
2 вопрос - в vb6 есть функция split, она позволяет разделить текст по определённому знаку, а в PureBasic за это отвечает какая функция?
3 вопрос - я не совсем понял про окна, то есть, как в IDE создать я понял, с помощью команды OpenWindow(), но я хочу в  визуальном конструкторе весь интерфейс составить и уже в IDE вызвать это окно, как мне это сделать? А так же, как потом привязать определённые действия после нажатия определённой кнопки?
4 вопрос - в vb6 есть функция Instr, у меня есть текстовая переменная хранящая примерно такую строку "Самолёт: А, В, С, Z" и мне нужно найти в ней либо "А", либо "F", если нашлось, тогда следующие действие, при этом должно вывестись какой именно был элемент найден, "А", или "F", с помощью какой функции  мне это сделать?

0

28

goodwen написал(а):

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

goodwen написал(а):

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)

0

29

goodwen написал(а):

1 вопрос - Я вывожу с помощью PrintN в консоле определённую строку "play game", всё выводится правильно, а если хочу вывести "Играть в игру", то вместо этого разные символы, можно ли всё же в консоле вывести русские буквы?

Посмотрите этот видеоурок Урок 14. Создание программы с поддержкой Unicode кодировки

goodwen написал(а):

3 вопрос - я не совсем понял про окна, то есть, как в IDE создать я понял, с помощью команды OpenWindow(), но я хочу в  визуальном конструкторе весь интерфейс составить и уже в IDE вызвать это окно, как мне это сделать? А так же, как потом привязать определённые действия после нажатия определённой кнопки?

Прочитать как это нужно делать, можно здесь
Урок 14. Создание программы с поддержкой Unicode кодировки
ftp://ftp.radio.ru/pub/2008/05/PureBasic.zip

0

30

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 разных эллементов, я пробовал сделать и ни как не получается. Как мне это сделать?

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка (продолжение…)