powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как покинуть IF без GOTO
13 сообщений из 13, страница 1 из 1
Как покинуть IF без GOTO
    #37969363
Фотография kolesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотелось бы остановить выполнение кода внутри if при выполнении какого-то из условий (чтобы дальше не тратить калории).
Думал, что должно сработать как-то так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
	if SQLCODE=0 {
		// Проверяем условие 1
		&sql(SELECT...)
		q:SQLCODE'=0 // Дальше проверять ничего не нужно - уже и так все понятно
		// Проверяем условие 2
		&sql(SELECT...)
		q:SQLCODE'=0
		// Проверяем условие 3
		&sql(SELECT...)
		q:SQLCODE'=0
		...
		// Проверяем условие Эн
		&sql(SELECT...)
		q:SQLCODE'=0
		// Ни одно из условий не выполнено, расстраиваемся
		s cry = 1
	}
	// Продолжаем расчет


Но получилось только так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
	if SQLCODE=0 {
		f  {
			// Проверяем условие 1
			&sql(SELECT...)
			q:SQLCODE'=0 // Дальше проверять ничего не нужно - уже и так все понятно
			// Проверяем условие 2
			&sql(SELECT...)
			q:SQLCODE'=0
			// Проверяем условие 3
			&sql(SELECT...)
			q:SQLCODE'=0
			...
			// Проверяем условие Эн
			&sql(SELECT...)
			q:SQLCODE'=0
			// Ни одно из условий не выполнено, расстраиваемся
			s cry = 1
			q
		}		
	}
	// Продолжаем расчет



Другого варианта выскочить из if нет? Ну кроме GOTO, понятно. Всем кстати, понравилось, что в 2012 каше метки должны быть уникальны не только внутри метода, но и внутри всего класса? Мы немного взбодрились в свое время... Впрочем, версия не использовать метки и GOTO в этом свете актуальна - мало ли что дальше они придумают.
...
Рейтинг: 0 / 0
Как покинуть IF без GOTO
    #37969425
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мы еще используем
Код: sql
1.
2.
3.
4.
5.
if conditon {
  do {
    // some code
  } while 0
}
...
Рейтинг: 0 / 0
Как покинуть IF без GOTO
    #37969510
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolesovДругого варианта выскочить из if нет? Ну кроме GOTO, понятно.
Свежак!
http://docs.intersystems.com/cache20102/csp/docbook/DocBook.UI.Page.cls?KEY=RCOS_ccontinue

А с GOTO нужно четко помнить "откуда" и "куда" идет переход. А некоторые так "напереходят", что попадают в "стековый" цикл...
...
Рейтинг: 0 / 0
Как покинуть IF без GOTO
    #37969514
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolesov , а чем QUIT-то провинился?
...
Рейтинг: 0 / 0
Как покинуть IF без GOTO
    #37969557
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolesov, имхо, вариант c for приемлимое решение, существенно сокращает размер кода, использую такое в js
...
Рейтинг: 0 / 0
Как покинуть IF без GOTO
    #37970002
ser_shu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DAiMorмы еще используем
Код: sql
1.
2.
3.
4.
5.
if conditon {
  do {
    // some code
  } while 0
}


в данном случае смотрится лучше, чем for {...} (по моему).
...
Рейтинг: 0 / 0
Как покинуть IF без GOTO
    #37970058
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolesovВсем кстати, понравилось, что в 2012 каше метки должны быть уникальны не только внутри метода, но и внутри всего класса? Мы немного взбодрились в свое время...Можно ссылку на документацию или пример кода?

В 2012.2 следующий код компилируется и работает без ошибок:Class test.kolesov Extends %RegisteredObject
{

ClassMethod Test1() As %Status
{
  goto a
  w 1,!
a  
  w 2,!
  q $$$OK
}

ClassMethod Test2() As %Status
{
  goto a
  w 3,!
a  
  w 4,!
  q $$$OK
}

}
PS: Identical Labels In Multiple Methods Of The Same Class
...
Рейтинг: 0 / 0
Как покинуть IF без GOTO
    #37970210
