Partage
  • Partager sur Facebook
  • Partager sur Twitter

C++ ligne avec const char*, char_traits

C++

20 décembre 2018 à 15:56:44

  • Partager sur Facebook
  • Partager sur Twitter
Les seules questions bêtes sont celles qui ne sont pas posées. Mieux vaut paraître bête une fois que de le rester à vie."Vis comme si tu devais mourir demain. Apprends comme si tu devais vivre toujours."
20 décembre 2018 à 16:25:00

gbdivers a écrit:

Arrêtez de me dénigrer ! Vous n'arriverez pas à me convaincre ! Ma méthode est bonne ! Cela prend juste du temps, mais un jour je serais le meilleur développeur C++ ! Je me battrai sans répit ! Je ferai tout pour être vainqueur et gagner les défis ! Je parcourrai la terre entière, traquant avec espoir le C++ et ses mystères !

J'ai vraiment cru lire YES,man at first ... puis j'l'ai lu dans la voix de team rocket.

  • Partager sur Facebook
  • Partager sur Twitter
20 décembre 2018 à 16:50:47

dragonjoker a écrit:

Comme tout le monde n'a de cesse de te le répéter, tu n'as pas le niveau par ce bouquin, tu n'as apparemment même pas les bases...


Ben je suis d'accord, mais ce post est en rapport avec le bouquin ? (je ne l'ai pas lu)

Moi qui espérais qu'il soit en train de faire quelques exercices :/
Bien que ça aurait dû me mettre la puce à l'oreille qu'il oriente sa question sur char_trait alors que son problème n'a finalement rien à voir

  • Partager sur Facebook
  • Partager sur Twitter
Dream on, Dream on, Dream until your dream comes true
20 décembre 2018 à 17:06:23

romantik a écrit:

Ben je suis d'accord, mais ce post est en rapport avec le bouquin ? (je ne l'ai pas lu)

(char_traits est cité dans le chapitre 11, donc il est possible que ce soit lié).

  • Partager sur Facebook
  • Partager sur Twitter

Rejoignez le discord NaN pour discuter programmation.

20 décembre 2018 à 17:10:40

Au temps pour moi, il ne cite pas le bouquin, mais uniquement cppreference.

Mes excuses, YES,man.

-
Edité par dragonjoker 22 décembre 2018 à 22:36:13

  • Partager sur Facebook
  • Partager sur Twitter

Si vous ne trouvez plus rien, cherchez autre chose.

20 décembre 2018 à 17:34:16 - Message modéré pour le motif suivant : Mort de rire, bien tenté mais ... non ...


Rejoignez le discord NaN pour discuter programmation.

20 décembre 2018 à 23:32:31

Mega Mea Culpa, j'ai complètement oublié de préciser dans le tuto sur le changement de compilo, qu'il fallait tout recompiler pour que les changements de paramétrage soient pris en compte.

A ma décharge, je n'aurais jamais pu imaginer qu'un éminent lecteur de S. Meyer serait à ce point ignorant de C++, qu'il en ignore le minimum vital sur la chaîne de build de C++. Je peux me tromper, mais il me semble que même le cours d'OC donne un minimum d'informations sur le sujet, probablement, lorsqu'il est question de découper son programme en plusieurs fichiers...

Edit: Je vais réfléchir à reformuler la partie sur les options de compilation, pour mentionner ce détail au cas où...

-
Edité par int21h 20 décembre 2018 à 23:48:47

  • Partager sur Facebook
  • Partager sur Twitter
Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
21 décembre 2018 à 0:33:40

@int21h : peux-tu me tenir au courant sur ce fil de discussion quand tu auras expliqué ce que signifie rebuild précisément et la différence avec un build au niveu des options de compilation ?

Merci

  • Partager sur Facebook
  • Partager sur Twitter
21 décembre 2018 à 1:27:29

Ok, donc avant tu posais des questions sur le chapitre 3 d'un cours de base, et maintenant, tu poses carrément des questions sur le chapitre 1 "savoir compiler un programme C++"...

Bon, ben, un "build", c'est une compilation. C'est le terme anglais.

Et un "rebuild", c'est une re-compilation... On "re"fait une compilation.

Du coup, un "rebuild", c'est ce que tu fais quand tu as deja fait un "build"...

