Перечисляемые последовательности

Clarion, Clarion 7

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

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

Перечисляемые последовательности

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

Привет всем !

Хочу спросить, только не кидайте меня сразу в терновый куст ... :)
Постоянно сталкиваюсь с тем, что в коде нужно повторять действие для некого конечного числового ряда.
Например, что то вроде:

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

  Loop Column# = 1,4,6,7,1,5 ... и т.д.
     SetMyField(Column#)  ! Какое-то действие по номеру колонки
  end
Понятно, что выход есть всегда и мастерская костылей работает без выходных.
Но неужели нет простого решения для простой задачи ? :( Заранее спасибо ! :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Перечисляемые последовательности

Сообщение Admin »

Что не нравится в текущем коде? Он простой и понятный.
Имеется в виду перебор очереди с какими то значениями.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Перечисляемые последовательности

Сообщение Admin »

Можно все в класс оформить с VIRTUAL и т.д. но это из пушки по воробьям кажется...
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7323
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Перечисляемые последовательности

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

Admin писал(а): 01 Февраль 2021, 2:03 Имеется в виду перебор очереди с какими то значениями
В том-то и дело, что нужно сначала что-то подготовить, а потом по этому перебрать.
Плюс некая структура данных, можно вот ещё и класс прикрутить ...
А просто, перебрать несколько чисел (1,4,6,7,1,5 и т.д.) в заданной последовательности нельзя ? :(
За теми кто отстал - не возвращаться. (С) Кодекс
Ал
✯ Ветеран ✯
Сообщения: 1011
Зарегистрирован: 08 Июль 2005, 6:48
Откуда: Россия

Перечисляемые последовательности

Сообщение Ал »

INLIST... (может использоваться до 25-ти элементов списка, но должно быть по крайней мере два)?
CHOOSE... ?
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7323
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Перечисляемые последовательности

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

Неа ... :( Теплее всего - это редко используемые сейчас структуры Itemize.
Но счастья не хватает возможности их динамического определения в процессе выполнения ... ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Ал
✯ Ветеран ✯
Сообщения: 1011
Зарегистрирован: 08 Июль 2005, 6:48
Откуда: Россия

Перечисляемые последовательности

Сообщение Ал »

Игорь Столяров писал(а): 01 Февраль 2021, 9:22 Неа ... :( Теплее всего - это редко используемые сейчас структуры Itemize.
Но счастья не хватает возможности их динамического определения в процессе выполнения ... ;)
тут дело вкуса и подхода, а Itemize - это больше про константы...
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

Перечисляемые последовательности

Сообщение RaFaeL »

А для интереса, зачем нужен такой код? Ни разу не видел раньше
Ал
✯ Ветеран ✯
Сообщения: 1011
Зарегистрирован: 08 Июль 2005, 6:48
Откуда: Россия

Перечисляемые последовательности

Сообщение Ал »

Clarion Databases & SQL, David Harms, Editor
Screen-2021-02-01_09-58-49.png
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Перечисляемые последовательности

Сообщение kreator »

А банальные массивы не подойдут?
We are hard at work… for you. :)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7323
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Перечисляемые последовательности

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

kreator писал(а): 01 Февраль 2021, 11:31 А банальные массивы не подойдут?
А можно ли массив инициализировать одной командой ?
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

Перечисляемые последовательности

Сообщение RaFaeL »

Если код один и тот же, а меняются только цифры, то код можно вынести в процедуру, куда передавать строку, в которой закодированы цифры (001004006007001005)
Далее

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

loop i#=1 to len(Str) by 3
  SetMyField(str[i# : i#+2])
end
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Перечисляемые последовательности

Сообщение Admin »

Могу предложить такой вариант...

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

  PROGRAM
  MAP
  END                       
  
IteratorQueue     QUEUE,TYPE
Item                &CSTRING
                  END

Iterator          CLASS,TYPE
Items               &IteratorQueue,PRIVATE
Position            LONG,PRIVATE
Construct           PROCEDURE
Destruct            PROCEDURE
Init                PROCEDURE(*QUEUE Q, LONG FieldPosition=1)
Init                PROCEDURE(STRING Items)
AddItem             PROCEDURE(STRING Item)
Count               PROCEDURE(),LONG   
Get                 PROCEDURE(),STRING  
Next                PROCEDURE(),STRING  
Kill                PROCEDURE 
                  END
  
IterOne           Iterator

TestQueue         QUEUE
ID                  LONG  
Number              LONG
                  END
  
  CODE            
  ! вариант 1
  IterOne.Init('1,2,3')
  LOOP IterOne.Count() TIMES
    MESSAGE(IterOne.Get())
  END
  IterOne.Kill           
  
  ! вариант 2
  IterOne.AddItem(100)
  IterOne.AddItem(200)
  IterOne.AddItem(300)
  LOOP IterOne.Count() TIMES
    MESSAGE(IterOne.Get())
  END
  IterOne.Kill           

  ! вариант 3
  LOOP W# = 1 TO 5
     TestQueue.ID = W#
     TestQueue.Number = RANDOM(1,1000)
     ADD(TestQueue)
  END
  IterOne.Init(TestQueue, 2)
  LOOP IterOne.Count() TIMES
    MESSAGE(IterOne.Get())
  END


Iterator.Construct           PROCEDURE
  CODE                            
  SELF.Items &= NEW IteratorQueue
  
Iterator.Destruct            PROCEDURE
  CODE           
  SELF.Kill
  DISPOSE(SELF.Items)

Iterator.Init                PROCEDURE(*QUEUE Q, LONG FieldPosition=1)
Cnt                          LONG
Field                        ANY   
  CODE
  LOOP Cnt = 1 TO RECORDS(Q)
    GET(Q, Cnt)
    Field &= WHAT(Q, FieldPosition)
    SELF.AddItem(Field)
  END

Iterator.Init                PROCEDURE(STRING Items)
SplitStrPos                  LONG,AUTO
StartPos                     LONG(1)      
Delimiter                    EQUATE(',')
  CODE                                                       
  LOOP
    SplitStrPos = INSTRING(Delimiter, Items, 1, StartPos)
    IF SplitStrPos
      SELF.AddItem(Items[StartPos : SplitStrPos-1])
      StartPos = SplitStrPos + LEN(Delimiter)
      IF StartPos > LEN(Items)
        BREAK
      END
    ELSE
      SELF.AddItem(Items[StartPos : LEN(Items)])
      BREAK
    END
  END

Iterator.AddItem             PROCEDURE(STRING Item)
  CODE                     
  SELF.Items.Item &= NEW CSTRING(LEN(Item)+1)
  SELF.Items.Item = CLIP(LEFT(Item))
  ADD(SELF.Items)

Iterator.Count               PROCEDURE()!,LONG
  CODE                                        
  RETURN RECORDS(SELF.Items)
  
Iterator.Get                 PROCEDURE()!,STRING  
  CODE
  RETURN SELF.Next()

Iterator.Next                PROCEDURE()!,STRING  
  CODE                       
  SELF.Position += 1
  GET(SELF.Items, SELF.Position)
  IF ERRORCODE() THEN RETURN '' END
  RETURN SELF.Items.Item

Iterator.Kill                PROCEDURE 
Cnt                          LONG
  CODE
  LOOP Cnt = 1 TO SELF.Count()
    GET(SELF.Items, Cnt)
    DISPOSE(SELF.Items.Item)
  END                
  FREE(SELF.Items)
  SELF.Position = 0
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7323
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Перечисляемые последовательности

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

Большое спасибо ! :)

1. Очень обрадовало, подобные вопросы возникали не только у меня. :)
2. Вариант 1 - это просто мечта. Буду его внедрять. :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Перечисляемые последовательности

Сообщение Admin »

Игорь Столяров писал(а): 02 Февраль 2021, 5:35 1. Очень обрадовало, подобные вопросы возникали не только у меня. :)
Я просто взял и написал, сегодня :)
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Ответить