Vérifier l'exécution d'un programme C++

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

Je débute en C++ et j’aimerais savoir comment afficher ce type d’erreurs que ce soit dès la compilation, ou bien lors de l’exécution :

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> monVecteur (1, 23);

    monVecteur.push_back(14);

    for (int i = 0; i < 100000; ++i)
        monVecteur.pop_back();

    cout << monVecteur.size() << endl; // Affiche 18446744073709451618
    cout << monVecteur[1] << endl;     // Affiche 14
    return 0;
}

Le code compile et s’exécute normalement comme si de rien n’était (avec les options -Wall -Wextra -fsanitize=address).

+0 -0

Cette réponse a aidé l’auteur du sujet

Lu’!

Bienvenue dans le monde merveilleux de C++, où un programme tout buggé a le droit de faire n’importe quoi (après tout il est buggé, donc c’est normal qu’il fasse n’importe quoi). Ton code contient des "undefined behavior" dans un telle situation, le langage ne te donne plus de garanties sur le comportement de ton programme.

Utilise un debugger.

Édité par Ksass`Peuk

First : Always RTFM - "Tout devrait être rendu aussi simple que possible, mais pas plus." A.Einstein [Tutoriel Frama-C WP]

+0 -0
Auteur du sujet

Merci et comment puis-je comparer alphabétiquement deux chaînes de caractères en C++ ?

#include <iostream>
using namespace std;

int main()
{
    bool a = ("helloe" <= "zeeee");
    cout << a << endl;
    return 0;
}

test.cpp:6:24: warning: comparison with string literal results in unspecified behavior [-Waddress]

PS : sans avoir recours à std::sort si possible.

Édité par Green

+0 -0

Cette réponse a aidé l’auteur du sujet

Ici, tu compares des chaînes C (de type const char[]). Dans un tel cas, en C, c’est strcmp qu’on utilisait (et qui s’utilise aussi très bien en C++). Mais tu peux aussi passer par des std::string, et avoir le bon comportement :

#include <iostream>
#include <string>

using namespace std::literals::string_literals ;

int main()
{
    bool a = ("helloe"s <= "zeeee"s);
    std::cout << a << std::endl;
    return 0;
}

Merci pour les conseils, mais pourquoi les using global sont-ils impropres ?

Pourquoi "pas de using namespace std" ?

Édité par Ksass`Peuk

First : Always RTFM - "Tout devrait être rendu aussi simple que possible, mais pas plus." A.Einstein [Tutoriel Frama-C WP]

+0 -0
Auteur du sujet

Ici, tu compares des chaînes C (de type const char[]). Dans un tel cas, en C, c’est strcmp qu’on utilisait (et qui s’utilise aussi très bien en C++). Mais tu peux aussi passer par des std::string, et avoir le bon comportement :

#include <iostream>
#include <string>

using namespace std::literals::string_literals ;

int main()
{
    bool a = ("helloe"s <= "zeeee"s);
    std::cout << a << std::endl;
    return 0;
}

Merci pour les conseils, mais pourquoi les using global sont-ils impropres ?

Pourquoi "pas de using namespace std" ?

Ksass`Peuk

Cette forme simplifiée ci-dessous est strictement équivalente ?

#include <iostream>
#include <string>
using namespace std;

int main()
{
    bool a = ("aaello"s <= "aezedddd"s);
    cout << a << endl;
    return 0;
}
+0 -0

Hey,

Désolé, j’avais édité pour enlever le message sur les namespaces car j’ai jugé pas ça trop nécessaire comme tu débutais :D .

Mais c’est cool que maintenant tu saches pourquoi ;) .

Édité par JuDePom

+1 -0
Auteur du sujet

Hey,

Désolé, j’avais édité pour enlever le message sur les namespaces car j’ai jugé pas ça trop nécessaire comme tu débutais :D .

Mais c’est cool que maintenant tu saches pourquoi ;) .

JuDePom

En fait je débute en C++ mais j’ai des bases dans d’autres langages du coup toute critique pour m’améliorer et faire du bon code sera toujours la bienvenue :)

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte