purebasic.info

PureBasic forum
Текущее время: Пт май 25, 2018 4:12 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу Пред.  1, 2
Автор Сообщение
СообщениеДобавлено: Пт апр 01, 2016 4:45 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 18, 2009 3:41 am
Сообщений: 1126
Благодарил (а): 86 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
Мужики, ещё раз спасибо за заинтересованность темой! :)

Polkovnik, правильно понял задачу, и подсказал её решение, именно в той логике которая приспичилась мне в голове, когда я ударился об угол шкафа на кухне :lol:

6519And, верно говоришь, только случай тут немного другой, одна из переменных для обработки, получает значение только в цикле

Пример с call Pointer просто замечательный, тестить время работы для сравнения разных вариантов буду позже. Жаль, что без ASM вставок, средствами Пурика, нельзя решить такой вопрос.

Всем СПС!
Если же появятся, в будущем иные варианты решения такой задачи, выкладывайте...


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт апр 01, 2016 5:52 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт дек 17, 2009 4:49 pm
Сообщений: 1230
Откуда: г. Ангарск
Благодарил (а): 2 раз.
Поблагодарили: 15 раз.
Пункты репутации: 10
registrymechanic писал(а):
....имею этот упрощенный вариант кода.....

Если вариантов только два - "да" или "нет", то как вариант
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Dim Ar.s(10)
 
Ar(0) = ""
 
For i = 1 To 10
  Ar(i) = Str(i)
Next
 
x = 0
 
For i = 1 To 10
  Debug "строка" + Ar(i*x)
Next
 
x = 1
 
For i = 1 To 10
  Debug "строка" + Ar(i*x)
Next


_________________
.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт апр 01, 2016 6:18 pm 
Не в сети
док

Зарегистрирован: Ср апр 16, 2014 5:56 pm
Сообщений: 113
Благодарил (а): 7 раз.
Поблагодарили: 6 раз.
Пункты репутации: 5
Вот развитие идеи lakomet
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Structure MyStr
  A.s
  B.s
EndStructure
 
Dim Ar.MyStr(10)
 
Ar(0)\A = ""
Ar(1)\B = "бла-бла"
 
For i = 1 To 10
  Ar(i)\A = Str(i)
Next
 
x = 0
 
For i = 1 To 10
  Debug "строка " + Ar(i*x)\A
Next
 
x = 1
 
For i = 1 To 10
  Debug "строка " + Ar(i*x)\B
Next
 
Ar(0)\A = "многа букав"
Ar(1)\B = "бла-бла-бла-бла"
 
x = 0
 
For i = 1 To 10
  Debug "строка " + Ar(i*x)\A
Next
 
x = 1
 
For i = 1 To 10
  Debug "строка " + Ar(i*x)\B
Next


Можно ещё поиграться с Read/Data


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт апр 01, 2016 7:36 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11131
Благодарил (а): 4 раз.
Поблагодарили: 400 раз.
registrymechanic писал(а):
Жаль, что без ASM вставок, средствами Пурика, нельзя решить такой вопрос.
Почему нельзя?
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Procedure Action(y)    ;Процедура для действия 0
  ProcedureReturn y+1
EndProcedure
Procedure Action1(y)   ;Процедура для действия 1
  ProcedureReturn y-1
EndProcedure
Procedure Action2(y)   ;Процедура для действия 2
  ProcedureReturn y*2
EndProcedure
 
Prototype pAction(y)
Pointer.pAction
 
var=1                     ;Переменная выбора условия
 
Select var
  Case 0
    Pointer=@Action()   ;Получаем указатель на процедуру 0
  Case 1  
    Pointer=@Action1()  ;Получаем указатель на процедуру 1
  Case 2
    Pointer=@Action2()  ;Получаем указатель на процедуру 2
EndSelect
 
For y=1 To 10
  Debug Pointer(y)
Next


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт апр 01, 2016 8:51 pm 
Не в сети
ассистент

