Array bidimensionale come parametro di una funzione

di il
9 risposte

Array bidimensionale come parametro di una funzione

Salve a tutti

sto cercando di implementare una classe di matrici

per prima cosa voglio scrivere una funzione che assegna ad un oggetto matrice un array bidimensionale dichiarato nel main

il codice è il seguente
#include<iostream>
#include<iomanip>

using namespace std;

class Double2Array{

public:
Double2Array(int=10, int=10);
Double2Array(const Double2Array &); //costruttori
~Double2Array(); //distruttore
void print();
void assegna(int,int,double);

private:
int row, col;
double **p;

};

//costruttore - inizializza array
Double2Array::Double2Array(int rows, int cols){

row=rows;
col=cols;

p = new double*[row]; 
for (int i=0;i<row;i++){
  p[i] = new double[col];
  for (int j=0;j<col;j++)
    p[i][j]=0.;
  }
   
}


//costruttore copia 
Double2Array::Double2Array(const Double2Array &x) : row(x.row),col(x.col)
{
p = new double*[row]; 
for (int i=0;i<row;i++){
  p[i] = new double[col];
  for (int j=0;j<col;j++)
    p[i][j]=x.p[i][j];
  }
   
}



//distruttore
Double2Array::~Double2Array(){

for (int j=0;j<col;j++)
  delete[]p[j];
  delete []p;


}

//print
void Double2Array::print(){
for (int i=0;i<row;i++)
  {
  for (int j=0;j<col;j++){
    cout << setw(6) << setiosflags(ios::fixed | ios::showpoint) << setprecision(2) << p[i][j];
                          }
    cout << endl;
  }

}

//funzione assegnamento
void Double2Array::assegna(int ii, int jj, double valore){
    p[ii][jj]=valore; 
}



int main(){

const int a=2,b=3;

double xx[a][b]={{1,3,5.2},{3.5,6.,0.1}};
Double2Array A(a,b);

for (int i=0;i<a;i++)
 for (int j=0;j<b;j++)
   A.assegna(i,j,xx[i][j]);

A.print();


return 0;}
in poche parole vorrei raggruppare queste righe di codice in una funzione che ha come
parametro l'array inizializzato da me (in questo caso xx)
for (int i=0;i<a;i++)
 for (int j=0;j<b;j++)
   A.assegna(i,j,xx[i][j]);
il problema è che passare array con 2 o più dimensioni è più complicato del previsto, per via della seconda dimensione dell'array che è difficile passare come parametro.
ho provato ad implementare una funzione del tipo

funzione (int dim1, int dim2, double y[dim1][dim2])

ma ottengo vari errori di compilazione (sia che la funzioene sia di classe o friend)

c'è un modo per risolvere il problema?

grazie

