Probleme passage tab** de fonctions a fonction.

Nitrakz Messages postés 60 Date d'inscription dimanche 8 novembre 2009 Statut Membre Dernière intervention 19 octobre 2010 - 12 nov. 2009 à 16:22
Nitrakz Messages postés 60 Date d'inscription dimanche 8 novembre 2009 Statut Membre Dernière intervention 19 octobre 2010 - 13 nov. 2009 à 14:04
Bonjour tous le monde !

Comme l'explique le titre j'ai un petit soucis pour passer un tableaux a 2 dimensions tab[i][j] d'une fonction a une autre.

int func_1
{
int tab[4][4];

tab[0][0] = 4;
func_2(tab);
}

int func_2(int **tab)
{
putchar(tab[0][0]);
}

j'ai un segmentation fault lors de l'affichage tu tab[0][0].

merci pour vos reponses.
There is no place like 127.0.0.1 /

14 réponses

nickydaquick Messages postés 416 Date d'inscription vendredi 31 janvier 2003 Statut Membre Dernière intervention 19 décembre 2013 3
12 nov. 2009 à 16:37
Salut,

un tableau a 2 index est UN pointeur sur une zone de memoire. La tu utilises un pointeur sur un pointeur d'une zone de memoire comme argument dans la 2eme fonction (que tu devrais declarer plus haut), alors que tu lui passes tab , un tableau a 2 index.

Solution:
int func_2(int *tab)
{
    putchar(tab[0]);
//calcul d'index a faire tab[a][b] = tab[a*dimensionIndex1+b]
}

int func_1()
{
    int tab[4][4];
    tab[0][0] = 4;
    func_2((int*)tab);
}


Bonne continuation.

http://liveplayaz.com
je suis heureux de faire partie d'une grande famille ...!
Nitrakz Messages postés 60 Date d'inscription dimanche 8 novembre 2009 Statut Membre Dernière intervention 19 octobre 2010
12 nov. 2009 à 16:58
Donc si j'ai bien compris:

tab[2][3] = tab[2*(4*4) + 3] ?

There is no place like 127.0.0.1 /
Nitrakz Messages postés 60 Date d'inscription dimanche 8 novembre 2009 Statut Membre Dernière intervention 19 octobre 2010
12 nov. 2009 à 18:05
J'ai essayer avec ta technique, enfin comme je pensait l'avoir compris mais sans succès toujours cette saleté de segfault.


There is no place like 127.0.0.1 /
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 nov. 2009 à 18:35
Formule générale:
p[L * NCLS + C] == T[L][C]

int tab[2][3];
int *p = (int*) tab;

donc:
tab[1][2] = p[1 * 3 + 2]

ciao...
BruNews, MVP VC++

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Nitrakz Messages postés 60 Date d'inscription dimanche 8 novembre 2009 Statut Membre Dernière intervention 19 octobre 2010
12 nov. 2009 à 19:12
yes okay good, je devrait m'en sortir avec ca :)

There is no place like 127.0.0.1 /
cptpingu Messages postés 3839 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 29 juin 2024 124
12 nov. 2009 à 19:30
Si tu veux vraiment passer un tableaux à deux dimension, il te faut passer les dimensions en argument:

int display_tab(int **tab, int width, int height)
{
   int i = 0;
   int j = 0;

   for (i = 0; i < width; ++i)
     for (j = 0; j < height; ++j)
       printf("tab[%i][%i] = %i\n", i, j, tab[i][j]);
}

int main()
{
  int i = 0;
  int** tab = NULL;
  int width = 4;
  int height = 3;

  tab = malloc(width * sizeof (int*));
  for (i = 0; i < width; ++i)
  {
    tab[i] = malloc(height * sizeof (int));
    for (j = 0; j < width; ++j)
      tab[i][j] = i + j;
  }
  display_tab(tab, width, height);
}


A noter que int* et int[] peuvent être manier de la même façon, mais pas int** et int[][], d'où ton segmentation fault.

Une autre solution pour ne pas avoir à passer les dimensions, est d'encapsuler celles-ci dans une structure, ou de terminer chacun des tableau par un marqueur (NULL par exemple).
Nitrakz Messages postés 60 Date d'inscription dimanche 8 novembre 2009 Statut Membre Dernière intervention 19 octobre 2010
12 nov. 2009 à 19:31
Hum c'est bizarre ca marche mais uniquement pour la premiere ligne du tableau, les autres n'ont pas l'air davoir ete transmise.
*mod searcher*
There is no place like 127.0.0.1 /
Nitrakz Messages postés 60 Date d'inscription dimanche 8 novembre 2009 Statut Membre Dernière intervention 19 octobre 2010
12 nov. 2009 à 19:57
Tu pense que sa viens du fait que je declare le tableaux en dur (tab[9][9])?

There is no place like 127.0.0.1 /
cptpingu Messages postés 3839 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 29 juin 2024 124
12 nov. 2009 à 23:42
"int** tab" est différent de "int tab[][]".
Donc tu ne peux pas passer un tableau en dur à la fonction "display_tab" que j'ai écrite.
kinju Messages postés 2 Date d'inscription mardi 1 janvier 2008 Statut Membre Dernière intervention 29 août 2013
13 nov. 2009 à 10:01
Si les tailles sont constantes, on peut faire ceci :

template
void fonction(int[I][J] tab)
{
for(int i = 0; i < I; i++)
{
// etc.
}
}

Si la taille du tableau n'est pas constante (calculée en amont), ça ne fonctionnera pas.
cptpingu Messages postés 3839 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 29 juin 2024 124
13 nov. 2009 à 10:08
C'est du C++, pas du C. Donc non, si tu es en C++, tu ne fais pas ça, tu utilises directement std::list ou std::vector.
De plus, même un template ne résoudra pas le fait que int** soit différent de int[][], et que donner les mauvaises dimensions fera planter le programme.
kinju Messages postés 2 Date d'inscription mardi 1 janvier 2008 Statut Membre Dernière intervention 29 août 2013
13 nov. 2009 à 10:16
Les dimensions ne sont pas à indiquer, elles sont déduites :

int tab[9][9];
fonction(tab); // implicitement fonction<9, 9>(tab)
cptpingu Messages postés 3839 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 29 juin 2024 124
13 nov. 2009 à 10:24
Les dimensions ne sont pas à indiquer, elles sont déduites :


Absolument pas. Les types sont déduits, pas les dimensions à partir d'un type.

Ex:

#include 

template
void fonction(int tab[I][J]) // c'est bien "int tab[I][J]", et non "int[I][J] tab"
{
  for(int i = 0; i < I; i++)
    for(int j = 0; j < J; j++)
      std::cout << tab[i][j] << std::endl;
}

int main()
{
  int tab[3][4] =
    {
      {1, 2, 3, 4},
      {10, 20, 30, 40},
      {100, 200, 300, 400},
    };

  fonction<3, 4>(tab); // OK
  fonction(tab); // Ne compile pas

  return 0;
}


Ligne de compilation standard:

g++ -W -Wall -Wabi -ansi test.cc -o test


Erreur retourné par g++


test.cc: In function ‘int main()’:
test.cc:21: erreur: no matching function for call to ‘fonction(int [3][4])’
Nitrakz Messages postés 60 Date d'inscription dimanche 8 novembre 2009 Statut Membre Dernière intervention 19 octobre 2010
13 nov. 2009 à 14:04
Impec j'ai réussi et je pense avoir compris niquel, merci pour l'aide !!!

There is no place like 127.0.0.1 /
Rejoignez-nous