Зарегистрирован: Ср мар 30, 2016 9:45 pm
Сообщений: 15
Благодарил (а): 0 раз.
Поблагодарили: 3 раз.
Хм, а я и не подумал. Действительно через прототип намного красивей и не так прямо в лоб как CALL. Спасибо Пётр.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт апр 01, 2016 9:36 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 18, 2009 3:41 am
Сообщений: 1126
Благодарил (а): 86 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
Пётр писал(а):
Почему нельзя?

Вот благодАр!
Ну прямо идеальный вариант, более хотеть нечего. :lol:
СПС!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб фев 03, 2018 4:39 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1610
Откуда: Алматы
Благодарил (а): 13 раз.
Поблагодарили: 43 раз.
Пункты репутации: 5
Код:
1
2
3
4
5
mn = 2
For i = 250 To 500 Step 255 / mn
  Debug 123
Next
 



мне нужен плавающий шаг цикла - и что теперь, из-за неподдержки этих самых выражений в степе лепить велосипед на каждый случай значения степ? этож дичь несусветная :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб фев 03, 2018 5:25 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6276
Благодарил (а): 19 раз.
Поблагодарили: 184 раз.
Пункты репутации: 48
SereZa писал(а):
Код:
1
2
3
4
5
mn = 2
For i = 250 To 500 Step 255 / mn
  Debug 123
Next
 



мне нужен плавающий шаг цикла - и что теперь, из-за неподдержки этих самых выражений в степе лепить велосипед на каждый случай значения степ? этож дичь несусветная :)

Делай на While-Wend или Repeat-Until. Там можно задавать хоть все переменные с плавающей точкой, например:
Код:
1
2
3
4
5
6
7
8
mn.f = 2
myStep.f = 255 / mn
i.f = 250
 
While i <= 500
   Debug i
   i + myStep
 Wend



Но в сети встречаются и такие извращения (как в Си стиль):
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
; For/Next with floats and/or variable for Step.
; By PB -- Do whatever the heck you want with it.
; Yes, I know other float values affect precision!
 
Macro Forr(var,start,finish,inc)
  CompilerIf start<finish
    var=start-inc : While var<finish : var+inc
  CompilerElse
    var=start+inc : While var>finish : var-inc
  CompilerEndIf
EndMacro
 
Macro Nextt()
  Wend
EndMacro
 
stp.f=0.5 ; Float *and* variable for Step!
 
Forr(a.f,1,5,stp) ; For a = 1 To 5 Step 0.5
  Debug a ; 1.0, 1.5, 2.0, 2.5, 3.0, [...]
Nextt()
 
Forr(a.f,4.5,1,0.5) ; For a = 4.5 To 1 Step -0.5
  Debug a ; 4.5, 4.0, 3.5, 3.0, 2.5, [...]
Nextt()


_________________
read-only


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс фев 04, 2018 3:46 am 
Не в сети
док
Аватар пользователя

Зарегистрирован: Вт янв 26, 2016 4:44 pm
Сообщений: 145
Благодарил (а): 49 раз.
Поблагодарили: 19 раз.
Пункты репутации: 0
SereZa писал(а):
Код:
1
2
3
4
5
mn = 2
For i = 250 To 500 Step 255 / mn
  Debug 123
Next
 


мне нужен плавающий шаг цикла - и что теперь, из-за неподдержки этих самых выражений в степе лепить велосипед на каждый случай значения степ? этож дичь несусветная :)

Goto! Назло Дейкстре
Код:
1
2
3
4
5
6
7
8
9
 
Define i.f=250, mn=5
Fora:
i=i + 255 / mn
If i<500
  Debug i
  Goto Fora:
EndIf
 


Цитата:
PureBasic не поддерживает выражения/переменные для Step

Кстати, выражения используемые для задания параметров цикла For вычисляются на КАЖДОЙ ИТЕРАЦИИ!!!
Поэтому, если итераций много, то выражения выгодней вынести из параметров.
Например строку:
For q=0 To Len(a$)-1
Для ускорения заменяем на:
a=Len(a$)-1
For q=0 To a
Иначе Len(a$)-1 будет вычисляться на каждой итерации... мне подсказал newJS.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс фев 04, 2018 4:45 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1610
Откуда: Алматы
Благодарил (а): 13 раз.
Поблагодарили: 43 раз.
Пункты репутации: 5
да у меня там с гулькин нос итераций :) да еще и два цикла. один в одну сторону, второй во вторую - чтоб в середине всегда была полоска, а от неё уже на равном удалении в стороны рисовались другие согласно множителю графики.

