IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

utilisation de vector dans une déclaration et une instruction


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Août 2008
    Messages : 19
    Points : 18
    Points
    18
    Par défaut utilisation de vector dans une déclaration et une instruction
    Bonjour à tous,
    j'ai un problème avec le type vector, que je voudrais utiliser dans un petit algorithme qui donne une liste de nombres premiers.
    Voici les deux lignes qui posent problème au compilateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    vector<int> Listepremiers( int );
    et
    std::cout << "..." <<Listepremiers(1) <<".\n";
    Merci d'avance pour votre aide désintéressée.
    Ghislain

  2. #2
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Sans message d'erreur (et/ou sans un contexte plus précis) on ne peut pas t'aider.

    Mais j'imagine au pif que tu as juste oublier d'inclure les headers <iostream> et <vector>?

  3. #3
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    A tout hasard,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    vector<int> Listepremiers;
    std::cout << "..." <<Listepremiers[1] <<".\n";

  4. #4
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    PO >> Avec le code de Bakura, si t'ajoute pas de donné, ca va faire boom
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  5. #5
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Je sais je sais ^^. Mais il va être quand même assez intelligent pour rajouter des choses entre les deux, sinon ça n'a pas de sens .

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    std::vector<int> n'a pas d'operator<< défini.
    Boost ftw

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par loufoque Voir le message
    std::vector<int> n'a pas d'operator<< défini.
    Et alors?
    (pour rappel :ostream& operator<<()

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Et alors c'est pour ça qu'il a une erreur.

    ListePremiers est une fonction qui prend un entier et qui renvoit un std::vector<int>.

    std::cout << ListePremiers(1); tente donc d'invoquer operator<<(std::ostream&, std::vector<int>) qui n'existe pas.
    Boost ftw

  9. #9
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par loufoque Voir le message
    Et alors c'est pour ça qu'il a une erreur.

    ListePremiers est une fonction qui prend un entier et qui renvoit un std::vector<int>.

    std::cout << ListePremiers(1); tente donc d'invoquer operator<<(std::ostream&, std::vector<int>) qui n'existe pas.
    +1, si l'on s'en tient au code fourni par Ghalloun, et pas à celui fourni par Bakura.
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  10. #10
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Août 2008
    Messages : 19
    Points : 18
    Points
    18
    Par défaut Petite précision : l'allocation dynamique
    J'ajoute une précision. Je me suis aperçu que je voulais allouer dynamiquement mon vecteur Listepremiers.

    Il y a principalement deux endroits où ça dérape. Je vous donne les morceaux de code et les messages d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout << Listepremiers[1] << ".\n" ;
    Avec comme message d'erreur :
    pointer to a function used in arithmetic

    Et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    vector<long> *Liste(long nombre);
    ...
    Liste = malloc (taille * sizeof(long) );
    Avec comme messages d'erreur qui s'applique à la deuxième ligne :
    assignment of le type de mon vecteur
    cannot convert void* in le type de mon vecteur

    Je pense qu'il y a peut-être une confusion entre pointeurs et adresses ou un problème de type de mon vecteur, mais je laisse la parole aux spécialistes.

  11. #11
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<long> *Liste(long nombre);
    déclare une fonction "Liste" qui prend un long et retourne un pointeur vers un vecteur de long.
    Tu ne peux certainement*pas* utiliser "Liste" comme lvalue.
    Boost ftw

  12. #12
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Août 2008
    Messages : 19
    Points : 18
    Points
    18
    Par défaut
    déclare une fonction "Liste" qui prend un long et retourne un pointeur vers un vecteur de long.
    Tu ne peux certainement*pas* utiliser "Liste" comme lvalue.
    Dis-moi Loufoque, pourquoi est-ce que je dois créer une fonction Liste qui renvoie au vecteur, au lieu d'utiliser simplement le vecteur pour stocker mes nombres premiers?

    Et pourquoi ma Liste ne peut-elle pas être une lvalue?

    Ghalloun

  13. #13
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Tu n'es pas du tout obligé de faire ça, c'est toi qui écris ça...
    Si tu expliques clairement ce que tu veux faire, je te donnerai la syntaxe.
    Boost ftw

  14. #14
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Ce serait plutôt quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    int main()
    {
       std::vector<long> *L_pMonVecteur;
       long L_lNombre;
       L_lNombre = 4;
    // Allocation de ton vecteur:
       L_pMonVecteur = new std::vector<long>(L_lNombre);
    
    // Utilisation de ton vecteur:
       (*L_pMonVecteur)[0]=2;
       (*L_pMonVecteur)[1]=3;
       (*L_pMonVecteur)[2]=5;
       (*L_pMonVecteur)[3]=7;
       std::cout<<"4 premier nombres premiers: "<<std::endl;
       std::copy(
          L_pMonVecteur->begin(),
          L_pMonVecteur->end(),
          std::ostream_iterator<int>(std::cout, " ")
       );
       std::cout<<std::endl;
    
    // Libération de ton vecteur
       delete L_pMonVecteur;
    
       std::cout<<"OK"<<std::endl;
    
       return 0;
    }
    P.S. (loufoque): effectivement, je n'avais pas compris ta remarque car je ne voyais pas le problème avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    vector<int> Listepremiers;
    std::cout << "..." <<Listepremiers[1] <<".\n";

  15. #15
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Ghalloun Voir le message
    J'ajoute une précision. Je me suis aperçu que je voulais allouer dynamiquement mon vecteur Listepremiers.
    Je ne vois vraiment pas à quoi ça pourrait bien servir...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  16. #16
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Août 2008
    Messages : 19
    Points : 18
    Points
    18
    Par défaut avancement du débogage
    Je te réponds, JolyLoic, au sujet de l'allocation dynamique.
    Je pense qu'elle est nécessaire parce que je voudrais créer une fonction qui prend en entrée un entier et qui renvoie en sortie un tableau d'entiers de taille variable, la liste des nombres premiers inférieurs à l'entier d'entrée. Pour cette liste, j'ai choisi le contenant vector.

    Dans le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Liste = malloc (taille * sizeof(long) );
    j'ai retiré "Liste =" et il n'y a plus de message d'erreur. Mais je me demande maintenant comment le code sait dans quoi allouer ce que je lui demande d'allouer.

    Mais j'ai toujours trois messages d'erreur pour la ligne d'affectation de Liste[i] du code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    i=0;
    for (k=2; k<=n; k++)
      if (Entier[k]==0)
        {*Liste[i]=k;
        i=i+1;}
    Les voici :
    pointer to a function used in arithmetic
    assignment of read only location
    cannot convert 'long int' to 'std::vector<long int, std::allocator<long int>>'
    in assignment

  17. #17
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Un vector est un tableau de taille variable. Il n'y a aucunement besoin de l'allouer dynamiquement pour ça. Après, en interne, il fait certainement lui de l'allocation dynamique, mais ça ne concerne pas l'utilisateur.

    Ex d'une fonction qui retourne un tableau contenant tous les entiers entre 1 et n :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    vector<int> f(int n)
    {
      vector<int> result;
      for (int i=1 ; i<n ;++i)
      {
         result.push_back(i);
      } 
      return result;
    }
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/04/2015, 11h17
  2. [WD18] Metre une colonne d'une Table sur une ligne d'une autre Table
    Par Totophe2 dans le forum WinDev
    Réponses: 2
    Dernier message: 22/11/2013, 12h58
  3. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  4. Utilisation de final dans les parametres d'une methodes
    Par menzlitsh dans le forum Langage
    Réponses: 8
    Dernier message: 24/07/2007, 14h17
  5. Réponses: 2
    Dernier message: 23/05/2007, 14h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo