purebasic.info

PureBasic forum
Текущее время: Ср ноя 14, 2018 8:46 pm

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




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

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

т.е. имею этот упрощенный вариант кода, который отрабатывает как надо
code1
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
x=1
 
For qwerty2 = 0 To 10
 
If x=1
  string.s = "условие + " + qwerty2
Else
  string.s = "условие + "
EndIf
 
  Debug string
 
Next


но возникла мысль вынести из цикла условие, так как:
При каждой итерации, а их десятки тысяч, отрабатывает один и тот же кусок кода с неизменным значением, а значение X задаётся до цикла, т.е. во время цикла неизменно. И чтобы процу не обрабатывать при каждой итерации лишний кусок кода, его было бы логичнее вынести в одну разовую проверку перед циклом.
НО как это сделать, не могу сообразить? Ведь переменная получает значение только в цикле.
т.е. образно говоря, нужно получить что-то вроде этого (естественно так не заработает):
code2
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
x=1
 
If x=1
  string.s = "условие + " + qwerty2
Else
  string.s = "условие + "
EndIf
 
For qwerty2 = 0 To 10
 
  Debug string
 
Next


?
PS: чувствую есть пробел в моих знаниях... которого и не хватает чтобы провернуть сей трюк. :oops:

Можно конечно в условие внести сам цикл:
code3
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
x=1
 
If x=1
 
      For qwerty2 = 0 To 10
     
          Debug "условие + " + qwerty2
     
      Next  
   
Else
 
      For qwerty2 = 0 To 10
 
          Debug "условие + "
     
      Next  
 
EndIf

Но что-то как-то по НУБски это, при чем это тут у X всего два значения, а если их больше будет .....


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Ср мар 30, 2016 8:13 pm 
Не в сети
док

Зарегистрирован: Ср апр 16, 2014 5:56 pm
Сообщений: 113
Благодарил (а): 7 раз.
Поблагодарили: 6 раз.
Пункты репутации: 5
registrymechanic писал(а):
Но что-то как-то по НУБски это, при чем это тут у X всего два значения, а если их больше будет .....

Ну почему ж по-нубски, всё логично.
А так?
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Select X
  Case 1
   
    For qwerty2 = 0 To 10
     
      Debug "условие + " + qwerty2
     
    Next  
   
  Case ...    
   
 
Default
   
    For qwerty2 = 0 To 10
     
      Debug "условие + "
     
    Next  
   
EndSelect



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

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

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

если у кого-то будут идеи - выкладывайте.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт мар 31, 2016 3:33 pm 
Не в сети
док

Зарегистрирован: Ср апр 16, 2014 5:56 pm
Сообщений: 113
Благодарил (а): 7 раз.
Поблагодарили: 6 раз.
Пункты репутации: 5
registrymechanic писал(а):
6519And писал(а):
всё логично.

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

Может, так?
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Procedure Cikl(Var,Limit,Line$)
  For Var = 0 To Limit
    Debug Line$
  Next
EndProcedure
 
;x=0
x=1
;x=2
 
If x=1
  qwerty2=x*10
  string.s = "условие + " + Str(qwerty2)
ElseIf x=2
  qwerty2=x*100
  string.s = "условие + " + Str(qwerty2)+" (Второе условие)"
ElseIf x=0
  string.s = "условие + "
EndIf
 Cikl(qwerty2,10,string)


Добавил немного отсебятины в условия для наглядности


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт мар 31, 2016 3:49 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 18, 2009 3:41 am
Сообщений: 1126
Благодарил (а): 86 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
6519And писал(а):
code
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Procedure Cikl(Var,Limit,Line$)
  For Var = 0 To Limit
    Debug Line$
  Next
EndProcedure
 
x=1
 
If x=1
  qwerty2=x*10
  string.s = "условие + " + Str(qwerty2)
ElseIf x=2
  qwerty2=x*100
  string.s = "условие + " + Str(qwerty2)+" (Второе условие)"
