Newsgroup: it.comp.lang.c
Titolo: Passare a funzione un vettore bidimensionale

aid me please,
problema: passaggio a funzione di un vettore bidimensionale,
sto studiando il C con il libro di Deitel&Deitel,
nella sezione dedicata ai puntatori c'è il codice (vedi sottostante "Card
dealing program") che solo il compilatore Borland "digerisce", mente con GCC
oppure con il Digital Marsil compiler mi restituisce errore:
ERRORI:
DMC versione8.38
   deal(deck, face, suit);
                        ^
es_7_12b.c(53) : Error: need explicit cast for function parameter 2 to get
from: char **
to  : char const **
--- errorlevel 1
GCC
passing `char **' as argument 2 of `deal(const int (*)[8], const char **,
const char **)' adds cv-quals without intervening `const'
passing `char **' as argument 3 of `deal(const int (*)[8], const char **,
const char **)' adds cv-quals without intervening `const'
grazie per l'aiuto.
ciao
/* Card dealing program */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void shuffle(int [][13]);
void deal(const int [][13], const char *[], const char *[]);
main()
{
   char *suit[4] = {"Hearts", "Diamonds", "Clubs", "Spades"};
   char *face[13] = {"Ace", "Deuce", "Three", "Four",
                     "Five", "Six", "Seven", "Eight",
                     "Nine", "Ten", "Jack", "Queen", "King"};
   int deck[4][13] = {0};
   srand(time(NULL));
   shuffle(deck);
   deal(deck, face, suit);
   return 0;
}
void shuffle(int wDeck[][13])
{
   int card, row, column;
   for(card = 1; card <= 52; card++) {
      row = rand() % 4;
      column = rand() % 13;
      while(wDeck[row][column] != 0) {
         row = rand() % 4;
         column = rand() % 13;
      }
      wDeck[row][column] = card;
   }
}
void deal(const int wDeck[][13], const char *wFace[],
          const char *wSuit[])
{
   int card, row, column;
   for (card = 1; card <= 52; card++)
      for (row = 0; row <= 3; row++)
         for (column = 0; column <= 12; column++)
            if (wDeck[row][column] == card)
               printf("%5s of %-8s%c",
                      wFace[column], wSuit[row],
                      card % 2 == 0 ? '\n' : '\t');
}

 char **, const char **)' adds cv-quals without intervening `const'
Se una funzione ha argomenti const devi passargli argomenti const e
suit e face non sono const. E vice versa: se la funzione accetta
parametri non const e gli passi parametri const... e magari cerchi
pure di cambiarli...
Sistemati quegli errori ne saltano fuori altri dello stesso tipo... ma
ormai la traccia ce l'hai.
*Leggere* gli errori che restituisce il compilatore aiuta: non sono
dei pernacchi alla tua capacità di programmare... servono.

 }
L'altra alternativa e` quella di eliminare i vari const dall'elenco dei 
parametri di deal. Anche questo e` brutto, poiche` in questo modo si 
permette alla funzione di modificarli (cosa delle quale non ha bisogno). 
Questo piu` che altro e` un discorso di software engineering.

 Questo piu` che altro e` un discorso di software engineering.
Dimenticavo ovviamente la soluzione piu` semplice a (parte del) 
problema: cambiare le dichiarazioni in questo modo:
     const char *suit[4] = {"Hearts", "Diamonds", "Clubs", "Spades"};
     const char *face[13] = {"Ace", "Deuce", "Three", "Four",
                             "Five", "Six", "Seven", "Eight",
                             "Nine", "Ten", "Jack", "Queen", "King"};
ti permette di evitare i cast sul secondo e terzo argomento di deal. 
Tanto suit e face non devono mai essere modificati.
Purtroppo per quanto riguarda il primo argomento, il cast oppure 
l'eliminazione del const rimangono necessari.

 ha scritto nel messaggio
news:4026BD92...@lombardiacom.it...