9 Risposte

  • Re: Array bidimensionale come parametro di una funzione

    Ti suggerisco di utilizzare un semplice puntatore
    double *p;
    anzichè un puntatore a puntatore
    double **p;
    I pro sono:
    - sono più semplici da gestire le allocazioni e deallocazioni (avrai una sola allocazione)
    - più semplice passare la matrice ad una funzione
    il contro è
    - non più utilizzare una costrutto del tipo p[j] ma dovrai sostituire con qualcosa del tipo p[i+j*LARGHEZZA] o simile
  • Re: Array bidimensionale come parametro di una funzione

    Ok provo ad usare il tuo suggerimento
  • Re: Array bidimensionale come parametro di una funzione

    Mi rendo conto che il c++ è piuttosto limitato da questo punto di vista

    il tuo suggerimento mi sembra buono, però resta il fatto che devo usare una funzione che
    converte il mio array[dim1][dim2] in un array[dim1*dim2] e che comunque deve prendere
    come parametro l'array [dim1][dim2] e sarei punto a capo.

    ho bisogno di usare i 2 indici quando, per esempio, leggo la matrice da un file. altrimeni
    sarebbe più difficile usare un solo indice
  • Re: Array bidimensionale come parametro di una funzione

    ho bisogno di usare i 2 indici quando, per esempio, leggo la matrice da un file. altrimeni
    sarebbe più difficile usare un solo indice
    Non credo che utilizzare un solo indice sia più difficile, eventualmente posta il codice.

    Nella tua classe tu vuoi avere righe e colonne in numero variabile; per usare un arrray bidimensionale dovresti avere almeno il numero di colonne fisso altrimenti il compilatore non sa come spostarsi fra le righe.
    Per questo ti ho suggerito di fare tu questo lavoro, definendo l'area di memoria e ricalcolandoti le posizioni all'interno della matrice. Non è difficile.

    Quello che avevi implementato tu non è un array bidimensionale ma un vettore di puntatori a vettori; sembra un array bidimensionale, ma non lo è.
  • Re: Array bidimensionale come parametro di una funzione

    Credo che alla fine farò come hai suggerito.

    La mia obiezione sul c++ è dovuta al fatto che pur istanziando un array del tipo
    
    const int a=2,b=3;
    double xx[a][b]={{1,3,5.2},{3.5,6.,0.1}};
    
    comunque il compilatore non sa quali sono le dimensioni dell'array. a me sembra una limitazione,
    ma è un parere personale

    grazie per le risposte!
  • Re: Array bidimensionale come parametro di una funzione

    Non c'è nessuna limitazione
    Scrivere
    const int a=2,b=3;
    double xx[a][b]={{1,3,5.2},{3.5,6.,0.1}};
    è diverso da scrivere
    double xx[2][3]={{1,3,5.2},{3.5,6.,0.1}};
    nel primo caso hai una matrice allocata dinamicamente (anche se non ti sembra) mentre nel secondo hai una matrice con dimensione nota al compilatore che puoi quindi passare ad una funzione.
  • Re: Array bidimensionale come parametro di una funzione

    Candaluar, hai preso uno svarione

    I due modi di scrivere sono esattamente equivalenti, ed implementati esattamente nello stesso modo.

    In entrambi i casi il vettore e' allocato staticamente nello stack o nell'area dei dati statici (se mi ricorsdo ancora, il segmento BSS del binario).

    Infatti, se non usi la keyword const per a e b, il compilatore si incavola alquanto.

    I dati vengono allocati dinamicamente solo se si usa la keyword new. In questo caso vengono allocati nello heap.
  • Re: Array bidimensionale come parametro di una funzione

    Chiedo perdono mi è sfuggito il const!!!
  • Re: Array bidimensionale come parametro di una funzione

    Con un po di salti mortali sono riuscito a fare quello che volevo

    ho scritto questa funzione per ricavare direttamente la matrice da un file
    
    void get_matrix_from_file(char *nomefile, int n_rows, int n_cols, double **&pointer){
    cout << "lettura di = " << nomefile << endl;
    ifstream f(nomefile);
    int q;
    
    if(!f)
      cout << "il file non esiste" << endl;
    else
     {
     pointer = new double*[n_rows]; //allocazione delle righe
     for (int i=0;i<n_rows;i++){
      f >> q; //lettura prima cifra intera che non serve
      pointer[i] = new double[n_cols]; //allocazione colonne per ogni riga
      for (int j=0;j<n_cols;j++)
        f >> pointer[i][j];   //lettura delle righe
        
      }
     }
    
    f.close(); //chiusura file
    }
    
    dopo nel main ho questa scrittura compatta
    
    int main(){
    
    double **ptr;
    int a=3,b=3;
    get_matrix_from_file("piccola_mat.txt",a,b,ptr);
    
    Double2Array A(a,b);
    A.assegna2(a,b,ptr);
    A.print();
    
    
    return 0;}
    
    e riesco ad istanziare l'oggetto matrice correttamente.
    l'unica "lamentela" del compilatore è riguardo al nome file che passo come
    parametro alla funzione, infatti viene visualizzato il messaggio di "warning"

    "warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]"

    ma comunque il parametro viene passato correttamente alla funzione senza compromettere
    il funzionamento del programma
Devi accedere o registrarti per scrivere nel forum
9 risposte