CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

C++ tableau

Maez54
Maez54
Niveau 9
03 novembre 2019 à 11:01:35

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 ! :)

godrik
godrik
Niveau 30
03 novembre 2019 à 15:38:00

la fonction est sur le type tableau, mais l'appel est sur des int*

Maez54
Maez54
Niveau 9
03 novembre 2019 à 16:31:56

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];
Maez54
Maez54
Niveau 9
03 novembre 2019 à 17:04:24

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 :(

godrik
godrik
Niveau 30
03 novembre 2019 à 17:12:37

Il va falloir plus de code pour comprendre ce qu'il se passe.

Maez54
Maez54
Niveau 9
03 novembre 2019 à 17:23:30

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é :(

godrik
godrik
Niveau 30
03 novembre 2019 à 17:59:35

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.

Maez54
Maez54
Niveau 9
03 novembre 2019 à 18:11:37

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é :(

Message édité le 03 novembre 2019 à 18:13:21 par Maez54
godrik
godrik
Niveau 30
03 novembre 2019 à 18:42:22

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?

Maez54
Maez54
Niveau 9
03 novembre 2019 à 19:18:52

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é.

godrik
godrik
Niveau 30
03 novembre 2019 à 19:30:48

En effet, il est marque prive. Pourquoi est ce que le message t'etonne?

Maez54
Maez54
Niveau 9
03 novembre 2019 à 19:34:20

En fait ce message ne m'étonne pas, c'est juste que je ne sais pas comment faire pour que ça fonctionne. :hap:

godrik
godrik
Niveau 30
03 novembre 2019 à 20:24:57

Quel mecanisme permet d'acceder a une variable prive en C++?

Maez54
Maez54
Niveau 9
03 novembre 2019 à 20:56:18

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 :ok:

Raidden36
Raidden36
Niveau 6
04 novembre 2019 à 01:42:48

... 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 que
tableau::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.

Message édité le 04 novembre 2019 à 01:45:48 par Raidden36
Raidden36
Raidden36
Niveau 6
04 novembre 2019 à 01:50:02

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.

Maez54
Maez54
Niveau 9
04 novembre 2019 à 10:29:47

Voici l'énoncé exact :
https://image.noelshack.com/fichiers/2019/45/1/1572859305-sans-titre1.png

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();

}
Raidden36
Raidden36
Niveau 6
04 novembre 2019 à 13:40:01

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.

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment