Что нового

[Процессы] Как написать переход на определенное место кода?

Статус
Закрыто для дальнейших ответов.

forfrends

Новичок
Сообщения
176
Репутация
3
Я столкнулся с проблеммой:
мне нужно что бы в определенный момент происходил переход на определенную строку кода.
Раньше это вытолняла команда GOTO (GOSUB).
В справке почитал - пишет эти команды больше не исспользуются. Но чем их заменить? У меня версия v3.2.8.1. Может в более новых версиях этот вопрос решон?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
GOTO ушли раз и на всегда. Просто организуй код по другому. Замена только одна - функции.
 
Автор
F

forfrends

Новичок
Сообщения
176
Репутация
3
А как еэто сделать (можно пример)?
так как циклы типа Look up While, Do, For, ExitLoop, ContinueLoop не подходят
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Код:
Dim $Text[100]

For $i = 0 To UBound($Text) - 1
	_SetText($i)
Next

Func _SetText($Index)
	$Text[$Index] = 'текст в масиве'
EndFunc   ;==>_SetText
 

kermzy

Новичок
Сообщения
8
Репутация
0
Столкнулся с похожей проблемой. Как правильно перейти на нужную строку? Дело в том, что, насколько я понимаю, после выполнения функции алгоритм все равно перейдет на то место кода, когда вызывалась функция. А если мне нужно, чтобы он именно перешагнул определенную часть кода, и пошел дальше по алгоритму? Вот пример:

Код:
$aaa = 0 ; параметр ошибки
for $niter = 3 to 1 Step -1                       
	AdlibRegister("perebor", 1)		
	$alert =0                                     ; снятие тревоги перед циклом. (если = 1: ошибка есть)
	
	funk1()
	funk2()
	funk3()
	funk4()
	
Next

Func funk1()                             ; funk1() - funk4() - выполняемые функции
	sleep(300)                           ; проверка на тревогу. если тревога есть, переходим к последнему циклу
	If $alert = 0 Then
	ToolTip("1", 500, 550)
	sleep(600)
	Else
	EndIf
EndFunc
	
Func funk2()
	sleep(300)
	If $alert = 0 Then
	ToolTip("2", 500, 550)
	Sleep(600)
	$aaa=1                                        ; Появление ошибки!
	Else
	EndIf
EndFunc

Func funk3()
	sleep(300)
	If $alert = 0 Then
	ToolTip("3", 500, 550)
	sleep(600)
	Else
	EndIf
EndFunc

Func funk4()
	sleep(300)
	ToolTip("4", 500, 550)
	sleep(600)
	
EndFunc


Func perebor()                                        ; проверка на ошибку
	If $aaa=1 then 
		
		$alert = 1                                    ; включение тревоги
		AdlibUnRegister("perebor")
		$aaa=0	                                      ; устранение ошибки
		funk4()                                       ; предпренимаемое действие для окончания цикла
		Else
	EndIf
EndFunc


В программе циклично выполняется ряд функций. Во всех, кроме последней возможно появлении ошибки( $aaa= 1. Для примера ошибка возникает во второй функции.) При этом функция должна прерваться на том месте, где выполнялась, и перейти сразу же на последнюю функцию. После нее цикл должен возобновиться с первой функции. Но вся проблема в том, что после прохождения последней функции алгоритм возвращается на то место, где была вызвана последняя функция - само место ошибки. А цель - как раз миновать возможную ошибку зависания, и выполнить последний цикл, и начать все заново. (В моем случае срабатывания ошибки происходит при задерживании на определенное время выполнения всего цикла). То есть условие на проверку тревоги ( переменная $alert) обеспечивает только отмену следующих функций. Но как вывести из самого места ошибки? Были мысли по поводу ExitLoop, но его можно использовать только в цикле(?).
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
kermzy сказал(а):
Были мысли по поводу ExitLoop, но его можно использовать только в цикле(?).
Стандартный трюк для избежания множественных "If".

Код:
Do
	...
	If @error Then
		ExitLoop
	EndIf
	...
	If @error Then
		ExitLoop
	EndIf
	...
	If @error Then
		ExitLoop
	EndIf
	...
Until 1
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
qsort
А как насчет того чтобы скомпилировать ваш пример?
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
Kaster
Опередил :beer:
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
Garrett сказал(а):
qsort
А как насчет того чтобы скомпилировать ваш пример?
А потом запустите и понаблюдайте.
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
qsort
Что-то не пойму смысл этого безобразия :wacko:.
Скрипт постоянно сам себя перезапускает.
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
qsort [?]
особого оргазма при написании строк кода я не испытываю
Тогда зачем что-либо вообще делать? Работу (любую) люди делают в двух случаях, или им нужны деньги, или им это нравится (оргазм - сильное чувство наслаждения и удовлетворения)
`p r o x y [?]
Если вы не понимаете, то, что говорить о начинающих!?
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
qsort [?]
Вот ведь! Этих самых случаев вовсе не два, а куда больше!Например, я сейчас исполнил метод я.сходить_в_ближайшую_лавку_за_пивом(). Скажу честно, денег я при этом не получил (и даже наоборот!), и мне вовсе не понравилось чапать по такой холодрыге по улице. Какое уж тут "нравится"!Обычные суровые будни, вот и все...
qsort а пиво вы потом куда дели? ;D
Ещё скажите, что вам его насильно в рот вливали!!! :laugh:
Следовательно, за деньги вы получили чувство наслаждения?! Простите, "оргазм"! :smile:
 
Статус
Закрыто для дальнейших ответов.
Верх