Problème tableau C++

Résolu/Fermé
Lynyrd81 Messages postés 59 Date d'inscription vendredi 3 octobre 2008 Statut Membre Dernière intervention 24 avril 2011 - 8 nov. 2009 à 23:11
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 - 9 nov. 2009 à 21:35
Bonjour,
Je vais essayer d'être le plus precis possible:
J'ai eu un souci dans un programme, et je sais à peu près pourquoi, j'ai donc créé un programme beaucoup plus court et plus simple qui a le même souci, le voilà:

using namespace std;

class Test
{
	public:
		Test(int tab[]);
	private:
		int * tab;
};

Test::Test(int tab[])
{
	for(int i=0; i<3; i++) {this->tab[i] = tab[i];};
}

int main()
{
	int tab1[4] = {0,1,2,3};
	Test Obj = Test(tab1);
	return 0;
}


Ce programme est vraiment basique: la classe Test est en fait un tableau d'entiers.
Le souci c'est qu'il me met "erreur de segmentation" à l'execution.

Je sais d'où vient l'erreur: de la ligne
	for(int i=0; i<3; i++) {this->tab[i] = tab[i];};


J'aurais pu mettre à la place
this->tab = tab;
, ce qui fonctionne, mais dans ce cas le tab de l'objet et celui de main pointent vers le même tableau, ce qui fait que si je modifie le tab de main, celui de l'objet est modifié aussi, ce que je ne veux pas, vu que tab est dans le champ private.

Ma question est donc la suivante: comment creer une copie du tableau rentré en argument du constructeur de Test, de façon à ce que le tab de l'objet et l'argument ne pointent pas vers le même tableau??

J'espère que j'ai été clair, et merci de votre réponse.
A voir également:

5 réponses

loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
9 nov. 2009 à 02:30
Le problème c'est que tu recopies ton tableau n'importe où ... si, si ... j'ai bien dit n'importe où.
Utiliser des pointeurs imposent de parfaitement gérer:
- la déclaration,
- l'initialisation ou l'allocation,
- l'utilisation (attention aux débordements),
- la désallocation si allocation.
Si tu ne maîtrises pas toutes ces étapes, il ne faut pas utiliser les pointeurs ou changer de langage.
Mais ne t'inquiète pas, on apprend la rigueur; celle-ci est indispensable avec le 'C'.
D'autre part, même si ta recopie était correcte, elle ne serait pas complète car le tableau est déclaré de taille 4 et tu ne recopies que 3 valeurs.
Bonne continuation.
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661
9 nov. 2009 à 03:03
pour ocmpléter et préciser : pour recréer un tableau dynamiquement, il faut utiliser malloc (pour l'allocation). (avec un delete pour la désallocation). Comme a dit Loupius, il faut bien comprendre comment ça marche avant de le faire, sinon tu peux avoir de gros bugs comme des fuites de mémoire.
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
9 nov. 2009 à 10:12
Je reviens sur ce qu'a dit Pacorabanix, en C++ pour créer un tableau dynamiquement, il faut utiliser new et delete pour le détruire. Tu peux utiliser les fonctions C malloc et free, mais ce n'est pas conseillé. Il me semble qu'il ne faut pas non plus croisé les fonctions, c'est à dire utiliser free() sur un tableau créé avec new et inversement.
Il vaut mieux aussi déclarer ta variable Obj ainsi:
Test Obj(tabl);
Et ensuite : this->tab=new int[4];
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661
9 nov. 2009 à 21:35
Je viens de remarquer que je me suis mélangé les pinceaux entre new, delete, malloc et free. Toutes mes excuses et merci char sniper.
0
Lynyrd81 Messages postés 59 Date d'inscription vendredi 3 octobre 2008 Statut Membre Dernière intervention 24 avril 2011 1
9 nov. 2009 à 12:43
Ok! Merci pour vos réponse. C'est vrai que j'avais tout simplement zappé l'allocation mémoire, ça risquait pas de marcher...
Merci encore pour votre aide!
0

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

Posez votre question
Lynyrd81 Messages postés 59 Date d'inscription vendredi 3 octobre 2008 Statut Membre Dernière intervention 24 avril 2011 1
9 nov. 2009 à 12:45
Sinon, pour les histoire de nombre d'éléments, c'est une étourderie, il faut bien sûr i<4 dans le for...
0
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
9 nov. 2009 à 15:27
Un détail:
Il serait plus judicieux de passer la taille du tableau lors de la construction et ceci pour deux raisons:
- La classe n'est plus corrélée à une taille fixée (non utilisation en dur de la taille),
et ce qui en découle
- La classe pourrait fonctionner pour toutes les tailles.
Ce n'est qu'un simple avis, mais je pense que c'est une bonne habitude à prendre: rendre les classes le plus indépendant possible et le plus universel possible.
Bonne continuation.
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298 > loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017
9 nov. 2009 à 15:59
Je n'avais pas relevé car il précise bien que c'est un programme démonstrateur de l'erreur et non le programme en lui même.
0