Salut
Je dois créer un programme qui fait certaines opérations sur les tableaux (addition, vérification s'ils sont égaux, opérateurs de lecture/écriture etc..)
Je dois créer une fonction == qui renvoie true si lorsque j'entre deux tableaux, tous leurs indices sont égaux.
Le problème c'est que lorsque je l'éxécute elle me renvoie toujours que les tableaux sont différents.
dim c'est la dimension du tableau et ptr pointe vers le 1er élément du tableau
bool operator==(tableau & t1, tableau & t2)
{
if(t1.dim != t2.dim)
return false;
else
{
for(int i=0 ; i<t1.dim ; i++)
{
if(t1.ptr[i]!=t2.ptr[i])
return false;
}
}
return true;
int* t1;
int* t2;
t1 = new int[4];
t2 = new int[4];
cout << "Saisir les coefficients de t1" << endl;
for(int i=0 ; i < 4 ; i++)
cin >> t1[i];
cout << "Saisir les coefficients de t2" << endl;
for(int j=0 ; j < 4 ; j++)
cin >> t2[j];
if(t1==t2) cout << "Les tableaux sont egaux" << endl;
else cout << "Les tableaux sont differents" << endl;
}Merci ! ![]()
la fonction est sur le type tableau, mais l'appel est sur des int*
Bien vu merci. Par contre j'ai rectifié comme suit mais lors de la compilation rien ne se passe ![]()
int dim;
int* ptr;
dim = 4;
tableau t1(dim);
tableau t2(dim);
ptr = new int[dim];
cout << "Saisir les coefficients de t1" << endl;
for(int i=0 ; i < dim ; i++)
cin >> t1.ptr[i];
cout << "Saisir les coefficients de t2" << endl;
for(int j=0 ; j < dim ; j++)
cin >> t2.ptr[j];
j'ajoute que le constructeur initialise tous les termes à 0
tableau::tableau(int n) // Constructeur
{ n = dim;
for(int i=0 ; i<dim ; i++)
ptr[i] = 0;
}Du coup c'est ça qui fait bugguer le programme ![]()
Il va falloir plus de code pour comprendre ce qu'il se passe.
Dans le .h j'ai ça :
class tableau
{
public:
tableau(int);
tableau(const tableau &);
~tableau();
friend bool operator==(tableau & t1, tableau & t2);
protected:
private:
int* ptr;
int dim;
};
.cpp :
tableau::tableau(int n) // Constructeur
{ n = dim;
for(int i=0 ; i<dim ; i++)
ptr[i] = 0;
}
tableau::tableau(const tableau &T) // Constructeur
{ dim = T.dim;
for(int i=0 ; i<dim ; i++)
ptr[i] = T.ptr[i];
}
tableau::~tableau()
{
delete[] ptr;
}
bool operator==(tableau & t1, tableau & t2) // Renvoie true si t1 et t2 sont égaux, false sinon
{
if(t1.dim != t2.dim)
return false;
else
{
for(int i=0 ; i<t1.dim ; i++)
{
if(t1.ptr[i]!=t2.ptr[i])
return false;
}
}
return true;
}Ce que je voudrais faire c'est demander à l'utilisateur de rentrer par exemple 4 entiers dans 2 tableaux et vérifier si les tableaux sont égaux ou non (égaux dans le sens où les indices sont les mêmes).
Dans le main j'ai fait ça du coup :
int main()
{
int dim;
int* tab;
dim = 4;
tableau t1(dim);
tableau t2(dim);
tab = new int[dim];
int x = 10;
cout << "Saisir les coefficients de t1" << endl;
for(int i=0 ; i < dim ; i++)
cin >> t1.tab[i];
cout << "Saisir les coefficients de t2" << endl;
for(int j=0 ; j < dim ; j++)
cin >> t2.tab[j];
}Le truc c'est que t1.tab ne marche pas car la classe tableau n'a pas de membre tab. Mais si je met t1.ptr, il me dit que ptr est privé ![]()
Alors ca ne devrait pas compiler. Ces fichiers sont inconsistent. Il n'y a pas de tab dans l'objet tableau.
Meme si ca compilais, tu devrais avoir une erreur de segmentation dans le constructeur de tableau parceque ptr n'est pas alloue.
Le 03 novembre 2019 à 17:59:35 godrik a écrit :
Alors ca ne devrait pas compiler. Ces fichiers sont inconsistent. Il n'y a pas de tab dans l'objet tableau.
Meme si ca compilais, tu devrais avoir une erreur de segmentation dans le constructeur de tableau parceque ptr n'est pas alloue.
Du coup je dois faire quoi ?
Je fais vois pas comment appeler ma fonction operator== dans le main, j'ai tout essayé ![]()
regardes les erreurs une par une et corriges les. La premiere te dis certainement: "il n'y a pas de champs tab dans la class tableau". Essaye de comprendre pourquoi le compilateur dit ca. Est ce qu'il y a un champs tab dans tableau? Si oui, ou est il et pourquoi est ce qu'il ne le trouve pas?
Le 03 novembre 2019 à 18:42:22 godrik a écrit :
regardes les erreurs une par une et corriges les. La premiere te dis certainement: "il n'y a pas de champs tab dans la class tableau". Essaye de comprendre pourquoi le compilateur dit ca. Est ce qu'il y a un champs tab dans tableau? Si oui, ou est il et pourquoi est ce qu'il ne le trouve pas?
Le champ tab correspond à ptr, mais si je fais dès le début int* ptr alors il me dit que ptr est privé.
En effet, il est marque prive. Pourquoi est ce que le message t'etonne?
En fait ce message ne m'étonne pas, c'est juste que je ne sais pas comment faire pour que ça fonctionne. ![]()
Quel mecanisme permet d'acceder a une variable prive en C++?
J'ai solutionné mon problème, il faut créer des méthodes supplémentaires. Je pensais que ce n'était pas autorisé dans mon exercice.
Merci quand même Godrik ![]()
... Ou passer ta variable ptr en publique, même si dans le cas présent, je trouverais ça salle.
Je ne sais pas quel est le but de ton exercice mais à mon sens tu prends énormément de mauvaises pratiques en cpp, je serais ton professeur je te demanderais pourquoi tu fais du cpp si c'est pour utiliser que des fonctionnalités du C.
Pour ton tableau, tu devrais utiliser des vecteurs de smart pointers et non des raw pointers. Autrement, comme l'a dit Godrik, le tableau n'était pas alloué, c'est le segfault assuré.
Sans compter quetableau::tableau(int n) // Constructeur
{ n = dim;
for(int i=0 ; i<dim ; i++)
ptr[i] = 0;
}
n = dim ? Je pense que tu voulais faire l'inverse, à vraie dire, je vois mal comment tu compile avec rien que cette ligne.
Double post, mais j'avais pas vu que dim était une variable privée de ta classe, du coup ça compile, même si tu dois avoir des warnings assez explicite.
Là, dim n'étant pas initialisé non plus, ton initialisation de ton "tableau" est complètement random. M'est avis que tu ne passe même pas la première condition dans ta fonction de comparaison, puisque dim est donc aussi complètement imprévisible.
Voici l'énoncé exact :
J'ai déjà fait pratiquement toutes les méthodes, mais là effectivement j'ai un problème. L'énoncé précise bien que le constructeur doit initialiser à 0 tous les termes du tableau, mais ça me bloque car je ne peux rien saisir. ![]()
Voilà où j'en suis (j'ai juste mis l'essentiel):
.cpp :
tableau::tableau(int n) // Constructeur
{
dim = n ;
for(int i=0 ; i<n ; i++)
ptr[i] = 0;
}
tableau::~tableau()
{
delete[] ptr;
}
int tableau::get_size() // Renvoie la dimension du tableau
{
return dim;
}
void tableau::saisir()
{
for(int i=0 ; i<dim ; i++)
cin >> ptr[i];
}
void tableau::affiche()
{
for(int i=0 ; i<dim ; i++)
cout << ptr[i] << endl;
}
main :
int main()
{
int dimension;
dimension = 4;
tableau t1(dimension);
tableau t2(dimension);
cout << "Saisir les coefficients de t1" << endl;
t1.saisir();
cout << "Saisir les coefficients de t2" << endl;
t2.saisir();
}
Tu n'as toujours pas résolu ton problème d'allocation.
Là tu dois avoir un memory corruption : invalid free à la destruction de ta classe
Autrement dit, on t'as déjà répondu sur ce qui n'allait pas dans ton code, de toute évidence, tu es dans tes premières années d'études : Prends l'habitude de lire de la documentation sur ce que tu utilise, il te manque un concept clef du C/CPP.
J'ajoute encore une fois que là tu fais du C, pas du CPP.