проверка типа

Предыдущая тема Следующая тема Перейти вниз

проверка типа

Сообщение  Eric-S в Сб Янв 17, 2009 9:52 pm

Привет!

Такой вопрос. Можноли проверить тип в пренудительном порядке?
Электрик говорит, что вроде бы раньше было.
Но сейчас мы не можем эту фичу найти.

Вот например у меня есть макрос. И мне нужно определить тип аргумента.

Код:

#macro Break( _msg_ )
#if IsString( _msg_ )
' если строка то конвертируем её в число
BreakPoint Val( _msg_ )
else
' если число то передаём напрямую
BreakPoint _msg_
#endif
#endmacro

Здесь IsString() это предположительная функция, которая возвращает 1 если аргумент строка и 0 когда иначе.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 33
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: проверка типа

Сообщение  Eric-S в Сб Янв 17, 2009 10:03 pm

И ещё один вопрос.

У меня есть указатель на некий объект.
Классы, сразу скажу, мои. Так что могу над ними извращаться как угодно.

Но вот беда. функция принимает any ptr.
И мне нужно сделать проверку, а что это собственно за объект. Мой первый, мой второй или левые данные?
Кто-нибудь может подсказать?

Наметки такие. В начале класса создаю переменную-идентификатор.


Код:

type Class1
dim id as integer
declare constructor()
end type

constructor Class1()
this.id = 333
end constructor

У второго класса идентификатор меняю

Код:

type Class2
dim id as integer
declare constructor()
end type

constructor Class2()
this.id = 555
end constructor


А вот теперь нужно как-то считать этот идентификатор.
Будет ли работать например такое?
Код:

dim chk as integer ptr = aptr
select case chk[0]
case 333
print "class 1"
case "555"
print "class 2"
case else
print "error!"
end select

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 33
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: проверка типа

Сообщение  electrik в Ср Июн 03, 2009 7:09 pm

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

код:
dim a as integer
#if typeof(a) = integer
print"integer type"
#endif
sleep

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: проверка типа

Сообщение  Eric-S в Чт Июн 04, 2009 7:42 am

Спасибо большое! Надо будет попробовать.
Но это как я понимаю статическая проверка.

А вопрос о динамической по прежнему открыт.
Но кажеться в C++ применяеться способ который я предложил во втором посте сей темы.
(опять изобрёл велосипед, блин!)

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 33
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: проверка типа

Сообщение  electrik в Чт Июн 04, 2009 6:32 pm

я так понял, что тебе надо проверять на тип непосредственно в коде программы? боюсь, что тогда еще придется прописывать все используемые типы. и чесно говоря, трудно представить, как можно определить тип в уже запущеном бинарнике.
понятное дело, типы типа:
ubyte db
ushort dw
uinteger dd
ptr dword ptr
определить можно.
но а как определить пользовательский тип. получается, что при определении типа, в начале каждой переменной, надо ставить какой-то идентификатор, размер переменной, указатель на строку, или какой-то тип данных.
если представить такой файл в скомпилированном виде, получается что он будет ох какой огромный.
тут уже надо вбивать в бинарник что-то наподобе информации для отладчика, который пропишет все типы, и как-то будет отслеживать это дело.
если тебе надо использовать только в макросах, тогда можно, но это уже будет условный препроцессинг.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: проверка типа

Сообщение  vbman в Сб Июн 06, 2009 1:43 pm

Все нормально работает - тут главное сесть и поэкспериментировать... Very Happy
Это Ваши классы:

Код:
#Include Once "windows.bi"

type Class1
    dim id as integer
    declare constructor()
end type

constructor Class1()
    this.id = 333
end Constructor

type Class2
    dim id as integer
    declare constructor()
end type

constructor Class2()
    this.id = 444
End Constructor

Теперь код проверки:

Можно так:
Код:
Dim c As Class2 Ptr
#If TypeOf(*c)=Class2
   MessageBox(0,"Class2"," ",MB_OK)
#Else
   MessageBox(0,"Class1"," ",MB_OK)
#EndIf

А можно и так:
Код:
Dim c As Class1
#If TypeOf(c)=Class2
   MessageBox(0,"Class2"," ",MB_OK)
#Else
   MessageBox(0,"Class1"," ",MB_OK)
#EndIf

Изврат полный, но работает... bounce
avatar
vbman

Сообщения : 52
Дата регистрации : 2008-11-19
Возраст : 35
Откуда : Украина, Кировоград

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: проверка типа

Сообщение  Eric-S в Пн Июн 08, 2009 7:54 am

Ну почему же "изврат"? Всё очень миленько.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 33
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: проверка типа

Сообщение  vbman в Пн Июн 15, 2009 4:37 pm

Eric-S пишет:Ну почему же "изврат"? Всё очень миленько.

Извращения тоже бывают милыми... Shocked Embarassed Embarassed Embarassed afro cherry
avatar
vbman

Сообщения : 52
Дата регистрации : 2008-11-19
Возраст : 35
Откуда : Украина, Кировоград

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: проверка типа

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения