Массированное массирование массивов

Clarion, Clarion 7

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

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

Массированное массирование массивов

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

Привет всем !

Казалось бы простой код (в полном соответствии со справкой):

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

A Byte,Dim(3)
B Byte,Dim(3)

  Code
  A[1] = 1
  A[2] = 2
  A[3] = 3

  B :=: A
  Message(B[2])  ! <- Ошибок нет, но неожиданно = 0
1.jpg
За теми кто отстал - не возвращаться. (С) Кодекс
Alex_G
Бывалый
Сообщения: 77
Зарегистрирован: 09 Ноябрь 2009, 13:04
Поблагодарили: 2 раза

Массированное массирование массивов

Сообщение Alex_G »

Оператор :=: (Deep Assignments) копирует данные переменных с совпадающими наименованиями : "The name of a source array may match a destination array. ". В вашем примере, наименования массивов разные, так что все согласно описанию.
В этом случае работает простое присваивание: "В=А".
Последний раз редактировалось Alex_G 25 Сентябрь 2023, 10:39, всего редактировалось 2 раза.
Alex_G
Бывалый
Сообщения: 77
Зарегистрирован: 09 Ноябрь 2009, 13:04
Поблагодарили: 2 раза

Массированное массирование массивов

Сообщение Alex_G »

И в дополнение, из той же справки : Finally, whenever possible is it always more efficient to use a direct assignment of two matching structures in lieu of deep assignments. (Наконец, когда это возможно, всегда более эффективно использовать прямое присвоение двух согласующихся структур вместо глубоких присвоений.)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7378
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Массированное массирование массивов

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

Alex_G писал(а): 25 Сентябрь 2023, 10:35 В этом случае работает простое присваивание: "В=А".
Упс. Спасибо. А что там можно было с массивами ? :shock:
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2329
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Поблагодарили: 18 раз

Массированное массирование массивов

Сообщение Губин Игорь »

Игорь Столяров писал(а): 25 Сентябрь 2023, 12:03 Упс. Спасибо. А что там можно было с массивами ?
Нет, нельзя. :facepalm: Оператор :=: работает для групп. Массив или же очередь группой не являются. Они являются набором групп.
Это я только кажусь дураком! На самом деле я полный идиот!
Alex_G
Бывалый
Сообщения: 77
Зарегистрирован: 09 Ноябрь 2009, 13:04
Поблагодарили: 2 раза

Массированное массирование массивов

Сообщение Alex_G »

Губин Игорь писал(а): 27 Сентябрь 2023, 9:38
Игорь Столяров писал(а): 25 Сентябрь 2023, 12:03 Упс. Спасибо. А что там можно было с массивами ?
Нет, нельзя. :facepalm: Оператор :=: работает для групп. Массив или же очередь группой не являются. Они являются набором групп.
На самом деле не совсем так. В качестве переменной, которой присваивается значение могут быть и группа, и очередь, и запись и даже массив. (destination The label of a GROUP, RECORD, or QUEUE data structure, or an array).
При этом, если в группе/очереди есть переменная (не важно скалярная или массив) с меткой, совпадающей с аналогичной переменной операнда справа - происходит присваивание. Для Queue присваивание происходит для одного элемента очереди.
Примерно так :

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

AQueue  Queue,Pre(a)
Strока    String(3)
Massiv    Long,Dim(2)
        END
        
BQueue  Queue,Pre(b)
Strока    String(3)
Massiv    Long,Dim(2)
        END
               ...
 LOOP i#=1 to Records(AQueue)
    GET(AQueue,i#)
    BQueue :=: AQueue  !  Is equivalent to: 
    				   !  b:Stroka = a:stroka
    				   !  b:Massiv[1] = a:Massiv[1]
    				   !  b:Massiv[2] = a:Massiv[2]
    Add(BQueue)
 END
 
Для отдельного массива, не являющегося элементом группы/очереди/записи доступна только инициализация

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

ArrayField SHORT,DIM(10)
  ...
  ArrayField :=: 7    !  Is equivalent to: 
	                     !		LOOP I# = 1 to 10
	                     ! 			ArrayField[I#] = 7
	                     !		END

  
Относительно присваивания массивов, без написания цикла

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

          b:Massiv = a:Massiv
     
При иденчином описании массивов (тип, размер) все работает. Если тип различен (например Short - Long) при компиляции выдает ошибку
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7378
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Массированное массирование массивов

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

Alex_G писал(а): 27 Сентябрь 2023, 17:16 При иденчином описании массивов (тип, размер) все работает.
Здесь видимо всё транслируется в простое копирование области памяти, занимаемое массивом.
Поэтому я тоже не вижу причин, почему простое присвоение одинаковых массивов не должно работать.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2329
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Поблагодарили: 18 раз

Массированное массирование массивов

Сообщение Губин Игорь »

Игорь Столяров писал(а): 27 Сентябрь 2023, 18:08 Поэтому я тоже не вижу причин, почему простое присвоение одинаковых массивов не должно работать.
Сложно сказать, но не всегда отрабатывает. После того, как наткнулся на то, что не присваивает, теперь всегда поэлементное присвоение.
Это я только кажусь дураком! На самом деле я полный идиот!
Ответить