все равно как-то не очень получилось - в момент рисования уже самого графика не очень точно рисует. ну да пофиг. все равно финальный результат мне не очень нравится. хочу более информативный, но пока не вижу в голове что именно я хочу :)

да и думаю канвасом наверное было бы лучше, чем изображением. изображение мерцает при перерисовке и поэтому нужен смарт рефреш окна.

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
Enumeration
  #WindowMOD
  #MODMainImageTableGad
  #MODGrafVariableTxt
  #MODGrafVariable
 
  #MODMainImageTableImg
EndEnumeration
 
CreateImage(#MODMainImageTableImg, 600, 500, 32, 0)
 
Procedure MODRepaint(mn.a)
 
  If StartDrawing(ImageOutput(#MODMainImageTableImg))
    Box(0, 0, 600, 500, 0)
   
    myStep = 255 / mn
    i = 250
    While i <= 500
      Line(0, i, 600, 1, RGB(100,100,100))
      i + myStep
    Wend
   
    i = 250
    While i >= 0
      Line(0, i, 600, 1, RGB(100,100,100))
      i - myStep
    Wend
   
    StopDrawing()
  EndIf
 
  SetGadgetState(#MODMainImageTableGad, ImageID(#MODMainImageTableImg))
 
EndProcedure
 
 
If OpenWindow(#WindowMOD, 100, 200, 780, 610, "Modulation Editor", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
 
    x = 140
    y = 10  
    ImageGadget(#MODMainImageTableGad, x, y+1, 600, 500, 0);ImageID(#MODMainImageTableImg))
   
    x + 610  
    TextGadget(#MODGrafVariableTxt, x+2, y, 20, 20, "x20")
    TrackBarGadget(#MODGrafVariable, x, y+15, 20, 80, 1, 20, #PB_TrackBar_Vertical)
    mn = 1
    oldmn = mn
    SetGadgetState(#MODGrafVariable, 20)
   
    ; убирает мерцание при обновлении картинки в гаджете
    SmartWindowRefresh(#WindowMOD, 1)
 
    MODRepaint(mn)
   
    Repeat
      Event = WaitWindowEvent()
   
      Select Event
        Case #PB_Event_Gadget
          EvGadget = EventGadget()
          Select EvGadget
            Case #MODGrafVariable ;{ множитель для графики              
              mn = GetGadgetState(#MODGrafVariable)
              ; фильтруем лишние клики с тем-же положением
              If mn <> oldmn
                oldmn = mn
                SetGadgetText(#MODGrafVariableTxt, "x"+Str(mn))              
                mn = 21 - mn
                MODRepaint(mn)
              EndIf
              ;}
          EndSelect
             
        Case #PB_Event_CloseWindow
          MODQuit = 1
         
      EndSelect
     
    Until MODQuit = 1
   
EndIf



Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт фев 06, 2018 10:08 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 569
Благодарил (а): 2 раз.
Поблагодарили: 32 раз.
Пункты репутации: 9
SereZa писал(а):
да у меня там с гулькин нос итераций :) да еще и два цикла. один в одну сторону, второй во вторую - чтоб в середине всегда была полоска, а от неё уже на равном удалении в стороны рисовались другие согласно множителю графики.

все равно как-то не очень получилось - в момент рисования уже самого графика не очень точно рисует. ну да пофиг. все равно финальный результат мне не очень нравится. хочу более информативный, но пока не вижу в голове что именно я хочу :)

да и думаю канвасом наверное было бы лучше, чем изображением. изображение мерцает при перерисовке и поэтому нужен смарт рефреш окна.

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
Enumeration
  #WindowMOD
  #MODMainImageTableGad
  #MODGrafVariableTxt
  #MODGrafVariable
 
  #MODMainImageTableImg
EndEnumeration
 
CreateImage(#MODMainImageTableImg, 600, 500, 32, 0)
 
Procedure MODRepaint(mn.a)
 
  If StartDrawing(ImageOutput(#MODMainImageTableImg))
    Box(0, 0, 600, 500, 0)
   
    myStep = 255 / mn
    i = 250
    While i <= 500
      Line(0, i, 600, 1, RGB(100,100,100))
      i + myStep
    Wend
   
    i = 250
    While i >= 0
      Line(0, i, 600, 1, RGB(100,100,100))
      i - myStep
    Wend
   
    StopDrawing()
  EndIf
 
  SetGadgetState(#MODMainImageTableGad, ImageID(#MODMainImageTableImg))
 
EndProcedure
 
 
If OpenWindow(#WindowMOD, 100, 200, 780, 610, "Modulation Editor", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
 
    x = 140
    y = 10  
    ImageGadget(#MODMainImageTableGad, x, y+1, 600, 500, 0);ImageID(#MODMainImageTableImg))
   
    x + 610  
    TextGadget(#MODGrafVariableTxt, x+2, y, 20, 20, "x20")
    TrackBarGadget(#MODGrafVariable, x, y+15, 20, 80, 1, 20, #PB_TrackBar_Vertical)
    mn = 1
    oldmn = mn
    SetGadgetState(#MODGrafVariable, 20)
   
    ; убирает мерцание при обновлении картинки в гаджете
    SmartWindowRefresh(#WindowMOD, 1)
 
    MODRepaint(mn)
   
    Repeat
      Event = WaitWindowEvent()
   
      Select Event
        Case #PB_Event_Gadget
          EvGadget = EventGadget()
          Select EvGadget
            Case #MODGrafVariable ;{ множитель для графики              
              mn = GetGadgetState(#MODGrafVariable)
              ; фильтруем лишние клики с тем-же положением
              If mn <> oldmn
                oldmn = mn
                SetGadgetText(#MODGrafVariableTxt, "x"+Str(mn))              
                mn = 21 - mn
                MODRepaint(mn)
              EndIf
              ;}
          EndSelect
             
        Case #PB_Event_CloseWindow
          MODQuit = 1
         
      EndSelect
     
    Until MODQuit = 1
   
EndIf


Одна из возможных проблем это
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
 
        myStep = 255 / mn
    i = 250
    While i <= 500
      Line(0, i, 600, 1, RGB(100,100,100))
      i + myStep
    Wend = 255 / mn
    i = 250
    While i <= 500
      Line(0, i, 600, 1, RGB(100,100,100))
      i + myStep
    Wend
 


myStep = 255 / mn
i = 250
Вы эти переменные по умолчанию создали как интегер а пытаетесь после посыалать в процедуру
mn = 21 - mn
myStep = 255 / 20 и т.д
и так как Line(0, i, 600, 1, RGB(100,100,100)) вроде как работает с типом.i то меняйте градацию линий. :roll:


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн фев 12, 2018 10:58 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1610
Откуда: Алматы
Благодарил (а): 13 раз.
Поблагодарили: 43 раз.
Пункты репутации: 5
пока что выглядит примерно так:

Изображение

но я думаю еще прикрутить 2 кнопки - для драгндропа и карандаш-линию. то есть карандаш будет рисовать от старта зеленую линию до текущих координат мышки и где типа мышкой кликнешь - там и нарисуется. а драгндроп инструмент в виде руки - то есть навел на линию, а она "взялась" мышкой и можно изменить угол.

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

и на канвас так и не перешел - хотя хочу :) там просто в момент проигрывания хочу чтоб в верхней части картинки по 1 пикселю заполнялась линия, скажем желтого цвета. типа будет показывать в каком сейчас момент проигрывается звук. поэтому чтоб не перерисовывать всю картинку каждые сто раз в секунду - хочу канвас. в канвас 1 пиксель на каждый тик мелодии. 16 миллисекунд по моему там пауза в делей стоит при проигрывании. или 17. но это кароче не точный таймер :) должно быть 16.6666... но PB, зараза, микросекунды не поддерживает :) только миллисекунды.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB