Allocation dynamique tableau 2D : erreur de seg

noname001 Messages postés 21 Date d'inscription dimanche 15 novembre 2009 Statut Membre Dernière intervention 1 mai 2010 - 13 mars 2010 à 15:03
noname001 Messages postés 21 Date d'inscription dimanche 15 novembre 2009 Statut Membre Dernière intervention 1 mai 2010 - 17 mars 2010 à 13:19
Bonjour à tous,

j'aimerais faire appel à vos lumières concernant deux codes. Ils ont tous les deux pour but de créer un tableau 2D dynamiquement et d'ensuite l'initialiser avec des caractères vides ( ' ').

Voici le premier, qui lui fonctionne :
#include 
using namespace std;

void intialisation(char **tableau)
{	
// ON REMPLIT LE TABLEAU DE CASE VIDE
for (int i=0; i<5 ; i++)
{
for(int j=0; j<5; j++)
{
tableau[i][j] = ' ';
}
}

}


int main()
{	

char **tab;

// CREATION TABLEAU DYNAMIQUEMENT
tab = new char*[5];
for (int i=0; i<5 ; i++)
{
tab[i] = new char[5];
}

intialisation(tab);

return 0;
}


Et ensuite, le deuxième où la création dynamique du tableau a été placé dans la fonction création. Mais ce programme me donne une erreur de segmentation.
#include 
using namespace std;

void intialisation(char **tableau)
{	
// ON REMPLIT LE TABLEAU DE CASE VIDE
for (int i=0; i<5 ; i++)
{
for(int j=0; j<5; j++)
{
tableau[i][j] = ' ';
}
}

}

void creation(char **tableau)
{
// CREATION TABLEAU DYNAMIQUEMENT
tableau = new char*[5];
for (int i=0; i<5 ; i++)
{
tableau[i] = new char[5];
}

}



int main()
{	

char **tab;

creation(tab);
intialisation(tab);

return 0;
}


Quelle est l'erreur du deuxième code ? Pourquoi le fait d'avoir placé la création du tableau dans une fonction à part fait-il foirer le programme (erreur de seg) ?

Merci pour votre aide!

2 réponses

cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 124
17 mars 2010 à 11:10
Si tu es en C++, mieux vaut utiliser un std::vector<std::string> > qu'un char**.
Evite aussi les "using namespace" (voir http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace

Pour répondre à ta question, c'est tout simplement que tab est remplit localement dans la fonction creation. Donc tu perds son accès en dehors de la fonction. Il te faut retourner l'adresse de ce que tu as fait:

char** creation()
{
// CREATION TABLEAU DYNAMIQUEMENT
char** tableau = new char*[5];
for (int i=0; i<5 ; i++)
{
tableau[i] = new char[5];
}
        return tableau;
}



int main()
{	

char **tab;

tab = creation();
intialisation(tab);

return 0;
}



_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
0
noname001 Messages postés 21 Date d'inscription dimanche 15 novembre 2009 Statut Membre Dernière intervention 1 mai 2010
17 mars 2010 à 13:19
Juste, je n'y avait pas pensé
0