Sérieux, tu as lu les réponses des gens qui veulent t'aider ? Parce que plusieurs personnes t'ont déjà expliqué ce que c'était. Donc, un moment donné, si tu ne lis pas les réponses des gens, c'est moi qui répond. Mais pour me moquer de toi, te dénigrer et t'infantiliser. Parce que si tu ne lis pas les réponses des gens, c'est ce que tu mérites.

-
Edité par gbdivers 21 décembre 2018 à 1:28:08

  • Partager sur Facebook
  • Partager sur Twitter

Rejoignez le discord NaN pour discuter programmation.

21 décembre 2018 à 11:21:53

@gbdivers : certaines de tes interventions  ou d'autres mecs ne servent à rien. D'ailleurs, quand je vois un début de commentaire pourri, je commence à ne plus le lire jusqu'au bout, car ça sent de loin quand le commentaire est pourri et truffé de négativités , jugements, et autres dévalorisations pourries.

Les quelques derniers commentaires irrespectueux et pourris , je ne les ai même pas lus en entier : que ce soit les tiens ou d'autres gens.

Je fais en sorte de lire seulement les commentaires qui sont de la science C++  , pas des gamineries de gens farfelus qui ne savent pas quoi faire à part envoyer de la mer....tu peux continuer à envoyer des commentaires pourris si tu veux, je ferai en sorte de ne pas terminer la lecture de ton commentaire si je vois dès le départ qu'il est irrespectueux. 

Je reviens au C++ scientifique maintenant , au-delà de certains commentaires pourris qui n'aident pas à progresser :

1) toujours dans le cadre de mon analyse de l'exemple de code C++ à la page :

https://en.cppreference.com/w/cpp/string/char_traits

J'ai cherche à comprendre pourquoi on faisait en particulier dans ce code :

static int compare(const char* s1, const char* s2, size_t n) {
        while ( n-- != 0 ) {
            if ( to_upper(*s1) < to_upper(*s2) ) return -1;
            if ( to_upper(*s1) > to_upper(*s2) ) return 1;
            ++s1; ++s2;
        }
        return 0;
    }


alors que la fonction compare existe déjà dans :   https://en.cppreference.com/w/cpp/string/char_traits/compare

S'agit-il d'un exemple de masquage où l'on redéfinit une fonction ?

2) La deuxième question que je me pose :

pourquoi a-t-on aussi une fonction compare dans basic_string ? et sont-elles différentes ? :

https://en.cppreference.com/w/cpp/string/basic_string/compare

Et en particulier, dans la ligne de code :

using ci_string = std::basic_string<char, ci_char_traits>;

est-ce que la fonction compare de ci char_traits est héritée dans ci_string ou bien sont-elles totalement différentes ?

J'essaie en fait de comprendre la structure.

Merci pour toute aide concrète.

-
Edité par pseudo____ 21 décembre 2018 à 11:30:58

  • Partager sur Facebook
  • Partager sur Twitter
21 décembre 2018 à 11:52:37

YES, man a écrit:

Je reviens au C++ scientifique maintenant , au-delà de certains commentaires pourris qui n'aident pas à progresser

Tu sais que ça fait rigoler beaucoup de monde quand tu parles de "C++ scientifique" ?

Ca veut rien dire, c'est ça qui est drôle avec toi !

(voila, comme ça, je sais que tu ne lis pas la suite de ce message, je peux etre negatif et dénigrant tranquillement)

1) c'est un code d'exemple. Donc oui, cela n'utilise pas forcement des choses qui existe deja dans la lib standard. C'est pour l'exemple.

Et ce n'est pas un masquage. Parce que ce n'est pas le même espace de noms. (Et au cas où tu n'aurais pas remarqué, ce n'est pas les mêmes paramètres).

2) Idem, ce n'est pas les mêmes paramètres, les fonctions ne font pas la même chose.

YES, man a écrit:

est-ce que la fonction compare de ci char_traits est héritée dans ci_string ou bien sont-elles totalement différentes ?

Il n'y a pas d'héritage ici, donc ca veut pas dire grand chose.

Si ta question est est-ce que ci_string utilise la fonction compare de ci_char_traits, oui.

  • Partager sur Facebook
  • Partager sur Twitter

