Страница 1 из 1

Просто баловался...

Добавлено: 07 Февраль 2020, 4:04
Admin
2020-02-07_11-03-15.png
2020-02-07_11-03-15.png (3.22 КБ) 1946 просмотров

Код: Выделить всё

  PROGRAM
  MAP
    VariableType(*ANY var),STRING
  END          
                                   
var0 ULONG        ! 0 to 4,294,967,295
var1 LONG         ! -2,147,483,648 to 2,147,483,647
var2 SHORT        ! -32,768 to 32,767
var3 USHORT       ! 0 to 65,535
var4 BYTE         ! 0 to 255
var5 STRING(100)
var6 STRING(10)
var7 CSTRING(2)

  CODE         
  MESSAGE( |
  VariableType(var0)&'|'& |
  VariableType(var1)&'|'& |
  VariableType(var2)&'|'& |
  VariableType(var3)&'|'& |
  VariableType(var4)&'|'& |
  VariableType(var5)&'|'& |
  VariableType(var6)&'|'& |
  VariableType(var7)&'|'& |
  '')

VariableType    PROCEDURE(*ANY var)!,STRING             
t_cstr          &STRING
  CODE             
  cstr# = LEN(var)
  ! num
  var = 257
  IF var = 1 THEN RETURN 'BYTE' END     
  var = 32768
  IF var = -32768 THEN RETURN 'SHORT' END      
  var = 65537
  IF var = 1 THEN RETURN 'USHORT' END      
  var = 2147483648
  IF var = -2147483648 THEN RETURN 'LONG' END      
  var = 4294967297
  IF var = 1 THEN RETURN 'ULONG' END      
  ! string
  var = 'a'
  IF var = 'a'    
    IF LEN(var) > 0 AND cstr# <> 0
      RETURN 'STRING('&LEN(var)&')'
    END              
    t_cstr &= NEW STRING(4194304) ! 4 Mb
    var = t_cstr
    size# = LEN(var) + 1
    DISPOSE(t_cstr)
    RETURN 'CSTRING('&size#&')'
  END
  RETURN var

Просто баловался...

Добавлено: 07 Февраль 2020, 5:21
Admin
Иногда не хватает определения типа данных у переменной.
Это пример тоже костыль. Портит переменную.
Не помню, клонировать переменную можно или нет средствами Кларион.

Просто баловался...

Добавлено: 07 Февраль 2020, 11:22
Дед Пахом

Код: Выделить всё

  PROGRAM

  MAP
    GetType(*BYTE pVal), LONG, PROC
    GetType(*LONG pVal), LONG, PROC
  END

b                             BYTE
l                             LONG
a                             ANY

  CODE
  a = b
  GetType(a)
  a = l
  GetType(a)
  
GetType                       PROCEDURE(*BYTE pVal)
  CODE
  MESSAGE('byte')
  RETURN DataType:BYTE
  
GetType                       PROCEDURE(*LONG pVal)
  CODE
  MESSAGE('long')
  RETURN DataType:LONG
  

Просто баловался...

Добавлено: 07 Февраль 2020, 12:49
vic7tar
Дед Пахом писал(а): 07 Февраль 2020, 11:22 PROGRAM

MAP
GetType(*BYTE pVal), LONG, PROC
...
Чот не работает.

Просто баловался...

Добавлено: 07 Февраль 2020, 12:54
Дед Пахом
vic7tar писал(а): 07 Февраль 2020, 12:49 Чот не работает.
Прошу прощения, не то, вот так работает, правда без ANY.

Код: Выделить всё

b                             BYTE
l                             LONG

  CODE
  GetType(b)
  GetType(l)

Просто баловался...

Добавлено: 07 Февраль 2020, 13:09
vic7tar
Как я понял, нужно определить тип внутри
Admin писал(а): 07 Февраль 2020, 4:04 VariableType(*ANY var),STRING
На входе -> any, значение хранится в long (byte...long) или в real (для ulong) для целых чисел.
a# = var - идёт уже правильное преобразование.
Хранится ли где-нибудь тип содержимого - пока не знаю.