Tableau à 2 dimension + fonction

Résolu
cs_GrosKiff1994 Messages postés 2 Date d'inscription dimanche 17 juin 2012 Statut Membre Dernière intervention 18 juin 2012 - 17 juin 2012 à 18:42
cs_GrosKiff1994 Messages postés 2 Date d'inscription dimanche 17 juin 2012 Statut Membre Dernière intervention 18 juin 2012 - 18 juin 2012 à 15:51
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

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
18 juin 2012 à 10:21
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
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 juin 2012 à 12:00
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++
3
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
18 juin 2012 à 13:13
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...
0
cs_GrosKiff1994 Messages postés 2 Date d'inscription dimanche 17 juin 2012 Statut Membre Dernière intervention 18 juin 2012
18 juin 2012 à 15:51
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
0
Rejoignez-nous