Rejoignez le discord NaN pour discuter programmation.

21 décembre 2018 à 13:07:11

Pour la première question, est-ce une surcharge alors ? ou une redéfinitionui nous autorise à utiliser d'autres paramètres ?

-
Edité par pseudo____ 21 décembre 2018 à 13:08:09

  • Partager sur Facebook
  • Partager sur Twitter
21 décembre 2018 à 13:20:27

c'est quoi les definitions de marquage, surcharge et redefinition ?
  • Partager sur Facebook
  • Partager sur Twitter

Rejoignez le discord NaN pour discuter programmation.

21 décembre 2018 à 13:31:18

Masquage : c'est quand tu as une classe A et que tu considères une classe B et que tu redéfinis dans B une fonction déjà définie dans A

Surcharge, c'est quand tu es dans une classe A par exemple et que tu as une certaine fonction f et que tu la redéfinis pour diverses sortes de paramètres ayant des types différents

  • Partager sur Facebook
  • Partager sur Twitter
21 décembre 2018 à 13:39:35

"redéfinir" == "to override" == "supplanter" != "surcharge" == "to overload" -- beaucoup confondent ces termes qui font référence à des notions très différentes

Dans la surcharge, on ajoute une définition supplémentaire -- on ne redéfinit pas. Dans la redéfinition, on change la définition, on la supplante (terme que je préfère car il est moins équivoque et plus proche du termes anglais originel)

"masquer" == "to hide" ou "to mask", je ne sais jamais. Et c'est une surcharge dégénérée de mon avis, même si d'autres disent que c'est autre chose.

-
Edité par lmghs 21 décembre 2018 à 13:41:11

  • Partager sur Facebook
  • Partager sur Twitter
C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
21 décembre 2018 à 14:46:11

Salut,

lmghs a écrit:

"masquer" == "to hide" ou "to mask", je ne sais jamais. Et c'est une surcharge dégénérée de mon avis, même si d'autres disent que c'est autre chose.

A mon sens, le masquage des fonctions n'entre dans aucune des deux catégories que tu cites (ni dans la redéfinition, ni dans la surcharge), parce que ce n'est que la conséquence "normale" du comportement de base du compilateur:

On ne lui dit pas que la fonction est redéfinie, si bien qu'il ne fait pas passer l'appel de la fonction par le processus de sélection du comportement mis en place par la table de fonctions virtuelles.  C'est logique, vu qu'il n'a pas à le faire.

Du coup, il fait directement appel au comportement de la fonction correspondant au type de donnée sous lequel il connaît la variable, ce n'est pas plus compliqué que cela :

S'il connaît la variable comme étant du type de base, il fera appel au comportement ... de la classe de base.  Sil la connaît comme étant du type dérivée, iil fera appel... à celui de la classe dérivée.

A mon sens, on aurait tout à fait tort d'essayer de faire entrer ce comportement dans n'importe quelle autre catégorie, parce qu'il est beaucoup trop différent de tous les autres comportements "classiques" de surcharge et / ou de redéfinition.

  • Partager sur Facebook
  • Partager sur Twitter
Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
21 décembre 2018 à 15:05:00

Si on passe à l'écriture librement unifiée (non validée à ce jour).

struct A { void f() ; };
struct B : A { void f() ; };
.
.
.
A a;
B b;
f(a); // <=> a.f();
f(b); // <=> b.f();


on retrouve les mêmes principes de résolution que pour la surcharge. C'est pour cela que je considère qu'il s'agit d'une surcharge dégénérée: toutes les définitions sont simplement accessibles depuis des types statiques différents. i.e. on n'a pas besoin de sortir explicitement des A::f(), sauf si on veut appeler A::f() sur b;

Sur des surcharges entre des types différents, on ne cherche pas utiliser une fonction sur un type de paramètre qui ne correspond pas. Je vois f(A) et f(B) comme deux choses différentes dans un monde de surcharge. La différence est qu'il y a maintenant une possibilité syntaxique de substituer un B là où un attend un A. Et du coup, on commence à se poser la question de comment choisir la fonction que l'on veut, etc. Question que l'on ne se pose pas quand les types sont sans lien de parenté. Je ne sais pas si je suis clair.

