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

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

Добавлено: 25 Сентябрь 2023, 10:08
Игорь Столяров
Привет всем !

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

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

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

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

Добавлено: 25 Сентябрь 2023, 10:35
Alex_G
Оператор :=: (Deep Assignments) копирует данные переменных с совпадающими наименованиями : "The name of a source array may match a destination array. ". В вашем примере, наименования массивов разные, так что все согласно описанию.
В этом случае работает простое присваивание: "В=А".

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

Добавлено: 25 Сентябрь 2023, 10:38
Alex_G
И в дополнение, из той же справки : Finally, whenever possible is it always more efficient to use a direct assignment of two matching structures in lieu of deep assignments. (Наконец, когда это возможно, всегда более эффективно использовать прямое присвоение двух согласующихся структур вместо глубоких присвоений.)

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

Добавлено: 25 Сентябрь 2023, 12:03
Игорь Столяров
Alex_G писал(а): 25 Сентябрь 2023, 10:35 В этом случае работает простое присваивание: "В=А".
Упс. Спасибо. А что там можно было с массивами ? :shock:

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

Добавлено: 27 Сентябрь 2023, 9:38
Губин Игорь
Игорь Столяров писал(а): 25 Сентябрь 2023, 12:03 Упс. Спасибо. А что там можно было с массивами ?
Нет, нельзя. :facepalm: Оператор :=: работает для групп. Массив или же очередь группой не являются. Они являются набором групп.

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

Добавлено: 27 Сентябрь 2023, 17:16
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) при компиляции выдает ошибку

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

Добавлено: 27 Сентябрь 2023, 18:08
Игорь Столяров
Alex_G писал(а): 27 Сентябрь 2023, 17:16 При иденчином описании массивов (тип, размер) все работает.
Здесь видимо всё транслируется в простое копирование области памяти, занимаемое массивом.
Поэтому я тоже не вижу причин, почему простое присвоение одинаковых массивов не должно работать.

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

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