Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di Mods
    Registrato dal
    Jun 2004
    Messaggi
    302

    [C]passaggio array bidimensionali

    Scusate ma per quanto banale non riesco a passare un array bidimensionale ad una funzione.
    ad esempio mettiamo che voglio una funzione che per stamparlo:

    codice:
    void stampa(int** v,int size1,int size2)
    {
       int i,j; 
       for(i=0;i<size1;i++)
           for(j=0;j<size2;j++)
               printf("%d",v[i][j]);
    }
    
    int main(int argc,char** argv)
    {
        int v[2][2]=
                     {
                            {1,2},{3,4}
                     };
        stampa(v,2,2);
        return 0;
    }
    così mi da errore in run-time di puntatore anche al primo giro appena faccio la printf.
    Se cambio il parametro formale in int* v[] o int v[][], mi dà errore dicendo qualcosa tipo che la dimensione potrebbe essere sconosciuta.

    Come posso fare?
    Ci sono 10 tipi di persone al mondo: quelli che conoscono il codice binario, e quelli che non lo conoscono!

  2. #2
    il codice corretto è così:
    codice:
    #include <stdio.h>
    
    void stampa(int v[][2],int size1,int size2)
    {
       int i,j; 
       for(i=0;i<size1;i++)
           for(j=0;j<size2;j++)
               printf("%d",v[i][j]);
    }
    
    int main(int argc,char** argv)
    {
        int v[2][2]=
                     {
                            {1,2},{3,4}
                     };
        stampa(v,2,2);
        return 0;
    }
    almeno credo sia così, per quanto mi riguarda.

    Non ho capito perchè nella dichiarazione della funzione:

    codice:
    void stampa(int** v,int size1,int size2)
    avevi usato il puntatore a puntatore, io mi sono sempre riferito alla matrice così: matrice[][MAX] ed ha sempre funzionato...

    spero di non sbagliarmi, anche se cmq il codice che ho postato sul mio pc funge...
    http://www.mangaitalia.net/

    questo è un cazzo metallizzato a quattro ruote e noi due siamo i coglioni che se lo portano dietro - da Bad Boys con Will Smith and Martin Lawrance di John Whoo

  3. #3
    Utente di HTML.it L'avatar di Mods
    Registrato dal
    Jun 2004
    Messaggi
    302
    ho usato il puntatore al puntatore perché l'array bidimensionale è un puntatore a puntatore, o almeno credo. Il ragionamento l'ho fatto siccome gli array sono puntatori.

    Grazie per la soluzione, ma volevo riuscirci che la dimensione possa essere indefinita, e che venga passata tramite parametro.
    Ci sono 10 tipi di persone al mondo: quelli che conoscono il codice binario, e quelli che non lo conoscono!

  4. #4
    ciao,
    secondo me, e mi potrei sbagliare, una matrice è semplicemente un vettore che ha due indici al posto di uno, quindi riferendoci alla matrice matrix[2][2] ci riferiamo ad un puntatore come si fa di solito con i vettori unidimensionali, almeno credo sia così, la cosa mi sembra interessante, e spero che qualcuno ci illumini a riguardo.

    per quanto riguarda la cosa della dimensione, beh la dimensione la devi cmq decidere a priori, forse però, se ho ben capito quello che vuoi fare, potresti usare un calloc per riallocare la matrice in maniera automatica...
    http://www.mangaitalia.net/

    questo è un cazzo metallizzato a quattro ruote e noi due siamo i coglioni che se lo portano dietro - da Bad Boys con Will Smith and Martin Lawrance di John Whoo

  5. #5
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Quando si dichaira un vettore bisogna specificare tutte le dimensioni tranne al più la prima, come dice esplicitmante il compilatore c++ se si prova a dichiarare v come v[][]:

    declaration of `v' as multidimensional array must have bounds
    for all dimensions except the first.

    Ciò dipende dal fatto che se v ha r righe e c colonne, per accedere all'elemento (i, j) il compilatore si calcola la posizione v[i][j] con l'operazione:

    (i - 1) * c + j

    cioè prima delle'elemento (i, j) ci sono tutti quelli delle prime (i-1) righe, onguna delle quali contine c colonne.

    per questo devono essere note tutte le dimensioni, tranne al più la prima, perche il compilatore accede agli elementi come se fossero disposti in un unico array lineare.

    Se tu dici alla funzione che v è un int**, il compilatore non saprebbe come accedere a v[i][j].

  6. #6
    In effetti io ricordo di aver scritto qualche programma c in cui passavo una matrice a dimensione due ad una funzione che prendeva come parametro un doppio puntatore però probabilmente il compilatore aveva qualche setting per supportare qualche standard del c che lo consente.
    Comunque sia se vuoi poter lavorare con matrici di dimensione variabile la strada è la solita allocazione dinamica:
    codice:
    int main(int argc,char** argv)
    {
       /*int v[2][2]=
                     {
                            {1,2},
                            {3,4}
                     };*/
       int i,j,k = 1;
       int **v=(int**)malloc(sizeof(int*)*2);
       for(i=0;i<2;i++)
       		v[i]=(int*)malloc(sizeof(int)*2);
       	
       	for(i = 0 ; i< 2; i++)
       		for(j = 0; j<2; j++)
       			v[i][j] = k++;
                     
        stampa(v,2,2);
        return 0;
    }
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  7. #7
    Utente di HTML.it L'avatar di Mods
    Registrato dal
    Jun 2004
    Messaggi
    302
    Ok, grazie dei chiarimenti. Pensavo che la matrice fosse un puntatore ad un array di puntatori a dato, come lo è tipo l'argv.

    Quindi se la dichiaro così devo per forza specificare almeno una dimensione, mentre se la dichiaro dinamicamente come nell'ultimo post posso usarla per la mia funzione.
    Ci sono 10 tipi di persone al mondo: quelli che conoscono il codice binario, e quelli che non lo conoscono!

  8. #8
    Si in C le cose stanno così,almeno quello che si studia a scuola poi può darsi che qualche estensione consenta anche di passare come doppio puntatore un array bidimensionale dichiarato staticamente come ti ho detto,ma questa è un'altra storia....
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

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.