-
Edité par lmghs 21 décembre 2018 à 15:05:47

  • Partager sur Facebook
  • Partager sur Twitter
C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
21 décembre 2018 à 15:18:59

Le mieux est peut être de donner quelques exemples:

La surcharge (overload) consiste à adapter le comportement d'une fonction, membre d'une classe ou non, à un ou des types de paramètre particulier.
Le nom de la fonction reste identique, mais la signature diffère.
A noter que grâce aux mécaniques d'héritage, la bonne fonction est appelée.
Exemple:

    // fonction d'origine
void print(Foo const& f)
{
    std::cout << "Printing Foo." << std::endl;
}

    // Surcharge
void print(Bar const& b)
{
    std::cout << "Printing Bar." << std::endl;
}

int main()
{
    Foo f;
    print(f);    // affiche: Printing Foo.

    Bar b;
    print(b);    // affiche: Printing Bar.
}

La redéfinition (override) s'applique aux classes dérivées, et consiste à adapter le comportement d'une fonction membre héritée et virtuelle dans la classe de base aux besoins de la classe.
La signature de la fonction reste identique.
Exemple:

class Base
{
public:
    virtual void print()
    {
        std::cout << "Printing Base." << std::endl;
    }
};

class Foo: public Base
{
public:
        // Redefinition
    void print() override
    {
        std::cout << "Printing Foo." << std::endl;
    }
};

int main()
{
    Foo f;
    f.print();    // affiche: Printing Foo.

    Base& b = f;
    b.print();    // affiche: Printing Foo.
}

Enfin, le masquage, peut apparaître de 2 façon:
Masquage de variables, une variable de portée inférieur porte le même nom qu'une variable de portée supérieur.
Exemple:

void print(int i)
{
    {
            // masquage de la variable i définie précédemment et de portée supérieur
        int i = 20;
        std::cout << i << std::endl;
    }
}

int main()
{
    print(5);    // affiche 20
}

Le masquage de fonction s'applique également aux classes, et conssiste à re-écrire une fonction non virtuelle de la classe de base.
Les mécaniques d'heritage ne s'appliquant pas, cela peut reserver des surprises.

class Base
{
public:
    void print()
    {
        std::cout << "Printing Base." << std::endl;
    }
};

class Foo: public Base
{
public:
        // masquage
    void print()
    {
        std::cout << "Printing Foo." << std::endl;
    }
};

int main()
{
    Foo f;
    f.print();    // affiche: Printing Foo.

    Base& b = f;
    b.print();    // affiche: Printing Base.
}
Enfin, aurisque de me répéter (ainsi que mes co-intervenant caustiques):
Si tu n'a pas intégré ces notion de bases, abandonne tes recherches sur les notion avancées car tu n'as pas le niveau nécéssaire pour comprendre.
Revoit tes bases, lorsque ce sera plainement acquis, tu pourras te pencher sur les notions avancées.

-
Edité par Deedolith 21 décembre 2018 à 15:22:14

  • Partager sur Facebook
  • Partager sur Twitter
21 décembre 2018 à 15:36:36

Je suis d'accord pour dire aussi que c'est une forme de surcharge. Dans l'étape de résolution des noms, le compilateur regarde les noms de la classe de base, et s'il ne trouve pas ou trouve la directive using qui importe les fonctions la classe de base, il va voir aussi la classe de base. Donc d'accord avec "Dans la surcharge, on ajoute une définition supplémentaire".

Le terme masquage me semble quand même plus précis, pour bien indiquer qu'on perd l'accès a certaines définition. Par exemple :

struct A { void f(std::string) {} };
struct B : A { void f(int) {} };

int main() {
    B b;
    b.f("hello"); // erreur
}

Ici, on ajoute une nouvelle définition (f avec un int) et on masque une definition (f avec un string). Ce qui est bien une "surcharge" (on ajoute une definition... meme si dans le meme temps on en retire une autre) et que cela se distingue de la "redefinition" (on garde la meme fonction, mais on lui donne une nouvelle definition).

  • Partager sur Facebook
  • Partager sur Twitter

Rejoignez le discord NaN pour discuter programmation.

21 décembre 2018 à 15:41:27

