2009-05-08 12 views
1

J'ai la fonction suivanteAvertissement en passant tableau 2d

void initBoard(int * board[BOARD_ROWS][BOARD_COLS]){ 
    int z = 0; 
    for(z = 0; z<10; z+=1){ 
    int l; 
    for(l = 0; l<10; l+=1){ 
     board[z][l] = 0; 
    } 
    } 
} 

et du principal je l'appelle comme

int plBoard[10][10]; 
    initBoard(&pcBoard); 

lors de la compilation cela fonctionne, mais je reçois un avertissement disant: avertissement: passage d 'arguments 1 de 'initBoard' du type pointeur incompatible. array est un entier et et la fonction attend un pointeur int je passe l'adresse de int. Qu'est-ce qui va pas avec ça?

Répondre

12

A part la faute de frappe évidente dans votre question (la définition de plBoard mais l'utilisation de pcBoard), vous ne besoin de passer des tableaux avec l'opérateur address-of (&), car ils sont automatiquement convertis en adresses.

Mais votre problème incompatible type est causée par l'utilisation de:

int * board[BOARD_COLS][BOARD_ROWS] 

qui est en fait un tableau 2D de intpointeurs (techniquement un tableau de tableau de pointeur vers int), pas des entiers comme prévu .

Vous devez utiliser:

void initBoard(int board[BOARD_COLS][BOARD_ROWS]) { // <-- remove "*" 
: : : 
} 
int plBoard[10][10]; 
initBoard(plBoard);         // <-- remove "&" 
1

Je ne suis pas tout à fait sûr, mais je crois que c'est parce que:

initBoard attend un tableau de tableau de pointeur en entier s.

Cependant, plBoard est un pointeur à un tableau de tableau de entier s

+0

alors quelle serait la signature correcte pour la fonction? –

+0

Pax l'a, me semble-t-il. – Smashery

+0

J'aime faire comme ceci: void initBoard (int board [/ * BOARD_ROWS * /] [BOARD_COLS]); pour éviter la confusion. Montrer la taille que l'on attend, mais aussi montrer qu'on ne peut pas utiliser sizeof dessus (puisque c'est vraiment un pointeur au lieu d'un tableau, dans la liste des paramètres.) –

0

Techniquement, vous envoyez l'adresse mémoire d'un pointeur dans initBoard(). Lorsque vous déclarez un tableau (dans ce cas plBoard), il pointe vers une adresse mémoire où la mémoire contiguë contient vos éléments de données ... il est donc inutile de le dire ...

int plBoard[10][10]; initBoard(&pcBoard); 

Pax a votre réponse, Je venais de clarifier parce que vous ne l'avez pas encore marqué comme la réponse.

0

Juste pour être sur la même page .. Je suis totalement d'accord avec Pax ..

Blockquote int PCBoard [10] [10]; Blockquote initBoard (& pcBoard);

Supposons maintenant PCBoard [0] [0] des points à l'emplacement 101ème (adresse 32 bits) et ainsi de suite et ainsi de suite .. Ce que vous passez par ce qui signifie & PCBoard est l'adresse 32 bits de PCBoard [0] [0]. Ainsi, lorsque la fonction

vide initBoard Blockquote (int * Conseil [BOARD_ROWS] [BOARD_COLS]) {

l'utilise ..il affiche une erreur indiquant qu'il attend un tableau bidimensionnel alors que ce qu'il obtient dans une adresse 32 bits est de 4 octets (int). Juste un indice, vous n'avez pas besoin de spécifier les deux cartes [BOARD_ROWS] [BOARD_COLS] quand vous passez. Vous pouvez facilement éliminer BOARD_ROWS et simplement spécifier BOARD_COLS.