Passare array multidimensionale a libreria per referenza

Ciao a tutti,
vorrei scrivere una libreria che dovrebbe processare un array 2d passato per referenza attraverso diverse funzioni

Qualcosa del tipo

#include "LIBENGINE.h"
int mm[][2]={{1,2}, {3,4}};

LIBENGINE le(mm);

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.println(mm[1][1]); //scrive 4
  le.raddoppia();
  Serial.println(mm[1][1]); //scrive 8
  le.togli2();
  Serial.println(mm[1][1]); //scrive 6
}

Il problema e' che non so come passare la matrice per referenza. Come puo' funzionare una libreria fatta di massima cosi'?

#include "LIBENGINE.h"
int xx[2][2];

LIBENGINE::LIBENGINE(int _xx[][2]  ) {
// NB: SOSTITUIRE CON QUALCOSA CHE FUNZIONA!!!
  int *xx=_xx;    
}

void LIBENGINE::raddoppia() {
  xx[1][1]=xx[1][1]*2;
}


void LIBENGINE::togli2() {
  xx[1][1]=xx[1][1]-2;
}

e' l'assegnazione tra xx e _xx che non riesco a risolvere

Grazie!

Max

Perchè questa non ha senso:

LIBENGINE::LIBENGINE(int _xx[][2]  ) {
  int *xx=_xx;    
}
  1. O lavori con i puntatori oppure lavori con gli indici (le quadre)
  2. come puoi assegnare una _xx che è una matrice ??
    Non puoi assegnare TUTTA una matrice (array) con un solo assegnamento in C.

Infatti se funzionava non avrei postato il quesito. Qual'e' quindi la giusta assegnazione passando una matrice per referenza, sempre che sia possibile farlo?

Max

Ciao, secondo me dovresti pensare a due tipi di soluzione!
Se proprio vuoi passare per referenza, dovresti usare un puntatore a puntatore int **matrice, allocarlo dinamicamente "trovi esempi online, allocare matrice dinamicamente", e poi puoi passare il puntatore alla libreria e assegnarlo a un puntatore locale, int **p=matrice.

Secondo modo se non vuoi allocare dinamicamente, è passare la matrice alla libreria, nel costruttore tramite ciclo for, copi tutti gli elementi in una matrice dichiarata nella libreria, ma in questo caso avresti una copia.

la copia dell'array e' da scartare perche' le funzioni della libreria devono elaborare i dati della matrice che serviranno al modulo principale, senza calcolare che le matrici saranno 1276 e 325, quindi la copia sarebbe comunque troppo onerosa.
Provero' a vedere se la ricerca da te suggerita potra' aiutarmi perche' il mio problema non e' tanto passare una matrice quanto avere una matrice visibile all'interno della libreria che punti alla matrice passata.

Intanto grazie

Max

maxscorda:
Infatti se funzionava non avrei postato il quesito. Qual'e' quindi la giusta assegnazione passando una matrice per referenza, sempre che sia possibile farlo?

Max

Non ti do soluzioni perché dalla prima domanda che fai non si capisce se vuoi copiare tutta una matrice in un colpo o lavorare per referenza ma lavorando su un singolo elemento.
Ripeto, non si può copiare una matrice/vettore in un colpo solo, devi fare un ciclo elemento per elemento
oppure usare una memcpy() (occhio però lavora a byte)

Una matrice/vettore viene sempre passato per referenza, MAI per copia (si può forzare con un trucco)

int mm[][2]={{1,2}, {3,4}, {5,6}};

void miaFunz1(int p_matr[][2], byte nrows, byte ncols)  
{ Serial.println("\nmiaFunz1");
  for(int x=0;x<nrows;x++)
  {
    for(int y=0;y<ncols;y++)
    { Serial.print(x);Serial.print(',');Serial.print(y);Serial.print('=');
      Serial.println(p_matr[x][y]);
    }
  }
}

void miaFunz2(int *p_matr, byte nrows, byte ncols)  
{ Serial.println("\nmiaFunz2");
  for(int x=0;x<nrows;x++)
  { 
    for(int y=0;y<ncols;y++)
    { Serial.print(x);Serial.print(',');Serial.print(y);Serial.print('=');
      Serial.println(*(p_matr+x*ncols+y));
    }
  }
}
void miaFunz3(int *p_matr, byte nrows, byte ncols)  
{ int temp[3][2];
  memcpy(temp,p_matr,nrows*ncols*sizeof(int));
  Serial.println("\nmiaFunz3");
  for(int x=0;x<nrows;x++)
  { 
    for(int y=0;y<ncols;y++)
    { Serial.print(x);Serial.print(',');Serial.print(y);Serial.print('=');
      Serial.println(temp[x][y]);
    }
  }
}

void setup() 
{ Serial.begin(9600);
  miaFunz1(mm,3,2);       // passiamo le dimensioni righe e colonne
  miaFunz2((int*)mm,3,2); // passiamo le dimensioni righe e colonne
  miaFunz3((int*)mm,3,2);
}

void loop() {}