powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Как узнать, находится ли в переменной типа Any массив или скаляр?
25 сообщений из 27, страница 1 из 2
Как узнать, находится ли в переменной типа Any массив или скаляр?
    #35964538
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В функцию в аргументе типа Any передается либо массив либо скаляр разных типов данных.
Далее это значение будет передано во внешнюю ф-ю, где Any не поддерживается.
Поэтому необходимо привести к явному типу данных путем присвоения в массив или скаляр нужного типа.
Определить тип данных можно : ClassName().
Как определить массив или нет?

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

Есть один хак - ф-я UpperBound() в PB9 возвращает "-1" для скаляра. Однако в PB6 приложение вылетает с GPF, а в PB6 тоже должно работать.
...
Рейтинг: 0 / 0
Как узнать, находится ли в переменной типа Any массив или скаляр?
    #35964578
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyВ функцию в аргументе типа Any передается либо массив либо скаляр разных типов данных.
Далее это значение будет передано во внешнюю ф-ю, где Any не поддерживается.
Поэтому необходимо привести к явному типу данных путем присвоения в массив или скаляр нужного типа.
Определить тип данных можно : ClassName().
Как определить массив или нет?

Идея №1
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
public function integer isarray (long a);
return  0 
end function
public function integer isarray (long a[]);
return  1 
...
event open;
any a,b
long mas[],c

mas[ 1 ] =  1 
c = - 1 
b = c
a = mas[]
c = dynamic IsArray(a)
MessageBox("",c)
c = dynamic IsArray(b)
MessageBox("",c)
end event
Идея №2 - ловить ошибку в systemerror при попытке обратиться как к массиву и таким образом выяснять.
PS. Идея №1 на PB6 работает.
PSS. По ночам лучше спать ;)))
...
Рейтинг: 0 / 0
Как узнать, находится ли в переменной типа Any массив или скаляр?
    #35964637
maxATC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин Марк
Идея №2 - ловить ошибку в systemerror при попытке обратиться как к массиву и таким образом выяснять.
+1.

Локшин Марк
PSS. По ночам лучше спать ;)))
Спокойно Эполит, спокойно!!!
...
Рейтинг: 0 / 0
Как узнать, находится ли в переменной типа Any массив или скаляр?
    #35964687
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Идея №2 имеет следующие недостатки:
1. Частые заходы в systemerror в PB 6 череваты крахом приложения.
2. Функциональность нельзя реализовать в отдельном объекте.
3. Необходимо будет использовать какой-то глобальный объект.
4. Если используется многопоточность, то придется делать дополнительные телодвижения.
...
Рейтинг: 0 / 0
Как узнать, находится ли в переменной типа Any массив или скаляр?
    #35964704
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если б речь не шла о РВ6!!!?, то Try Catch прекрасно для этих целей работает :-)
...
Рейтинг: 0 / 0
Как узнать, находится ли в переменной типа Any массив или скаляр?
    #35964725
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин Марк
Идея №1
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
public function integer isarray (long a);
return  0 
end function
public function integer isarray (long a[]);
return  1 
....
dynamic IsArray(a)

Спасибо! Это подходит полностью.
...
Рейтинг: 0 / 0
Как узнать, находится ли в переменной типа Any массив или скаляр?
    #35964730
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ФилиппЕсли б речь не шла о РВ6!!!?, то Try Catch прекрасно для этих целей работает :-)
Согласен. Исключения были рассмотрены мной в первую очередь.
Правда у исключений в PB есть одна неприятная особенность: при запуске приложения в IDE со включенным Just in time debugging, даже если есть Catch исключения все равно генерируют сообщения об ошибках да еще и включают режим отладки. Не знаю какое из этих двух действий более идиотское :)

