Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 31/07/2020, à 12:57

chris7522

Erreur declaration decomposition C++

Bonjour a toutes et a tous,
  J'obtiens ce message a la compilation de ce code :

#include <iostream>
#include <string>
#include <tuple>

struct Personne
{
    std::string nom;
    std::string prenom;
    int age;
};

Personne f()
{
    return { "Lagrume", "Clem", 4 };
}

int main()
{
    auto[nom, prenom, age] = f();
    std::cout << "Voici " << prenom << " " << nom << " et elle a " << age << " ans." << std::endl;
    return 0;
}
chris@chris:~/Bureau/Essai$ g++ essai10.cpp -o essai10C
essai10.cpp: In function ‘int main()’:
essai10.cpp:19:9: warning: decomposition declaration only available with -std=c++1z or -std=gnu++1z
     auto[nom, prenom, age] = f();
         ^
chris@chris:~/Bureau/Essai$ 

Apres un apt-get update/upgrade et quelques recherches ,   je ne sais vraiment pas quoi faire pour que ca  compile .
Merci de votre aide

Hors ligne

#2 Le 31/07/2020, à 13:16

grigouille

Re : Erreur declaration decomposition C++

#include <iostream>
#include <string>

struct Personne
{
    std::string nom;
    std::string prenom;
    int age = 0;
};

Personne f()
{
    return { "Lagrume", "Clem", 4 };
}

int main()
{
    auto pers = f();
    std::cout << "Voici " << pers.prenom << " " << pers.nom << " et elle a " << pers.age << " ans." << std::endl;
    return 0;
}

Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#3 Le 31/07/2020, à 14:26

chris7522

Re : Erreur declaration decomposition C++

Merci beaucoup .
Dans ce que j'étudie , il est dit :
   Une des nouveautés de C++17, ce sont les décompositions (en anglais «structured bindings»). Ce concept est très simple. Son but est de déclarer et initialiser plusieurs variables d’un coup, depuis un tuple ou une structure . Mais l'exemple que j'ai fourni a l'air un peu bidon .
   Il y a cet autre exemple :

#define _USE_MATH_DEFINES

#include <cmath>
#include <iostream>
#include <string>
#include <tuple>

std::tuple<int, std::string> f()
{
    using namespace std::literals;
    return { 20, "Clem"s };
}

std::tuple<double, double> g(double angle)
{
    return { std::cos(angle), std::sin(angle) };
}

int main()
{
    auto[note, nom] = f();
    std::cout << "Tu t'appelles " << nom << " et tu as obtenu " << note << " / 20." << std::endl;

    auto[cosinus, sinus] = g(M_PI / 4.);
    std::cout << "Voici le cosinus de PI / 4 : " << cosinus << std::endl;
    std::cout << "Voici le sinus de PI / 4 : " << sinus << std::endl;

    return 0;
}

Mais de nouveau le meme message d'erreur .

Hors ligne

#4 Le 31/07/2020, à 14:44

grigouille

Re : Erreur declaration decomposition C++

#define _USE_MATH_DEFINES

#include <cmath>
#include <iostream>
#include <string>
#include <tuple>

std::tuple<int, std::string> f()
{
    return { 20, "Clem" };
}

std::tuple<double, double> g(double angle)
{
    return { std::cos(angle), std::sin(angle) };
}

int main()
{
    auto a = f();
    std::cout << "Tu t'appelles " << std::get<1>(a) << " et tu as obtenu " << std::get<0>(a) << " / 20." << std::endl;

    auto b = g(M_PI / 6.);
    std::cout << "Voici le cosinus de PI / 6 : " << std::get<0>(b) << std::endl;
    std::cout << "Voici le sinus de PI / 6 : " << std::get<1>(b) << std::endl;

    return 0;
}

Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#5 Le 31/07/2020, à 14:52

grigouille

Re : Erreur declaration decomposition C++

c'est plutôt ceci que tu cherches :

#define _USE_MATH_DEFINES

#include <cmath>
#include <iostream>
#include <string>
#include <tuple>

std::tuple<int, std::string> f()
{
    return { 20, "Clem" };
}

std::tuple<double, double> g(double angle)
{
    return { std::cos(angle), std::sin(angle) };
}