ser_shu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
servit,
видимо, ошибка компиляции в классах, помеченных PROCEDUREBLOCK = 0.
- - - - -
If two or more methods of that class define a label of the same name, and the methods are marked as PROCEDUREBLOCK = 0, there was the risk that the compiler would include them in the same compiled unit and report a duplicate label error.
- - - - -
у меня проблемы были именно в этом случае.
...
Рейтинг: 0 / 0
Как покинуть IF без GOTO
    #37970417
EvLaUy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, знакомая ситуация. Совсем недавно столкнулся с такой же проблемой. Тоже решил с помощью фиктивного бесконечного while (можно и for), тело которого выполняется на самом деле только один раз. Другие решения (GOTO или вложенные для каждой проверки if-else) нравятся гораздо меньше. Кстати, такая ситуация не только внутри if может возникнуть, но и без оного. Если просто есть большой участок кода, в котором последовательно проверяется выполнение каких-то условий. Если очередное условие не выполнено, оставшийся кусок участка нужно обойти, и продолжать выполнение с первой строчки после этого участка.
...
Рейтинг: 0 / 0
Как покинуть IF без GOTO
    #37970734
ser_shu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
EvLaUy... Тоже решил с помощью фиктивного бесконечного while (можно и for), тело которого выполняется на самом деле только один раз. ...
Как раз команда
DO {
...
... quit
...
}
WHILE 0
и не является фиктивным бесконечным циклом, а явно показывает, что выполняется ОДИН раз тело DO {...} (можно было WHILE 0 и убрать из синтаксиса для красоты :) ).
Нет недопонимания или ошибочного зацикливания, если quit неверный в FOR указали.
Впрочем, FOR f=1 {...} тоже один раз исполнится...
...
Рейтинг: 0 / 0
Как покинуть IF без GOTO
    #37970802
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы склонился вот к такому варианту...

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
	n
	d START
	q
START // 
	q:SQLCODE
	// Проверяем условие 1
	&sql(SELECT...)
	q:SQLCODE'=0 // Дальше проверять ничего не нужно - уже и так все понятно
	// Проверяем условие 2
	&sql(SELECT...)
	q:SQLCODE'=0
	// Проверяем условие 3
	&sql(SELECT...)
	q:SQLCODE'=0
	...
	// Проверяем условие Эн
	&sql(SELECT...)
	q:SQLCODE'=0
	// Ни одно из условий не выполнено, расстраиваемся
	s cry = 1
	q



Т.е. простая процедура все и разрулит лучшим образом...
...
Рейтинг: 0 / 0
Как покинуть IF без GOTO
    #37970803
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну или так...

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
	n
	if SQLCODE=0 {
		d PRC
	}
	q
PRC //
	// Проверяем условие 1
	&sql(SELECT...)
	q:SQLCODE'=0 // Дальше проверять ничего не нужно - уже и так все понятно
	// Проверяем условие 2
	&sql(SELECT...)
	q:SQLCODE'=0
	// Проверяем условие 3
	&sql(SELECT...)
	q:SQLCODE'=0
	...
	// Проверяем условие Эн
	&sql(SELECT...)
	q:SQLCODE'=0
	// Ни одно из условий не выполнено, расстраиваемся
	s cry = 1
	q
...
Рейтинг: 0 / 0
Как покинуть IF без GOTO
    #37971088
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolesov ,

TRY / CATCH and QUIT and GOTO
Вариант с try/catch  n SQLCODE,cry
  
  s (SQLCODE,cry)=0
  
  if SQLCODE=0 { 
    
    try{
      
      // Проверяем условие 1
      s SQLCODE=0
      w "SQLCODE 1=",SQLCODE,!
      q:SQLCODE // Дальше проверять ничего не нужно - уже и так все понятно

      // Проверяем условие 2
      s SQLCODE=0
      w "SQLCODE 2=",SQLCODE,!
      q:SQLCODE

      // Проверяем условие 3
      s SQLCODE=-100
      w "SQLCODE 3=",SQLCODE,!
      q:SQLCODE

      // Проверяем условие Эн
      s SQLCODE=0
      w "SQLCODE Эн=",SQLCODE,!
      q:SQLCODE

      // Ни одно из условий не выполнено, расстраиваемся
      s cry = 1
      
    }catch{}
    
  }

  // Продолжаем расчет
  w cry,!,"ok"
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как покинуть IF без GOTO
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]