А насчет почему PB6 - зачем ограничивать себе круг потенциальных клиентов? А их с PB6 достаточно, судя по статистике продаж DW2XLS.
Вот если бы выяснилось что нельзя такое на 6 делать тогда - да :-)
...
Рейтинг: 0 / 0
Как узнать, находится ли в переменной типа Any массив или скаляр?
    #35964732
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркPSS. По ночам лучше спать ;)))
Вот закончу эту программулину - буду все лето по ночам спать, а днем на море :)
...
Рейтинг: 0 / 0
Как узнать, находится ли в переменной типа Any массив или скаляр?
    #35964747
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, (опять же забыв о РВ6), в PBNI есть IsArray method for the IPB_Arguments interfacе...
...
Рейтинг: 0 / 0
Как узнать, находится ли в переменной типа Any массив или скаляр?
    #35964748
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyФилиппЕсли б речь не шла о РВ6!!!?, то Try Catch прекрасно для этих целей работает :-)
Согласен. Исключения были рассмотрены мной в первую очередь.
Правда у исключений в PB есть одна неприятная особенность: при запуске приложения в IDE со включенным Just in time debugging, даже если есть Catch исключения все равно генерируют сообщения об ошибках да еще и включают режим отладки. Не знаю какое из этих двух действий более идиотское :)
Just in time debugging просто говорит, что Systemeerror и РВшный режим отладки и есть first chance exception handler, так что ничего идиотского я тут не вижу :-)
...
Рейтинг: 0 / 0
Как узнать, находится ли в переменной типа Any массив или скаляр?
    #35964753
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Филипп
Just in time debugging просто говорит, что Systemeerror и РВшный режим отладки и есть first chance exception handler, так что ничего идиотского я тут не вижу :-)
Если бы не было обработчика ошибки - да.
Но если обработчик есть, значит он туда поставлен для нормального восстановления после ошибки, а значит остановка и какие-то сообщения - не в тему.
...
Рейтинг: 0 / 0
Как узнать, находится ли в переменной типа Any массив или скаляр?
    #35964755
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот подробнейшее обсуждение темы . Там самое последнее (я не пробовал), может работает...
...
Рейтинг: 0 / 0
Как узнать, находится ли в переменной типа Any массив или скаляр?
    #35964756
maxATC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркИдея №2 имеет следующие недостатки:
1. Частые заходы в systemerror в PB 6 череваты крахом приложения.
1.Об этом не знал.

Локшин Марк2. Функциональность нельзя реализовать в отдельном объекте.
3. Необходимо будет использовать какой-то глобальный объект.
2. Можно
3. Совершенно верно. Унаследовать от error и данный объект со своей обработкой systemerror использовать. Плюс в том, что вставил в проект и забыл про проверку во всех возможных появлениях необходимости проверки на что там в any?

Локшин Марк4. Если используется многопоточность, то придется делать дополнительные телодвижения.
4. Сказать нечего.
...
Рейтинг: 0 / 0
Как узнать, находится ли в переменной типа Any массив или скаляр?
    #35964757
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyФилипп
Just in time debugging просто говорит, что Systemeerror и РВшный режим отладки и есть first chance exception handler, так что ничего идиотского я тут не вижу :-)
Если бы не было обработчика ошибки - да.
Но если обработчик есть, значит он туда поставлен для нормального восстановления после ошибки, а значит остановка и какие-то сообщения - не в тему.
Не согласен. Раз Just in time debugging включен, ВСЕ ошибки в него, просто и ясно...
...
Рейтинг: 0 / 0
Как узнать, находится ли в переменной типа Any массив или скаляр?
    #35964787
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ФилиппНе согласен. Раз Just in time debugging включен, ВСЕ ошибки в него, просто и ясно...
Мне не ясно и не просто. Ведь код написан, отлажен и работает правильно - какие еще ошибки? Почему я вообще должен каждый раз при выполнении программы в этот код лезть?

Посмотрите на JIT-дебагер Visual Studio: он работает без этого маразма - переключение в дебаггер происходит только если исключение НЕ обработано.

То что для вас это поведение PB нормально говорит о том что либо вы JITD не используете в проектах где активно используются исключения, либо это мазохизм какой-то :).
...
Рейтинг: 0 / 0
Как узнать, находится ли в переменной типа Any массив или скаляр?
    #35964810
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Э, батенька, чего с VStudio сравнивать, да и вообще это некорректное сравнение, в ней у вас полный контроль над тем КАКИЕ именно exceptions выбрасывают вас в отладчик. В РВ этого контроля нет, что означает ВСЕ exceptions выбрасывают вас в отладчик...
...
Рейтинг: 0 / 0
Как узнать, находится ли в переменной типа Any массив или скаляр?
    #35964846
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ФилиппЭ, батенька, чего с VStudio сравнивать, да и вообще это некорректное сравнение, в ней у вас полный контроль над тем КАКИЕ именно exceptions выбрасывают вас в отладчик. В РВ этого контроля нет, что означает ВСЕ exceptions выбрасывают вас в отладчик...
Я и говорю - в VS нормально сделано. А в PB - через ж... - практической пользы нет, одни проблемы.
...
Рейтинг: 0 / 0
Как узнать, находится ли в переменной типа Any массив или скаляр?
    #35964994
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxATC
Локшин Марк2. Функциональность нельзя реализовать в отдельном объекте.
3. Необходимо будет использовать какой-то глобальный объект.
2. Можно
3. Совершенно верно. Унаследовать от error и данный объект со своей обработкой systemerror использовать. Плюс в том, что вставил в проект и забыл про проверку во всех возможных появлениях необходимости проверки на что там в any?

Я сильно подозреваю, что все это делается в каком-то другом объекте, поэтому придется делать еще один объект для обработки systemerror и подключать его (а допустим там уже что-то есть другое, тогда изначально разрабатываемый объект будет сложнее интегрировать в уже существующее приложение).
...
Рейтинг: 0 / 0
Как узнать, находится ли в переменной типа Any массив или скаляр?
    #35965029
maxATC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин Марк ,
Реализация такова, наследую от стандартного объекта ERROR nv_error прописываю в Variable Types Error: данный объект, создаю в наследнике допустим функцию of_systemerror там необходимая мне обработка, в объекте Application в событии systemerror прописываю error.of_systemerror(), теперь все ошибки systemerror будут обрабатываться моей of_systemerror(), там и ловлю определенные ошибки и реагирую на них. Мой краткий скрипт of_systemerror(), просто управление сообщением.

Код: plaintext
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.
String ls_title,ls_header_error,ls_time_report
ls_header_error = "~n~nЕсли данная ошибка будет появляться в дальнейшем,~nобратитесь к разработчику." 			
ls_time_report = String(Now())+" / "+String(Today()) 

//Обработка системных ошибок
	ls_title = "Системная ошибка"
		
//Вывод сообщения

CHOOSE CASE This.ii_errordisplay
	CASE  1 //Отображать ошибку в полном формате
		MessageBox(ls_title, 				    &
		This.Text 				  +&
		"~n~Ошибка № "+String(This.Number)  		 + &
		"~nОкно или Меню: "+ This.WindowMenu 		 + &
		"~nОбъект: "+ This.Object  			 		 + &
		"~nСобытие или функция: "+This.ObjectEvent + &
		ls_header_error 									      + &
		"~n~nВремя и дата события: " + ls_time_report, +&
		exclamation!)
		
	CASE  2  //Отображать ошибку в кратком формате
		MessageBox(ls_title, 				    &
		This.Text +&
            "~n~nЕсли данная ошибка будет появляться в дальнейшем,~nобратитесь к   разработчику.")
       CASE ELSE //Ничего не сообщать
END CHOOSE

if This.ii_errorlog =  1  then//Запись в Log.file
	int li_FileNum
	string ls_save
	ls_save = "********************************************~n"+ls_title+"~n"+This.Text 	  +&
			"~nОшибка № "+String(This.Number)  		 + &
			"~nОкно или Меню: "+ This.WindowMenu 		 + &
			"~nОбъект: "+ This.Object  			 		 + &
			"~nСобытие или функция: "+This.ObjectEvent +&
			"~nВремя и дата события: " + ls_time_report  
			
	li_FileNum = FileOpen(is_dir_error_log + "error.log",LineMode!,Write!,LockWrite!,Append!)
	FileWrite(li_FileNum,ls_save)
	FileClose(li_FileNum)
end if

Инициализация переменных данного объекта в евенте Open App.
При возникновении какой либо ошибки где нибудь в скрипте приложения и я его хочу отследить, в данной функции прописываю отслеживания по номеру (допустим несоответствие типов), ну и например в какой нибудь объект,структуру, переменную (gb_ошибочка) пишется допустим True. В скрипте где необходима проверка на соответствие типов li_integer = any: if gb_ошибочка then и далее li_integer != any обрабатываю. Согласен возможно и не лишено недостатков но пока в моих проектах данной реализации хватает за глаза. Строго не судить и если есть какие либо огрехи не поленитесь отписаться. Заранее благодарен.
...
Рейтинг: 0 / 0
Как узнать, находится ли в переменной типа Any массив или скаляр?
    #35965127