Merci Deedolith : ton message a été presque parfait, sauf à la fin où tu es retombé dans les obsessions à me répéter des choses sur lesquelles je suis en train de travailler pour consolide mes bases, mais tu progresses. Tu commences à avoir le niveau.

Tes exemples SCIENCE C++ sans digression moralisatrice , eux , étaient particulièrement parlants. J'ai compilé le dernier notamment

@ Koala01, gbdivers, et lmghs, Merci à vous pour vos explications

-
Edité par pseudo____ 21 décembre 2018 à 15:45:15

  • Partager sur Facebook
  • Partager sur Twitter
21 décembre 2018 à 15:43:23 - Message modéré pour le motif suivant : Les insultes ne sont pas tolérées


Rejoignez le discord NaN pour discuter programmation.

21 décembre 2018 à 15:48:29 - Message modéré pour le motif suivant : Réponse à un message modéré


21 décembre 2018 à 15:52:58

Je vois pas pourquoi s'obstiner à aider quelqu'un qui se permet de répondre de la sorte. OK c'est bientôt Noël, mais quand même.

Edit : Rofl, mon message n'a plus de sens si ceux de mes VDD ont été modérés :(

-
Edité par Emrak 21 décembre 2018 à 15:56:35

  • Partager sur Facebook
  • Partager sur Twitter
21 décembre 2018 à 15:53:44

en matière d'arrogance et d'infantilisation, vous deux, vous êtes des champions de l'infantilisation et de la dévalorsation permanente. Donc quand quelqu'un d'intelligent utiilise votre manière de faire, sur vous, vous voyez l'effet que ça fait.

-
Edité par pseudo____ 21 décembre 2018 à 15:54:59

  • Partager sur Facebook
  • Partager sur Twitter
21 décembre 2018 à 15:56:25

Allez, on se calme avec les insultes envers yesman, c'etait juste pour me défouler :) C'est pas bien
  • Partager sur Facebook
  • Partager sur Twitter

Rejoignez le discord NaN pour discuter programmation.

21 décembre 2018 à 15:56:35

Pour info, gbdivers a lui-même signalé son message pour insulte. C'est plutôt mature en ce qui me concerne.
  • Partager sur Facebook
  • Partager sur Twitter

Pas d'aide concernant le code par MP, le forum est là pour ça :) (en plus je n'y connais rien en C)

21 décembre 2018 à 15:58:50

Non, c'est surtout une preuve de perfidie :D
  • Partager sur Facebook
  • Partager sur Twitter

Rejoignez le discord NaN pour discuter programmation.

21 décembre 2018 à 16:02:25

YES, man a écrit:

sauf à la fin où tu es retombé dans les obsessions à me répéter des choses sur lesquelles je suis en train de travailler pour consolide mes bases

C'est malheureux que tu soit incapable de reconnaître tes propres travers.

Tu n'as pas de bases solides, comment dans ces conditions comprendre la suite ?
La réponse est (je la donne en 1000): Impossible.

Fais l'exercice du Javaquarium, il ne nécéssite que les notions de base, ce sera un excellent indicateur (surtout pour toi) de ce que tu es capable de faire et comprendre.

YES, man a écrit:

mais tu progresses. Tu commences à avoir le niveau.

Même s'il n'y a pas de grossièretés la dedans, je te prie de garder tes insultes pour toi !!!

-
Edité par Deedolith 21 décembre 2018 à 16:02:48

  • Partager sur Facebook
  • Partager sur Twitter
21 décembre 2018 à 16:03:11

Ah. Bin je vais laisser Benzouye s'occuper de votre cas, moi j'ai pas le niveau.
  • Partager sur Facebook
  • Partager sur Twitter

Pas d'aide concernant le code par MP, le forum est là pour ça :) (en plus je n'y connais rien en C)

21 décembre 2018 à 16:08:54

Emrak a écrit:

Je vois pas pourquoi s'obstiner à aider quelqu'un qui se permet de répondre de la sorte. OK c'est bientôt Noël, mais quand même.


J'avoue, t'abuse Deedolith ! YES,man se tue à t'aider et tu l'envoie paître, quelle ingratitude !
  • Partager sur Facebook
  • Partager sur Twitter
Dream on, Dream on, Dream until your dream comes true