Passage d'n tableau à une fonction

Bonjour.

J’aimerais passer un tableau en argument à une fonction.

//Déclarations
int const NComposants = 10;
int const NElements = 10;
byte tComposants[NComposants];
byte tElements [NComposants][NElements];
// ma fonction
int InitTable(byte tTable [][])
{
  for (int i = 0; i < NComposants;i++)
  {
    for (int j = 0; j < NElements; j++)
    {
      tTable[i][j] = 0;
    }
  }

  return 0;
}

J’obtiens ce message à la compilation :

TCP_Server_V2:39: error: declaration of ‘tTable’ as multidimensional array must have bounds for all dimensions except the first
TCP_Server_V2:667: error: declaration of ‘tTable’ as multidimensional array must have bounds for all dimensions except the first
TCP_Server_V2.ino: In function ‘int InitTable()’:
TCP_Server_V2:673: error: ‘tTable’ was not declared in this scope

Si je déclare ma fonction comme ceci:

int InitTable(byte tTable [10][10])
{
  for (int i = 0; i < NComposants;i++)
  {
    for (int j = 0; j < NElements; j++)
    {
      tTable[i][j] = 0;
    }
  }

  return 0;
}

Ca passe. Mais je ne trouve pas très joli et encore moins souple. Si par exemple je veux ajouter un élément…

Y a-t-il une meilleure solution ?

Merci d’avance.

Sébastien

Salut,

Passes un pointeur vers ce tableau tout simplement :

// ma fonction
int InitTable(byte * tTable [][])
{
    //....
}

Tu peux même par sécurité passer aussi en argument la dimension de ton tableau si elle est variable :

// ma fonction
int InitTable(byte * tTable [][], byte largeur1, byte largeur2)
{
    //....
}

Salut.

Merci, mais cela ne va pas mieux -> mêmes messages d'erreur.

Je cherche encore.

A+

Maîtrises tu les pointeurs en C ? Ton problème ne viendrait-il pas de là plutôt ?

Pas très gentil ta réponse.....

Ce que je dis (je l'écris d'ailleurs....)

C'est que j'ai une erreur de compilation et si, humblement, je prend ton exemple (avec pointeur)... j'ai la même erreur de compilation.

Tu as essayé ?

Salut,

De mémoire tu ne peux pas passer un tableau à deux dimensions inconnue, il faut en préciser au moins une.

int InitTable(byte * tTable [][10])
{
    //....
}

Devrait compiler

Si toutes les dimensions sont variables, il faut passer un pointeur de pointeur comme argument à la fonction

int InitTable(byte **tTable)

et appeler la fonction ainsi

InitTable((byte **)tElements);

Mais ce n’est pas très propre comme manière de faire. En plus cela veut dire que tu dois gérer le pointeur toi même car à l’intérieur de la fonction la taille du tableau est inconnue.

En fait les dimensions du tableau sont connues à la compilation puisqu’elles sont définies en constantes. Donc pourquoi ne pas utiliser ces constantes dans la déclaration de la fonction.
Par contre il faut utiliser un #define à la place des constantes car la “cuisine” faite par l’IDE avant compilation entraîne des erreurs de compilation.

//Déclarations
#define NComposants 10
#define NElements 10
byte tComposants[NComposants];
byte tElements [NComposants][NElements];

int InitTable(byte tTable [NComposants][NElements])
{
  for (int i = 0; i < NComposants;i++)
  {
    for (int j = 0; j < NElements; j++)
    {
      tTable[i][j] = 0;
    }
  }

  return 0;
}
void setup(void){
  InitTable(tElements);
}

void loop(void){}

schrist:
Pas très gentil ta réponse.....

Ce que je dis (je l'écris d'ailleurs....)

C'est que j'ai une erreur de compilation et si, humblement, je prend ton exemple (avec pointeur)... j'ai la même erreur de compilation.

Tu as essayé ?

Ma réponse n'avait pas vocation a être moqueuse ou vexante, rassure toi ! J'ai maladroitement demandé si tu maîtrisais les pointeurs en C afin d'orienter la réponse...

Merci à tous,
je vais tester après Noël !

Pour Iliak :rassure-toi, J'ai le goût de la plaisanterie et je ne suis pas vexé du tout. Je comprends le sens de ta demande.

Donc, j'en profite pour te souhaiter un joyeux Noël, ainsi qu'à tous les autres.

Re-Bonjour.

Bonne et heureuse année.

Le code ci-dessous fonctionne super bien

int InitTable (byte  tTable [NComposants][NElements])
{
  for (int i = 0; i < NComposants;i++)
  {
    for (int j = 0; j < NElements; j++)
    {
      tTable[i][j] = 0;
    }
  }

  return 0;
}

Merci fdufnews