maxATC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин Марк ,
Вариант в предложенной мной реализации не катит , не учел, что из скрипта по systemerror вываливаемся и соответственно никакого продолжения скрипта нет. Как всегда в голове работает, а на практике нет.
...
Рейтинг: 0 / 0
Как узнать, находится ли в переменной типа Any массив или скаляр?
    #35965162
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Товарищи, а зачем все это, Systemerror, глобальные обработчики?
Решение с динамическим вызовом перегруженных методов (вариант №1 Марка) и быстрее и проще и не требует от других модулей маршрутизации обработки ошибки в мой модуль (т.е. фактически нарушения инкапсуляции, т.к. это не интерфейс модуля, а всего лишь часть его реализации).
Ну и о наболевшем - Systemerror, также как и исключения, выкидывает в дебаггер при включенном JITd. А я не позволю чтобы какая-то глючная программа, написанная за гроши толпой индокитайцев ЗА МЕНЯ решала нужен ли мне дебагер или нет :)
...
Рейтинг: 0 / 0
Как узнать, находится ли в переменной типа Any массив или скаляр?
    #35965274
maxATC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyРешение с динамическим вызовом перегруженных методов (вариант №1 Марка) и быстрее и проще
Согласен, ну так ведь интересно, а можно ли вот так. Оказалось, что проблематично, ну и и это результат на будущее, не изобретать велосипед.:)
...
Рейтинг: 0 / 0
Как узнать, находится ли в переменной типа Any массив или скаляр?
    #35967648
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
Ну и о наболевшем - Systemerror, также как и исключения, выкидывает в дебаггер при включенном JITd. А я не позволю чтобы какая-то глючная программа, написанная за гроши толпой индокитайцев ЗА МЕНЯ решала нужен ли мне дебагер или нет :)
А она за тебя и не решает, ты ей сам сказал - ВКЛЮЧИ JIT debugging :-)))
...
Рейтинг: 0 / 0
Как узнать, находится ли в переменной типа Any массив или скаляр?
    #35967792
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ФилиппА она за тебя и не решает, ты ей сам сказал - ВКЛЮЧИ JIT debugging :-)))
из справки PB Just-in-time debugging
[1] If you want to be able to enter the debugger while running in normal mode, select Just In Time Debugging on the General page of the System Options dialog box. Checking this option enables the Debug button on the dialog box that displays when you click the PowerBuilder icon in the Windows taskbar when your application is running.
[2] The Debug window also opens automatically if a system error occurs.

Так вот п.1 - это единственное для чего пригодна реализация JITD в PB. И именно ради него я и включаю эту опцию.
На нем и надо было остановиться.
Но какой-то ... придумал еще и п.2.
В нормальной реализации п.2 звучал бы так:
[2] The Debug window also opens automatically if an unhandled system error occurs.

А если кому-то понадобилось бы чтобы перехваченные ошибки тоже вызывали дебагер, то для этого в обработчике ставится вызов DebugBreak(), который как раз и предназначен для вызова дебагера.
...
Рейтинг: 0 / 0
Как узнать, находится ли в переменной типа Any массив или скаляр?
    #35968041
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На чем мы там остановились?
Ага, так вот смигрировал я проект из PB9 в PB6 и выяснилось, что то место где проверяется, находится ли в переменной типа Any объект, перестало работать. Для определения я использовал IsValid() и в PB9 это работало, а в PB6 IsValid возвращает True не только для объектов но и для других типов данных.
Вернее для простых типов данных результат зависит от значения хранящегося в any. (Оно приводится к типу bool: 0, false -> false, остальные значения -> true)
Это нормальное поведение или глюк?
Кто-то в курсе в какой версии поведение изменилось?

Придется и это переделать на динамический вызов перегруженных ф-й.
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Как узнать, находится ли в переменной типа Any массив или скаляр?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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