int main()
{
	std::string nom;
	int note = 0;
    std::tie(note, nom) = f();
    std::cout << "Tu t'appelles " << nom << " et tu as obtenu " << note << " / 20." << std::endl;

	double cosa,sina;
	double theta = M_PI/6.;
    std::tie(cosa, sina) = g(theta);
    std::cout << "Voici le cosinus de PI / 6 : " << cosa << std::endl;
    std::cout << "Voici le sinus de PI / 6 : " << sina << std::endl;

    return 0;
}

Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#6 Le 01/08/2020, à 08:53

chris7522

Re : Erreur declaration decomposition C++

A propos de std::tie , ils disent :

" Les décompositions sont apparues en C++17, mais avant, il existait une autre façon de faire, qui existe toujours soit dit en passant. Il s’agit de std::tie. Le principe est identique, puisque on veut assigner à des variables les différents éléments d’un tuple ou d’une structure. Sauf qu’ici, les variables doivent être déclarées au préalable.
   Cette solution présente a comme inconvénient majeur que les variables doivent être déclarées à l’avance et donc qu'on ne peut pas profiter de l’inférence de type. Par contre, l’avantage qu’elle a sur la décomposition, c’est qu’elle permet d’ignorer certaines valeurs qui ne nous intéressent pas et que nous ne voulons pas récupérer, grâce à std::ignore.
   Un autre avantage, c’est de pouvoir réutiliser une même variable plusieurs fois, alors que la décomposition C++17 ne nous le permet pas. "

Voici l'exemple avec les explications:

#define _USE_MATH_DEFINES

#include <cmath>
#include <iostream>
#include <string>
#include <tuple>

std::tuple<int, std::string> f()
{
    using namespace std::literals;
    return { 20, "Clem"s };
}

std::tuple<double, double> g(double angle)
{
    return { std::cos(angle), std::sin(angle) };
}

int main()
{
    // AVANT
    // std::tuple resultats_scolaires = f();
    // std::cout << "Tu t'appelles " << std::get<std::string>(resultats_scolaires) << " et tu as obtenu " << std::get<int>(resultats_scolaires) << " / 20." << std::endl;

    // Maintenant, on sait qu'on a affaire à un nom et un entier.
    auto[note, nom] = f();
    std::cout << "Tu t'appelles " << nom << " et tu as obtenu " << note << " / 20." << std::endl;

    // AVANT
    // std::tuple calculs = g(M_PI / 2.);
    // std::cout << "Voici le cosinus de PI / 2 : " << std::get<0>(calculs) << std::endl;
    // std::cout << "Voici le sinus de PI / 2 : " << std::get<1>(calculs) << std::endl;

    // Maintenant, on sait qu'on a affaire à deux valeurs mathématiques.
    auto[cosinus, sinus] = g(M_PI / 4.);
    std::cout << "Voici le cosinus de PI / 4 : " << cosinus << std::endl;
    std::cout << "Voici le sinus de PI / 4 : " << sinus << std::endl;

    return 0;
}

   Et ils ajoutent :

Notez comment le code se voit simplifié et clarifié. Nous avons remplacé une ligne aussi peu claire que std::get<0>(calculs) par cosinus. D’un coup d’œil, vous voyez ce que fait la variable et ce que nous manipulons. Le code est plus lisible et donc de meilleure qualité

Sauf que pour moi , ca compile pas sad

Hors ligne

#7 Le 01/08/2020, à 09:10

grigouille

Re : Erreur declaration decomposition C++

Tu m'apprends quelque chose.
Ton code compile sans problème :

$ g++ --version
g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ g++ -o toto -std=c++1z toto.cpp && ./toto
Tu t'appelles Clem et tu as obtenu 20 / 20.
Voici le cosinus de PI / 4 : 0.707107
Voici le sinus de PI / 4 : 0.707107
$ 

Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#8 Le 01/08/2020, à 09:17

chris7522

Re : Erreur declaration decomposition C++

Je viens de comprendre , je faisais ceci  pour compiler :

chris@chris:~/Bureau/Essai$ g++ essai13.cpp -o essai13C
essai13.cpp: In function ‘int main()’:
essai13.cpp:26:9: warning: decomposition declaration only available with -std=c++1z or -std=gnu++1z
     auto[note, nom] = f();
         ^
essai13.cpp:35:9: warning: decomposition declaration only available with -std=c++1z or -std=gnu++1z
     auto[cosinus, sinus] = g(M_PI / 4.);
         ^
chris@chris:~/Bureau/Essai$ 

Merci de ton aide !

Hors ligne

#9 Le 01/08/2020, à 09:37

grigouille

Re : Erreur declaration decomposition C++

Oui, il faut activer c++17.
En tout cas merci pour l'info.


Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne