Inizializzazione delle matrici

 

Sto imparando gli array dalla guida di mql4, e mi sono imbattuto in un argomento con cui sto avendo problemi; l'inizializzazione dell'array è leggermente sconcertante, non capisco la seguente affermazione

"

Inizializzazione degli array


Un array può essere inizializzato solo da costanti di tipo corrispondente. Gli array monodimensionali e multidimensionali sono inizializzati da una sequenza unidimensionale di costanti separate da virgole. La sequenza è inclusa tra parentesi graffe:

int Mas_i[3][4] = { 0, 1, 2, 3,   10, 11, 12, 13,   20, 21, 22, 23 };
 
double Mas_d[2][3] = { 0.1, 0.2, -0.3,    -10.2, 1.5, 7.0 };
 
bool Mas_b[5] = { false, true, false, true, true }

"

Non sono confuso dal fatto che un array può essere inizializzato solo da costanti di un tipo corrispondente, ma sono confuso dal concetto di inizializzazione dell'array e dal fatto che una sequenza unidimensionale può avviare un array multidimensionale.

Sono confuso da quanto segue.

"

Nella sequenza inizializzata una o più costanti possono essere omesse. In tal caso i corrispondenti elementi di array di tipo numerico sono inizializzati da zero, gli elementi di array di tipo stringa sono inizializzati dal valore stringa "" (virgolette senza spazio), cioè da una riga vuota (non deve essere confuso con uno spazio). Il prossimo programma visualizza i valori degli array, inizializzati da una sequenza con omissione di alcuni valori (script arrayalert.mq4):

//--------------------------------------------------------------------
// arrayalert.mq4
// The code should be used for educational purpose only.
//--------------------------------------------------------------------
int start()                                     // Special funct. start()
  {
   string Mas_s[4] = {"a","b", ,"d"};           // String array
   int Mas_i[6] = { 0,1,2, ,4,5 };              // Integer type array
   Alert(Mas_s[0],Mas_s[1],Mas_s[2],Mas_s[3]);  // Displaying
   Alert(Mas_i[0],Mas_i[1],Mas_i[2],Mas_i[3],Mas_i[4],Mas_i[5]);
   return;                                      // Exit start()
  }
//--------------------------------------------------------------------

"

In definitiva non sto afferrando il concetto di inizializzazione degli array.

 

Capisci il concetto di array, vero? Una variabile con più indici?

L'inizializzazione non fa altro che impostare un valore di partenza per tutti gli indici.

Puoi impostare un valore per ogni indice separatamente come negli esempi che hai postato oppure,

se vuoi che il valore iniziale sia lo stesso per tutti gli indici puoi inserire il valore una volta sola come questo,

int myarray[100]={0};   //initializes all 100 indexes to value zero

oppure,

int myarray[100][5]={-1}; //multi dimensions, initializes all 500 indexes to -1.

Tieni anche presente che ci sono alcuni errori nel libro di mql4. Penso che nel secondo esempio quando dice,

"Nella sequenza inizializzata una o più costanti possono essere omesse. In tal caso i corrispondenti elementi dell'array di tipo numerico sono inizializzati da zero, gli elementi degli array di tipo stringa sono inizializzati dal valore stringa "" (virgolette senza spazio), cioè da una riga vuota (non deve essere confusa con uno spazio)."

e poi mostra questo esempio,

string Mas_s[4] = {"a","b", ,"d"};           // String array

probabilmente doveva essere così:

string Mas_s[4] = {"a","b","","d"};           // String array
dice anche da qualche parte nel libro "tutti gli array sono di tipo statico per default" che è anche un errore, sono come le altre variabili, non statiche a meno che non siano definite come statiche, tranne quando sono globali.
 
SDC:

Capisci il concetto di array, vero? Una variabile con più indici?

L'inizializzazione non fa altro che impostare un valore di partenza per tutti gli indici.

Se vuoi che il valore di partenza sia lo stesso per tutti gli indici puoi inserire il valore una volta sola come questa

int myarray[100] {0} //inizializza tutti i 100 indici al valore zero.


A destra

Sono ancora un po' confuso.

Quindi se ho un array

Doppio myarray[100]

Ho dichiarato il tipo di array (doppio), il nome dell'array (myarray) e il numero di indici (100).

Il valore dell'array MyArray può essere assegnato usando Double myarray[100] = {1, 2, 3, ....}, in modo che myarray[1]=1 e myarray[2]=2 ect.

Finora ho costruito gli array solo allo scopo di afferrare i valori dai loop e anche allora l'array è stato usato in modo molto lasco.

Grazie, indicando questo errore hai chiarito una piccola domanda che avevo.

 

Il primo indice dell'array è zero, quindi se fate

double myarray[100] = {1,2,3 .....};

che farà, myarray[0] == 1, myarray[1] ==2 ecc

 

Ah giusto, ok.

Quindi cosa succede se ho un array multidimensionale

Double Myarray[3][4] = {0.1,0.2,0.3,0.4,0.5} (scusate, ho notato che prima ho usato dei numeri interi)

Come posso chiamare un valore?

 

lo chiami come myarray[index,index]; o myarray[index][index]; fa la stessa cosa.

val = myarray[2,2]; //ottene il valore dall'indice dell'array 2,2 lo mette in val.

Print(myarray[2,2]); //lo stampa

Alert(myarray[2][2]); //lo avvisa

 

Quale sarebbe il valore?

Doppio Myarray[3][4] = {0.1,0.2,0.3,0.4,0.5}

Myarray[1][3]=?

 
zero perché non gli hai assegnato nulla
 

hai una matrice 3 x 4

doppio Myarray[3][4] = {0.1,0.2,0.3,0.4,0.5} ;

si riempirebbe in questo modo

Myarray[0,0] = 0,1;

Myarray[0,1] = 0,2;

Myarray[0,2] = 0,3;

Myarray[0,3] = 0,4;

Myarray[1,0] = 0,5;

Myarray[1,1] = 0,0;

Myarray[1,2] = 0,0;

ecc

 
Come fa l'array[0,0] ad avere un valore che è stato dichiarato per Myarray[3][4]?
 

Sono senza indizi in questo momento...

Myarray[3][4] non è multidimensionale, se è così perché posso chiamare i valori solo cambiando il valore di una delle dimensioni?