problème de référencement en c++
Répondre à la discussion
Affichage des résultats 1 à 2 sur 2

problème de référencement en c++



  1. #1
    invite91baade3

    problème de référencement en c++


    ------

    Bonjour, j'essaie de programmer un algorithme de tri rapide mais je n'y arrive pas, peut-être à cause d'un problème de référencement car le compilateur m'envoie plein d'erreurs lorsque j'essaie d'utiliser des pointeurs sur un vector de long int qui sert à stocker des nombres aléatoires.
    Voici le code et mes erreurs à la compilation :
    Code:
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include<string.h>
    #include<vector>
    #include<random>
    
    using namespace std;
    int choix_pivot(vector<long>, int);
    int partitionner(vector<long>, int, int, int);
    vector<long> triRapide(vector<long>, int, int);
    vector<long>Nb_alea(long);
    int main()
    {
        int nb;
        std::cout<<"Combien d'entiers ?"<<std::endl;
        std::cin>>nb;
        int choix_tri;
        std::cout<<"Choix du type de tri, 1-tri rapide, 2-tri fusion, 3-tri par tas"<<std::endl;
        std::cin>>choix_tri;
        string chemin_acces;
        std::cout<<"Quel chemin d'acces ?"<<std::endl;
        std::cin>>chemin_acces;
        vector<long>vec;
        vec=Nb_alea(nb);
        FILE *fp=fopen("TriDeNombres.txt", "rt+, css=UTF-8");
        for(int i=0; i<nb; i++)
        {
            std::cout<<vec[i]<<std::endl;
        }
        int premier=0;
        if(choix_tri==1)
        {
            vec=triRapide(vec, premier, nb);
            for(int i=0; i<nb; i++)
            {
                std::cout<<vec[i]<<std::endl;
            }
        }/*else if(choix_tri==2)
        {
        }*/
    }
    int choix_pivot(int premier, int dernier)
    {
        int milieu;
        if(dernier%2==0 && premier<=dernier)
        {
            milieu=dernier/2;
        }else if(dernier%2!=0 && premier<=dernier)
        {
            milieu=((dernier+1)/2);
        }
        return milieu;
    }
    int partitionner(vector<long> *vec, int premier, int dernier, int pivot)
    {
        std::swap(*vec[pivot], *vec[dernier]);
        int j=premier;
        for(int i=premier; i<dernier; i++)
        {
            if(*vec[i]<=*vec[dernier])
            {
                std::swap(*vec[i], *vec[j]);
                j++;
            }
        }
        std::swap(*vec[j], *vec[dernier]);
        return j;
    }
    std::vector<long> triRapide(vector<long> *vec,int premier,int dernier)
    {
        if(premier<dernier)
        {
            int pivot=choix_pivot(premier, dernier);
            pivot=partitionner(&vec, premier, dernier, pivot);
            vec=triRapide(&vec, premier, pivot-1);
            vec=triRapide(&vec, pivot+1, dernier);
        }
        return vec;
    }
    std::vector<long> Nb_alea(long nb)
    {
        constexpr int max=1000;
        std::vector<long>tab_nb_alea;
        static std::mt19937 prng(std::random_device{}());
        static std::uniform_int_distribution<long> range(0, max-1);
        if(nb==0)
        {
            std::cout<<"Probleme, vous devez selectionner un nb superieur a 0!"<<std::endl;
        }else
        {
          for(int i=0; i<nb; i++)
          {
              tab_nb_alea.push_back(range(prng));
          }
        }
        return tab_nb_alea;
    }
    /*vector<long> tri_fusion(vector<long> vec, int nb, int *pointeur)
    {
        long *tab_pointeurs[nb];
    }*/
    et là les erreurs :
    Code:
    ||=== Build: Release in ProjetC++037_REVEILLAUD_Elie_Juin_2021 (compiler: GNU GCC Compiler) ===|
    C:\Users\Lenovo\OneDrive\Bureau\c\exo_listes_chainee\ProjetC++037_REVEILLAUD_Elie_Juin_2021\main.cpp||In function 'int main()':|
    C:\Users\Lenovo\OneDrive\Bureau\c\exo_listes_chainee\ProjetC++037_REVEILLAUD_Elie_Juin_2021\main.cpp|26|warning: unused variable 'fp' [-Wunused-variable]|
    C:\Users\Lenovo\OneDrive\Bureau\c\exo_listes_chainee\ProjetC++037_REVEILLAUD_Elie_Juin_2021\main.cpp||In function 'int partitionner(std::vector<long int>*, int, int, int)':|
    C:\Users\Lenovo\OneDrive\Bureau\c\exo_listes_chainee\ProjetC++037_REVEILLAUD_Elie_Juin_2021\main.cpp|57|error: no match for 'operator*' (operand type is 'std::vector<long int>')|
    C:\Users\Lenovo\OneDrive\Bureau\c\exo_listes_chainee\ProjetC++037_REVEILLAUD_Elie_Juin_2021\main.cpp|57|error: no match for 'operator*' (operand type is 'std::vector<long int>')|
    C:\Users\Lenovo\OneDrive\Bureau\c\exo_listes_chainee\ProjetC++037_REVEILLAUD_Elie_Juin_2021\main.cpp|61|error: no match for 'operator*' (operand type is 'std::vector<long int>')|
    C:\Users\Lenovo\OneDrive\Bureau\c\exo_listes_chainee\ProjetC++037_REVEILLAUD_Elie_Juin_2021\main.cpp|61|error: no match for 'operator*' (operand type is 'std::vector<long int>')|
    C:\Users\Lenovo\OneDrive\Bureau\c\exo_listes_chainee\ProjetC++037_REVEILLAUD_Elie_Juin_2021\main.cpp|63|error: no match for 'operator*' (operand type is 'std::vector<long int>')|
    C:\Users\Lenovo\OneDrive\Bureau\c\exo_listes_chainee\ProjetC++037_REVEILLAUD_Elie_Juin_2021\main.cpp|63|error: no match for 'operator*' (operand type is 'std::vector<long int>')|
    C:\Users\Lenovo\OneDrive\Bureau\c\exo_listes_chainee\ProjetC++037_REVEILLAUD_Elie_Juin_2021\main.cpp|67|error: no match for 'operator*' (operand type is 'std::vector<long int>')|
    C:\Users\Lenovo\OneDrive\Bureau\c\exo_listes_chainee\ProjetC++037_REVEILLAUD_Elie_Juin_2021\main.cpp|67|error: no match for 'operator*' (operand type is 'std::vector<long int>')|
    C:\Users\Lenovo\OneDrive\Bureau\c\exo_listes_chainee\ProjetC++037_REVEILLAUD_Elie_Juin_2021\main.cpp||In function 'std::vector<long int> triRapide(std::vector<long int>*, int, int)':|
    C:\Users\Lenovo\OneDrive\Bureau\c\exo_listes_chainee\ProjetC++037_REVEILLAUD_Elie_Juin_2021\main.cpp|75|error: no matching function for call to 'partitionner(std::vector<long int>**, int&, int&, int&)'|
    C:\Users\Lenovo\OneDrive\Bureau\c\exo_listes_chainee\ProjetC++037_REVEILLAUD_Elie_Juin_2021\main.cpp|10|note: candidate: 'int partitionner(std::vector<long int>, int, int, int)'|
    C:\Users\Lenovo\OneDrive\Bureau\c\exo_listes_chainee\ProjetC++037_REVEILLAUD_Elie_Juin_2021\main.cpp|10|note:   no known conversion for argument 1 from 'std::vector<long int>**' to 'std::vector<long int>'|
    C:\Users\Lenovo\OneDrive\Bureau\c\exo_listes_chainee\ProjetC++037_REVEILLAUD_Elie_Juin_2021\main.cpp|55|note: candidate: 'int partitionner(std::vector<long int>*, int, int, int)'|
    C:\Users\Lenovo\OneDrive\Bureau\c\exo_listes_chainee\ProjetC++037_REVEILLAUD_Elie_Juin_2021\main.cpp|55|note:   no known conversion for argument 1 from 'std::vector<long int>**' to 'std::vector<long int>*'|
    C:\Users\Lenovo\OneDrive\Bureau\c\exo_listes_chainee\ProjetC++037_REVEILLAUD_Elie_Juin_2021\main.cpp|76|error: no matching function for call to 'triRapide(std::vector<long int>**, int&, int)'|
    C:\Users\Lenovo\OneDrive\Bureau\c\exo_listes_chainee\ProjetC++037_REVEILLAUD_Elie_Juin_2021\main.cpp|11|note: candidate: 'std::vector<long int> triRapide(std::vector<long int>, int, int)'|
    C:\Users\Lenovo\OneDrive\Bureau\c\exo_listes_chainee\ProjetC++037_REVEILLAUD_Elie_Juin_2021\main.cpp|11|note:   no known conversion for argument 1 from 'std::vector<long int>**' to 'std::vector<long int>'|
    C:\Users\Lenovo\OneDrive\Bureau\c\exo_listes_chainee\ProjetC++037_REVEILLAUD_Elie_Juin_2021\main.cpp|70|note: candidate: 'std::vector<long int> triRapide(std::vector<long int>*, int, int)'|
    C:\Users\Lenovo\OneDrive\Bureau\c\exo_listes_chainee\ProjetC++037_REVEILLAUD_Elie_Juin_2021\main.cpp|70|note:   no known conversion for argument 1 from 'std::vector<long int>**' to 'std::vector<long int>*'|
    C:\Users\Lenovo\OneDrive\Bureau\c\exo_listes_chainee\ProjetC++037_REVEILLAUD_Elie_Juin_2021\main.cpp|77|error: no matching function for call to 'triRapide(std::vector<long int>**, int, int&)'|
    C:\Users\Lenovo\OneDrive\Bureau\c\exo_listes_chainee\ProjetC++037_REVEILLAUD_Elie_Juin_2021\main.cpp|11|note: candidate: 'std::vector<long int> triRapide(std::vector<long int>, int, int)'|
    C:\Users\Lenovo\OneDrive\Bureau\c\exo_listes_chainee\ProjetC++037_REVEILLAUD_Elie_Juin_2021\main.cpp|11|note:   no known conversion for argument 1 from 'std::vector<long int>**' to 'std::vector<long int>'|
    C:\Users\Lenovo\OneDrive\Bureau\c\exo_listes_chainee\ProjetC++037_REVEILLAUD_Elie_Juin_2021\main.cpp|70|note: candidate: 'std::vector<long int> triRapide(std::vector<long int>*, int, int)'|
    C:\Users\Lenovo\OneDrive\Bureau\c\exo_listes_chainee\ProjetC++037_REVEILLAUD_Elie_Juin_2021\main.cpp|70|note:   no known conversion for argument 1 from 'std::vector<long int>**' to 'std::vector<long int>*'|
    C:\Users\Lenovo\OneDrive\Bureau\c\exo_listes_chainee\ProjetC++037_REVEILLAUD_Elie_Juin_2021\main.cpp|79|error: could not convert 'vec' from 'std::vector<long int>*' to 'std::vector<long int>'|
    ||=== Build failed: 12 error(s), 1 warning(s) (0 minute(s), 0 second(s)) ===|

    -----

  2. #2
    pm42

    Re : problème de référencement en c++

    C'est principalement du au fait que tu ne maitrises pas les pointeurs.

    Par exemple, ligne 57 tu écris *vec[pivot] alors qu'il faut écrire (*vec)[pivot]. Cette erreur est présente plusieurs fois.

    Ligne 76 tu écris : vec=triRapide(&vec, premier, pivot-1);
    Sauf que triRapide attends un pointeur sur un vecteur, que vec est déjà un pointeur sur un vecteur et que tu reprends son adresse. Donc tu essaies de passer un pointeur sur un pointeur.
    Même chose ligne 79 où ta fonction est supposée renvoyer un vector<long> (ce qui implique une copie, mauvaise idée) mais tu renvoies un pointeur à l place.

    Dans ton cas, une solution serait d'utiliser des références plutôt que des pointeurs parce que c'est en fait ce que tu utilises.

    Après, il y a d'autres erreurs mais comprendre les concepts de type, ne pas mélanger différents niveaux d'indirection entre objet tel quel, pointeur, pointeur de pointeur (ou utiliser les références comme déjà dit) serait déjà une 1ère étape.

Discussions similaires

  1. Référencement
    Par Dan229 dans le forum Internet - Réseau - Sécurité générale
    Réponses: 10
    Dernier message: 19/12/2020, 06h37
  2. problème référencement google
    Par invite351dd20f dans le forum Internet - Réseau - Sécurité générale
    Réponses: 7
    Dernier message: 19/01/2015, 19h57
  3. referencement
    Par adrien dans le forum Internet - Réseau - Sécurité générale
    Réponses: 7
    Dernier message: 18/05/2005, 20h01