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

Le problème exposé dans ce sujet a été résolu.

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

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.

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.

+0 -0

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" ?

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;
}

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

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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