ElseIf x=0
  string.s = "условие + "
EndIf
 Cikl(qwerty2,10,string)



немного не то, уже в самом цикле появляется значение у переменной (например, в твоем коде Var), и вот где у тебя "Debug Line$", там по задаче :lol: должно быть условие if x=1 : Debug Line$ + str(Var) : else : Debug Line$ : endif А этот Х задается до цикла и на протяжении всего цикла постоянен. Проблема: в цикле много десятков тысяч итераций, как вынести это условие до цикла, чтобы лишний раз не грузить проц? (учитывая, что Х может иметь более двух значений)
:)


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

Зарегистрирован: Ср апр 16, 2014 5:56 pm
Сообщений: 113
Благодарил (а): 7 раз.
Поблагодарили: 6 раз.
Пункты репутации: 5
registrymechanic писал(а):
Х задается до цикла и на протяжении всего цикла постоянен. Проблема: в цикле много десятков тысяч итераций, как вынести это условие до цикла, чтобы лишний раз не грузить проц? (учитывая, что Х может иметь более двух значений)
:)

Создать два (сколько надо) циклов и включать/выбирать нужный по условию перед циклом. Т. е. как я и ответил раньше про Select/EndSelect.
Лишь в этом случае не проверяется никакое ВНЕШНЕЕ условие ВНУТРИ цикла.
Обойтись одним универсальным циклом не получится. Казалось бы, все необходимые данные должны быть назначены ему до выполнения, и можно было бы задействовать переменные - но нет: PureBasic не поддерживает выражения/переменные для Step.


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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11325
Благодарил (а): 4 раз.
Поблагодарили: 440 раз.
6519And писал(а):
PureBasic не поддерживает выражения/переменные для Step.
Чем помогла бы поддержка выражений в Step?

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт мар 31, 2016 7:18 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 18, 2009 3:41 am
Сообщений: 1126
Благодарил (а): 86 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
6519And писал(а):
Т. е. как я и ответил раньше про Select/EndSelect.

этот вариант то понятен/защитан в принципе так же пока сделал, но всё равно в поисках лучшего :)


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

Зарегистрирован: Ср апр 16, 2014 5:56 pm
Сообщений: 113
Благодарил (а): 7 раз.
Поблагодарили: 6 раз.
Пункты репутации: 5
Пётр писал(а):
Чем помогла бы поддержка выражений в Step?

Как это - чем? Это серьёзнейший недостаток. Можно было бы осуществлять "нелинейное", "рандомное" или просто условное (инкремент/декремент) поведение одного-единственного цикла. Как следствие - получать программируемые временные интервалы сразу по 2 параметрам (шаг и предел), а не одному, как сейчас. Мне приходится писАть 2 цикла вместо 1 с положительным/отрицательным Step, когда надо обрабатывать положительные/отрицательные числа.
Но, разумеется, в данном случае для registrymechanic ничего не годится, поскольку даже присвоение переменной в цикле ему жутко тормозит комп.


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

Зарегистрирован: Ср мар 30, 2016 9:45 pm
Сообщений: 20
Благодарил (а): 0 раз.
Поблагодарили: 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
 
Global x,y
Procedure Action()    ;Процедура для действия 0
  x=y+1
EndProcedure  
Procedure Action1()   ;Процедура для действия 1
  x=y-1
EndProcedure  
Procedure Action2()   ;Процедура для действия 2
  x=y*2
EndProcedure  
 
 
var=1                     ;Переменная выбора условия
 
Select var
  Case 0
    Pointer.l=@Action()   ;Получаем указатель на процедуру 0
  Case 1  
    Pointer.l=@Action1()  ;Получаем указатель на процедуру 1
  Case 2
    Pointer.l=@Action2()  ;Получаем указатель на процедуру 2
EndSelect
 
For y=1 To 10
  EnableASM
    call Pointer.l        ;Вызов процедуры по её адресу
  DisableASM
  Debug x  
 Next
 



Последний раз редактировалось Polkovnik Пт апр 01, 2016 3:10 pm, всего редактировалось 1 раз.

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

Зарегистрирован: Чт июн 18, 2009 3:41 am
Сообщений: 1126
Благодарил (а): 86 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
Polkovnik писал(а):
Если очень много разных условий, то в принципе, можно так:
Код:
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
 
Global x,y
Procedure Action()    ;Процедура для действия 0
  x=y+1
EndProcedure  
Procedure Action1()   ;Процедура для действия 1
  x=y-1
EndProcedure  
Procedure Action2()   ;Процедура для действия 2
  x=y*2
EndProcedure  
 
 
var=1                     ;Переменная выбора условия
 
Select var
  Case 0
    Pointer.l=@Action()   ;Получаем указатель на процедуру 0
  Case 1  
    Pointer.l=@Action1()  ;Получаем указатель на процедуру 0
  Case 2
    Pointer.l=@Action2()  ;Получаем указатель на процедуру 0
EndSelect
 
For y=1 To 10
  EnableASM
    call Pointer.l        ;Вызов процедуры по её адресу
  DisableASM
  Debug x  
 Next
 


Отлично. Практически алгоритм именно тот который представлял себе!
И совсем идеально было бы, если бы можно было как-то передавать переменную без Global ... Возможно ли это?
Т.е., визуально :) что-то типо этого:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Procedure Action(y)
  Debug "++++ " + Str(y)
EndProcedure  
 
Procedure Action1(y)
  Debug "++++ "
EndProcedure  
 
var=0
 
Select var
  Case 0
    Pointer.l=@Action()
  Case 1  
    Pointer.l=@Action1()
EndSelect
 
EnableASM
  For y=1 To 10
    call Pointer.l
  Next
DisableASM
 

но естественно так не получает в процедуре значение y, заданное в массиве:


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

Зарегистрирован: Ср мар 30, 2016 9:45 pm
Сообщений: 20
Благодарил (а): 0 раз.
Поблагодарили: 5 раз.
В принципе можно, но для этого на асме надо их запихивать в стек перед вызовом процедуры, а в процедуре извлекать из стека. ИМХО лишний геморой и снижение производительности.
Как-то так :wink:


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

Зарегистрирован: Ср апр 16, 2014 5:56 pm
Сообщений: 113
Благодарил (а): 7 раз.
Поблагодарили: 6 раз.
Пункты репутации: 5
Коллеги, вы все большие умнички :P
Но вот не пойму, зачем вводить что-то в тело цикла (ну, процедуру), когда задача - вывести всё мешающее из него, раз уж икс не меняется. Ведь экономия хоть 75 нс в цикле всегда повод гордиться собой. А время на назначение переменных внутри каждого вызова процедуры учитывается?


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

Зарегистрирован: Ср мар 30, 2016 9:45 pm
Сообщений: 20
Благодарил (а): 0 раз.
Поблагодарили: 5 раз.
Ну насколько я понял, задача была получить цикл с возможностью изменения логики внутри него в зависимости от внешних условий. Или я что-то не так понял ?


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

Зарегистрирован: Ср апр 16, 2014 5:56 pm
Сообщений: 113
Благодарил (а): 7 раз.
Поблагодарили: 6 раз.
Пункты репутации: 5
Polkovnik писал(а):
...задача была получить цикл с возможностью изменения логики внутри него в зависимости от внешних условий...

registrymechanic писал(а):
...При каждой итерации, а их десятки тысяч, отрабатывает один и тот же кусок кода с неизменным значением, а значение X задаётся до цикла, т.е. во время цикла неизменно. И чтобы процу не обрабатывать при каждой итерации лишний кусок кода, его было бы логичнее вынести в одну разовую проверку перед циклом....


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

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


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

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


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

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