Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [C++] Matrice come argomento!

    Salve a tutti,
    in questi giorni mi sono ritrovato spiazzato dal fatto di non riuscire a passare ad una funzione una matrice come argomento. Ho provato a trattarla come un array monodimensionale:

    codice:
    void funz(int mat[][]) {
    	...
    }
    
    void main() {
    	int mat[4][4];
    
    	funz(mat);
    	...
    }
    E ho provato con un puntatore:

    codice:
    void funz(int *p) {
    	...
    }
    
    void main() {
    	int mat[4][4];
    	int *p = mat;
    
    	funz(p);
    	...
    }
    Ma niente.. come si fa?! Grazie Mille!!

  2. #2

    Re: [C++] Matrice come argomento!

    Originariamente inviato da Skywalker87
    Salve a tutti,
    in questi giorni mi sono ritrovato spiazzato dal fatto di non riuscire a passare ad una funzione una matrice come argomento. Ho provato a trattarla come un array monodimensionale:

    codice:
    void funz(int mat[][]) {
    	...
    }
    
    void main() {
    	int mat[4][4];
    
    	funz(mat);
    	...
    }
    E ho provato con un puntatore:

    codice:
    void funz(int *p) {
    	...
    }
    
    void main() {
    	int mat[4][4];
    	int *p = mat;
    
    	funz(p);
    	...
    }
    Ma niente.. come si fa?! Grazie Mille!!
    è sempre preferibile evitare l'uso di quelle ke tu kiami "matrici"
    in C / C++ quando definisci un array bidimensionale statico es. mat[4][4] crei un "vettore" di puntatori.. quindi mat è un puntatore a puntatore, motivo per cui quando assegni
    int* p = mat ... crei un casino

    una prima possibilità sarebbe definire l'argomento come puntatore a puntatore intero, ovvero:

    void funz(int** p)

    cmq in ogni modo in C / C++ non ti conviene usare gli array bidimensionali statici
    (per intenderci matrice[x][y])

    piuttosto ti conviene usare un vettore classico del tipo
    matrice[dim]

    dove dim rappresenta il prodotto x y (cioè il numero di righe per il numero delle colonne)
    puoi dunque immaginare di aver "tagliato" la matrice e di averla scomposta nelle sue colonne.. mi sono spiegato?

    quindi, se ad esempio hai una matrice 2x3 tipo:
    1 2 3
    4 5 6

    puoi memorizzarla come:
    1
    2
    3
    4
    5
    6

    e accedere in maniera intelligente al vettore creato.. :ignore: se non sono stato chiaro invia un altro post

    ciao!

  3. #3
    Chiarissimo grazie, comunque ho provato cosi' ma ancora niente:

    codice:
    void funz(int **p) {
    	cout << "\n I'm Here! \n";
    }
    
    void main() {
    	int mat[4][4];
    	int **p = mat;
    	
    	funz(p);
    }

  4. #4
    Originariamente inviato da Skywalker87
    Chiarissimo grazie, comunque ho provato cosi' ma ancora niente:

    codice:
    void funz(int **p) {
    	cout << "\n I'm Here! \n";
    }
    
    void main() {
    	int mat[4][4];
    	int **p = mat;
    	
    	funz(p);
    }
    scusa cosa dovrebbe fare il programma?
    in ogni caso evita l'uso di p nel main:

    void main() {
    int mat[4][4];

    funz(mat);
    }

    e lasci la funzione così come l'hai definita tu.. il prototipo ovviamente l'hai messo?! vero?

    ti dà errori in compilazione?

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2006
    Messaggi
    569
    Ciao,

    A parte le considerazioni personali su quale sia il codice migliore, il primo che hai mostrato è tecnicamente corretto. Che errore ti da? Perchè dici che non funziona?

    Ho scritto un esempio al volo e funziona perfettamente.

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    void funz( int mat[4][4] ) 
    {
         int i,j;
    	
        for (i=0;i<4;i++)
        {  for (j=0;j<4;j++)
                printf("%2d",mat[i][j]);
           printf("\n");  
           }
       
       return ;       
    }
    
    
    int main() 
    {
        int mat[4][4];
        int i,j;
         
        for (i=0;i<4;i++)          // carica la matrice
          for (j=0;j<4;j++)
            mat[i][j]=rand()%10;
          
        funz(mat);        // stampa la matrice
    	
        system("Pause");
        return 0;
    }

  6. #6
    Originariamente inviato da labrosan
    Ciao,

    A parte le considerazioni personali su quale sia il codice migliore, il primo che hai mostrato è tecnicamente corretto. Che errore ti da? Perchè dici che non funziona?

    Ho scritto un esempio al volo e funziona perfettamente.

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    void funz( int mat[4][4] ) 
    {
         int i,j;
    	
        for (i=0;i<4;i++)
        {  for (j=0;j<4;j++)
                printf("%2d",mat[i][j]);
           printf("\n");  
           }
       
       return ;       
    }
    
    
    int main() 
    {
        int mat[4][4];
        int i,j;
         
        for (i=0;i<4;i++)          // carica la matrice
          for (j=0;j<4;j++)
            mat[i][j]=rand()%10;
          
        funz(mat);        // stampa la matrice
    	
        system("Pause");
        return 0;
    }
    sono d'accordo con te.. la prima versione del codice ha un suo perkè ma..

    :master:
    .. ma la funzione la dikiari con:

    void funz( int mat[4][4] )
    {

    e non con

    void funz( int mat[][] )

    .. ??

    ciau!

  7. #7
    Originariamente inviato da katapano
    scusa cosa dovrebbe fare il programma?
    Che differenza fa?! Mi interessava capire perche' non riuscivo a passare una matrice (o meglio un array multidimensionale) come argomento ad una funzione.

    Il seguente codice viene ovviamente compilato correttamente:

    codice:
    #include <iostream>
    #include <cstdlib>
    using namespace std;
    
    void pause() { cout << "\n "; system("pause"); }
    
    void funz(int mat[4][4]) {
    	cout << "\n I'm Here! \n";
    }
    
    void main() {
    	int mat[4][4];
    
    	funz(mat);
    	pause();
    }
    Mentre non capivo perche' con un semplice array si potesse tralasciare la dimensione:

    codice:
    #include <iostream>
    #include <cstdlib>
    using namespace std;
    
    void pause() { cout << "\n "; system("pause"); }
    
    void funz(int array[]) {
    	cout << "\n I'm Here! \n";
    }
    
    void main() {
    	int array[4];
    
    	funz(array);
    	pause();
    }

  8. #8
    La differenza sostanziale è che con un array monodimensionale in fase di compilazione il compilatore riesce a gestire correttamente gli spostamenti lungo l'array sapendo solamente il tipo di dato della struttura, con gli array multidimensionali per calcolare la locazione di memoria necessita anche dei valori della profondità della dimensione aggiunta.

    Esempi:
    codice:
    void matrix3(int matrix[][3][4]){
    }
    
    int main(){
        int m[3][3][4] = {.......};
        matrix3(m);
        getchar();
        return 0;
    }
    codice:
    void matrix2(int matrix[][3]){
    }
    
    int main(){
        int m[3][3] = {.......};
        matrix2(m);
        getchar();
        return 0;
    }
    QUI la cosa viene spiegata un po' più dettagliatamente

  9. #9
    Grazie mille... ora e' tutto piu' chiaro!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.