Кол-во полей в структуре данных

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4929
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

Кол-во полей в структуре данных

Сообщение Игорь Столяров »

Привет всем !

Простой вопрос: зя как-нибудь определить кол-во полей в произвольной структуре (GROUP, QUEUE) данных ?
Сейчас это тупо делается перебором:

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

        Loc:IColumn = 1
        Loop While(Who(Loc:MyQueue,Loc:IColumn) <> '')
          Loc:IColumn += 1
        end
        Loc:IColumn -= 1  ! < --- Кол-во полей в структуре данных Loc:MyQueue
Может быть я чего-то не знаю ? Заранее спасибо ! :)
«V» значит Вендетта !

Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2519
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

Кол-во полей в структуре данных

Сообщение Дед Пахом »

Встроенной функции нет, надо перебором, само собой написать процедуру для произвольной группы. Только Ваш перебор для произвольной группы не годится - бывают поля без метки, для них Who() вернёт пустую строку.
С уважением, ДП

Yufil
Ветеран движения
Сообщения: 1251
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

Кол-во полей в структуре данных

Сообщение Yufil »

What надо вместо Who

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

A  Any
LOOP Count# = 1 to 10000
   A &= What( MyGroup, Count#) 
   IF A &= NULL THEN Break. 
END 
Return (Count# - 1)
 

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4929
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

Кол-во полей в структуре данных

Сообщение Игорь Столяров »

Вон оно как повернулось-то ... :(
Спасибо, пошёл переделывать. :)
«V» значит Вендетта !

Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2519
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

Кол-во полей в структуре данных

Сообщение Дед Пахом »

Нашёл у себя такой вариант, который учитывает и вложенные группы, и массивы внутри группы:

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

FieldCount                    PROCEDURE(*GROUP pGrp)
fldNdx                          LONG, AUTO
fldRef                          ANY
nestedGrp                       &GROUP
nFields                         LONG(0)
  CODE
  LOOP fldNdx = 1 TO 9999
    fldRef &= WHAT(pGrp, fldNdx)
    IF fldRef &= NULL
      !end of group
      BREAK
    END
  
    IF ISGROUP(pGrp, fldNdx)
      !- recursively get number of fields from nested group
      nestedGrp &= GETGROUP(pGrp, fldNdx)
      nFields += FieldCount(nestedGrp)
    ELSE
      nFields += HOWMANY(pGrp, fldNdx)
    END
  END

  RETURN nFields
С уважением, ДП

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4929
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

Кол-во полей в структуре данных

Сообщение Игорь Столяров »

Спасибо, "сделал" ! :) Заодно узнал о назначении и применении нескольких операторов.
Не, я конечно знал о существовании ISGROUP, GETGROUP, HOWMANY - но это был параллельный мир.
Да и вообще, где появляется рекурсия, там Игоря нет. :)
«V» значит Вендетта !

IKSoft
Посетитель
Сообщения: 34
Зарегистрирован: 27 Май 2010, 12:38

Кол-во полей в структуре данных

Сообщение IKSoft »

на 6.5 работает это:

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

tcIO.mGetMaxFields       FUNCTION (Queue p_Q)              
tgQue  group,type
PRecBuff long
PQueHead long
Unknown  long
RecSize  long
      end

tgQueHeader   group,type
id             short
RecSize        long
Fields         long
DescrSize      long
       end

grp   group
ptQueue  &Queue
ptr      long,over(ptQueue)
     end

pgQue        &tgQue
pgQueHeader  &tgQueHeader
  CODE                                            

  grp.ptQueue &= p_Q
  if (grp.ptQueue &= NULL)
     return(-1).
  pgQue &= (grp.ptr)
  pgQueHeader &= (pgQue.pQueHead)

  return(pgQueHeader.Fields)

tcIO.mGetMaxFields       FUNCTION (*group p_gG)     
tgGRP  group,type
pRecBuff long
pGrpHead long
RecSize  long
      end

tgGRPHeader   group,type
id             short
RecSize        long
Fields         long
DescrSize      long
       end

gPtr   group
pG         &group
       end

pgGRP        &tgGrp
pgGRPHeader  &tgGRPHeader

  CODE                                            

  gPtr.pG &= p_gG
  pgGrp &= (address(gPtr))
  pgGrpHeader &= (pgGrp.pGrpHead)
  return(pgGrpHeader.Fields)


Ответить