Tableau à 2 dimension + fonction

Résolu
Signaler
Messages postés
2
Date d'inscription
dimanche 17 juin 2012
Statut
Membre
Dernière intervention
18 juin 2012
-
Messages postés
2
Date d'inscription
dimanche 17 juin 2012
Statut
Membre
Dernière intervention
18 juin 2012
-
Bonsoir,

Je débute en programmation, et je galère avec un simple tableau à 2 dimensions à envoyer dans une fonction pour le mettre à 0.

#include 

using namespace std;

void Clear(int *p)
{
    int i = 0;
    int j;
    for (i=0; i<8; i++)
    {
        j = 0;
        for (j=0; j<8; j++)
        {
            p[i][j] = 0;

        }
    }
}

void DrawScreen();

int main()
{
    cout << "PACMAN TEST" << endl;

    int positionX = 3;
    int positionY = 3;

    int tableau[8][8];

    Clear(tableau);

    while(1)
    {
        DrawScreen();
    }

    return 0;
}


l'erreur : |14|error: invalid types 'int[int]' for array subscript|

C'est sans doute une histoire de pointeur, mais je ne vois pas où est le problème.

Merci

4 réponses

Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
125
Bonjour.

Évite les "using namespace", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace

Ensuite, c'est normal. Un int* n'est pas un int[8][8] ! Ce n'est pas la même chose. On peut convertir un int[] en int*, mais on ne peut pas convertir un int[][] en int* ou int**. Il te faut soit utiliser un tableau à double dimension en int** ou alors spécifier que la fonction prend du int[8][8].

Ex:
#include 

void clear(int p[8][8])
{
    for (int i = 0; i < 8; ++i)
      for (int j = 0; j < 8; ++j)
        p[i][j] = 0;
}

void DrawScreen();

int main()
{
    std::cout << "PACMAN TEST" << std::endl;

    int tableau[8][8];
    clear(tableau);

    while(1)
      DrawScreen();
    return 0;
}


Néanmoins, je te conseil d'oublier les tableaux comme tu le fais et d'utiliser un std::vector ! Bien plus pratique et puissant à utiliser.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Si perfs requises (cas typique d'un jeu):
- On garde les tableaux.
- On vire les boucles imbriquées.
- Simple boucle s'inlinera impec.

inline void clear(int *p, DWORD n)
{
do {
p[n - 1] = 0;
} while(--n);
}

int tableau[8][8];
clear((int*) tableau, 8*8);

ciao...
BruNews, MVP VC++
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
24
Salut,

après la très bonne réponse de BruNews,
on pourrait aussi imaginer avoir des tableaux de différents types de numériques (short, float ect...)

Donc la même non typée et sans boucle :

inline void clear(void *p, DWORD nbElem, int sizeOfTypeElem) 
{ 
memset(p, 0, nbElem * sizeOfTypeElem);
} 


L'appel :

float tableau[8][8]; 
clear(tableau, 8*8, sizeof(float)); 


bye...
Messages postés
2
Date d'inscription
dimanche 17 juin 2012
Statut
Membre
Dernière intervention
18 juin 2012

Merci pour ces réponses !
Cependant yann_lo_san (cool, un autre Yann sur Terre !), je vais tenter de maitriser les bases avant de taper dans du memset, même si je crois comprendre.

Merci et bonne semaine