(FC in STL) Somma di due array elemento per elemento

Creazione di una funzione che esegue la somma elemento per elemento tra due array e copia il risultato in un terzo array.

Questa funzione avrà tre variabili di tipo Pointer (“array1_ptr”, “array2_ptr” che sono dichiarate come input, e “array_sum_ptr” che è dichiarata come variabile di output) e una variabile intera (variabile “dim” dichiarata come input) che rappresenta la dimensione minima tra i due array.
Ovviamente le due variabili Pointer puntano all’indirizzo di memoria del primo elemento dei rispettivi array (vedi questi articoli Utilizzo di variabili Pointer, Copia di array elemento per elemento).

Lo scopo di questa funzione è come detto quello di eseguire la somma elemento per elemento tra i due array in ingresso e salvare il risultato nell’array di output, cioè

array_sum[0]=array1[0]+array2[0]
array_sum[1]=array1[1]+array2[1]

array_sum[n]=array1[n]+array2[n]

La funzione spiegata nei passaggi fondamentali è la seguente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
FUNCTION "somma_di due_array_elemento_per_elemento_1" : Void
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
   VAR_INPUT 
      array1_ptr : Pointer;
      array2_ptr : Pointer;
      dim : Int;
   END_VAR
 
   VAR_OUTPUT 
      array_sum_ptr : Pointer;
   END_VAR
 
   VAR_TEMP 
      numb_db_array1 : Int;
      numb_db_array2 : Int;
      numb_db_array_sum : Int;
      count1 : Int;
      save_ar2 : DWord;
      ar1_sum : DWord;
      ar1_array1 : DWord;
      ar1_array2 : DWord;
      tmp_sum : Int;
      tmp_int1 : Int;
      tmp_int2 : Int;
   END_VAR
 
 
BEGIN
NETWORK
TITLE = 
//esegue la somma di due array elemento per elemento, e copia il risultato in un terzo array
//sia i due array in ingresso che quello in uscita sono di tipo pointer, la dimensione dim è pari a quella dell'array più piccolo
      L P##array_sum_ptr;
      LAR1;
      L W[ AR1, P#0.0];// Carico su ACCU1 i primi due Byte del Pointer array_sum_ptr che rappresentano il numero del blocco dati (DB_number)
      T #numb_db_array_sum;//trasferisco ACCU1 su numb_db_array_sum per riutilizzarlo dopo quando devo aprire il blocco dati
      L D[ AR1, P#2.0];// carico su ACCU1 i byte 2,3,4,5 (ossia 32bit) che corrispondono all'area di memoria a cui punta il puntatore array_sum_ptr all'intero del DB
      T #ar1_sum;//salvo l'indirizzo del primo elemento dell'array_sum (che è l'array di destinazione a cui punta il puntatore array_sum_ptr )
 
      L P##array1_ptr;
      LAR1;
      L W[ AR1, P#0.0];
      T #numb_db_array1;
      L D[ AR1, P#2.0];
      T #ar1_array1;//come sopra salvo l'indirizzo del primo elemento dell'array1 (che è l'array a cui punta array1_ptr)(è l'indirizzo all'interno del blocco dati numb_db_array1)
 
      L P##array2_ptr;
      LAR1;
      L W[ AR1, P#0.0];
      T #numb_db_array2;
      L D[ AR1, P#2.0];
      T #ar1_array2;//come sopra salvo l'indirizzo del primo elemento dell'array2 (che è l'array a cui punta array2_ptr)(è l'indirizzo all'interno del blocco dati numb_db_array2)
 
      L #dim;
inizio:      T #count1 ;//inizio il loop
      L #ar1_array1;
      LAR1;//carico su ar1 l'indirizzo dell'elemento dell'array1, ovvero array1[dim-count1] (questo indirizzo è l'indirizzo all'interno del blocco dati numb_db_array1)
      OPN DB[ #numb_db_array1];//apro il blocco dati DB dove è presente l'array a cui punta il puntatore array1_ptr
      L W[ AR1, P#0.0];//carico su ACCU1 l'elemento array1[dim-count1] (dove l'array1 è un array di interi o Word a cui punta array1_ptr)
      T #tmp_int1;//trasferisco tale valore sulla variabile temporanea tmp_int1
      +AR1 P#2.0;// "incremento" AR1 di 2 byte, ossia nel ciclo successivo del loop l'indirizzo in AR1 è quello della word immediatamente succesiva (elemento successivo)
      TAR1;//trasferisco ar1 su ACCU1
      T #ar1_array1;// salvo il nuovo indirizzo dell'elemento successivo dell'array
 
      L #ar1_array2;
      LAR1;
      OPN DB[ #numb_db_array2];
      L W[ AR1, P#0.0];
      T #tmp_int2;
      +AR1 P#2.0;
      TAR1;
      T #ar1_array2;//tutto ugale a prima solo che viene fatto per l'array2.
 
      L #tmp_int1;
      L #tmp_int2;
      +I;
      T #tmp_sum;// faccio la somma dei due valori, ossia array1[dim-count1]+array2[dim-count1] e la salvo su tmp_sum
 
      L #ar1_sum;
      LAR1;
      L #tmp_sum;
      OPN DB[ #numb_db_array_sum];
      T W[ AR1, P#0.0];
      +AR1 P#2.0;
      TAR1;
      T #ar1_sum;
      L #count1;
      LOOP inizio;
END_FUNCTION

You may also like...


Warning: count(): Parameter must be an array or an object that implements Countable in /membri/fabioplc/wp-includes/class-wp-comment-query.php on line 399
Menu Title