Probleme passage tab** de fonctions a fonction.

Signaler
Messages postés
60
Date d'inscription
dimanche 8 novembre 2009
Statut
Membre
Dernière intervention
19 octobre 2010
-
Messages postés
60
Date d'inscription
dimanche 8 novembre 2009
Statut
Membre
Dernière intervention
19 octobre 2010
-
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

Messages postés
416
Date d'inscription
vendredi 31 janvier 2003
Statut
Membre
Dernière intervention
19 décembre 2013
2
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 ...!
Messages postés
60
Date d'inscription
dimanche 8 novembre 2009
Statut
Membre
Dernière intervention
19 octobre 2010

Donc si j'ai bien compris:

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

There is no place like 127.0.0.1 /
Messages postés
60
Date d'inscription
dimanche 8 novembre 2009
Statut
Membre
Dernière intervention
19 octobre 2010

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 /
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
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++
Messages postés
60
Date d'inscription
dimanche 8 novembre 2009
Statut
Membre
Dernière intervention
19 octobre 2010

yes okay good, je devrait m'en sortir avec ca :)

There is no place like 127.0.0.1 /
Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
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).
Messages postés
60
Date d'inscription
dimanche 8 novembre 2009
Statut
Membre
Dernière intervention
19 octobre 2010

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 /
Messages postés
60
Date d'inscription
dimanche 8 novembre 2009
Statut
Membre
Dernière intervention
19 octobre 2010

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 /
Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
"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.
Messages postés
3
Date d'inscription
mardi 1 janvier 2008
Statut
Membre
Dernière intervention
29 août 2013

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.
Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
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.
Messages postés
3
Date d'inscription
mardi 1 janvier 2008
Statut
Membre
Dernière intervention
29 août 2013

Les dimensions ne sont pas à indiquer, elles sont déduites :

int tab[9][9];
fonction(tab); // implicitement fonction<9, 9>(tab)
Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
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])’
Messages postés
60
Date d'inscription
dimanche 8 novembre 2009
Statut
Membre
Dernière intervention
19 octobre 2010

Impec j'ai réussi et je pense avoir compris niquel, merci pour l'aide !!!

There is no place like 127.0.0.1 /