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 :

Fonction - Erreur : conflicting types


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2010
    Messages : 63
    Par défaut Fonction - Erreur : conflicting types
    Bonjour,
    J'ai écrit le code suivant (je poste la version simplifiée, l'originale étant très longue).

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
     
    #include <stdio.h>
     
    struct options {
                        float ass_annul;
                         };
    struct vol {
                 int num_vol;
                 char aero_dep[30];
                 char aero_des[30];
                  };
    float calcul_prix();
    struct vol tabvols[100];
    float recup_prix_vol();
    struct options tarif_option;
    struct options taboptions[1];
     
    main()
    {
        float prix_base = 50, index = 2, prix_total;
        printf("recup prix \n");
        /* Récupération du prix de base du numéro de vol 1111 */
        prix_base = recup_prix_vol(1111)
     
        prix_total = calcul_prix(prix_base, 2.5);
        printf("prix total : %4.2f", prix_total);
    }
     
    float calcul_prix(float prix_base, float index)
    {
    float ass_annul, prix_supp, prix_total, prix_resa;
    char bidon; // Variable de vidage du buffer
    char rep;
     
    /* ---- Calcul prix total TTC hors options ---- */
    prix_total = prix_base * index;
    printf("Prix TTC %4.2f", prix_total);
     
    /* ---- Déclaration des options ---- */
    printf("Déclarer des options pour ce passager ? (O/N)");
    scanf("%c", rep);
     
    if(rep == 'O')
    {
        FILE *ftarif;
        int temp1;
     
        /* ---- Chargement du fichier des tarifs ---- */
        ftarif = fopen("tarifs_options", "r");
            if(ftarif == NULL)
            {
                printf("Problème d'accès au fichier.\n");
            }
            else
            {
                while(!feof(ftarif))
                {
                        temp1 = fscanf(ftarif, "%f", &tarif_option.ass_annul);
     
                    if(temp1 != EOF)
                    {
     
                       taboptions[0] = tarif_option;
                    }
                }
            }
        fclose(ftarif);
     
        // Assurance annulation
        printf("\n\nSouscrire à une assurance annulation ? (O/N) : ");
        scanf("%c", &rep);
        bidon=getchar();
     
            if (rep == 'O')
            {
                ass_annul=taboptions[0].ass_annul;
                printf("Assurance annulation souscrite\n");
     
            }
            else
            {
                ass_annul=0;
                printf("Assurance annulation non souscrite\n");
            }
     
     
        /* --- Affichage des options prises ---- */
        printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
        printf("Assurance annulation : %-4.2f\n", ass_annul);
     
        prix_supp = ass_annul ;
     
        printf("\n\nMontant total, par passager, des options prises : %-4.2f", prix_supp);
    }
    else 
    {
        prix_supp = 0;
        printf("Aucune option choisie\n");
    }
     
    /* Renvoi du prix total par passager */
    prix_resa = prix_supp + prix_total;
    return prix_resa;
    }
     
    float recup_prix_vol(int numvol)
    {
    // Recherche dans le fichier des vols, retrouve le numéro de vol souhaité et retourne son prix 
    // Pour simplifier le code posté, je mets directement le résultat
     
               prix_base = 50.00;
               return tabvols[j].prix_base;
    }


    Je bosse avec Codeblocks. Quand je compile, j'ai l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    |22|error: conflicting types for 'calcul_prix'|
    |23|note: an argument type that has a default promotion can't match an empty parameter name list declaration|
    |9|note: previous declaration of 'calcul_prix' was here|
    Je n'arrive pas à voir ce qui cloche ! Pouvez-vous m'aider ?

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 309
    Billets dans le blog
    5
    Par défaut
    Ajoute un point après chaque nombre transmis en littéral :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    prix_total = calcul_prix(50.0, 2.0);

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    float calcul_prix(float prix_base, float index) //ligne 22
    {
          //....
    }
    a pour prototype :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    float calcul_prix(float prix_base, float index);
    et non celui que tu as mis ligne 9

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    float calcul_prix();

  4. #4
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2010
    Messages : 63
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    float calcul_prix(float prix_base, float index) //ligne 22
    {
          //....
    }
    a pour prototype :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    float calcul_prix(float prix_base, float index);
    et non celui que tu as mis ligne 9

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    float calcul_prix();
    Merci pour ta réponse.
    Pourrais-tu être plus explicite s'il te plaît ?

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Citation Envoyé par Mélodie_et_rythmes Voir le message
    Pourrais-tu être plus explicite s'il te plaît ?
    Simple : tu commences par déclarer ta fonction « calcul_prix() » comme ne recevant aucun argument alors qu'au moment de l'utiliser, tu lui en passes deux.

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Le prototype d'une fonction doit avoir : la valeur retournée, le nom de la fonction ainsi que les paramètres de la fonction.

    une fonction déclarée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int maFonction();
    //ou
    int maFonction(void);
    Ne pourra être utilisée que comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int maFonction()
    {
     
    }
    //appel :
    maFonction();
    EDIT : le temps d'écrire que qu'Obsidian a déjà répondu^^

  7. #7
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2010
    Messages : 63
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Ajoute un point après chaque nombre transmis en littéral :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    prix_total = calcul_prix(50.0, 2.0);
    Dans mon code (version longue), les deux paramètres sont des résultats float retournés par des fonctions de type float également. j'ai tout de même cette erreur...
    J'ai édité mon code afin que tu y voies plus clair

  8. #8
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 309
    Billets dans le blog
    5
    Par défaut
    Je confirme les dires des autres contributeurs. Il faut absolument que les prototypes des fonctions soient en adéquation avec leur déclaration.
    Au début de ton code la déclaration calcul_prix(); ne correspond pas à son implantation. Corrige ce petit problème et les choses devraient rentrer dans l'ordre.

  9. #9
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2010
    Messages : 63
    Par défaut
    Merci à tous pour vos réponses.
    En effet, en suivant vos conseils, maintenant ça compile sans erreurs.

    Mais néanmoins, je souhaiterais en savoir davantage.
    En effet, c'est bizarre, j'ai écrit d'autres fonctions en les déclarant comme je l'ai fait dans (le premier code que j'ai posté, et ça marche nickel.
    La seule différence étant que ces autres fonctions revoient des int ou des float et qu'elles prennent en paramètres des int.

    ça serait donc ça le souci ? Le fait que ma fonction ci-dessus prenne en paramètre des float, fait qu'il faut absolument le préciser au niveau des déclarations ?

  10. #10
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    @Neckara : En C, float calcul_prix();n'est pas un prototype et n'est pas équivalent à float calcul_prix(void);qui, lui, en est un.
    C'est une déclaration de fonction dont on ne précise pas les paramètres (et non pas qui n'a pas de paramètres).

    Dans ce cas, lorsque la fonction va être appelée, la nature des paramètres n'étant pas précisée, les arguments vont être promus à un type par défaut. Ansi, si je passe un flottant, le type par défaut est double.
    Dans ce cas, les deux déclarations
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    float calcul_prix(); 
    float calcul_prix(float prix_base, float index)
    {
    ....
    }
    sont incompatibles : d'après la première déclaration, les arguments ne peuvent être float (mais peuvent être double)
    Le problème ne se serait pas manifesté avec les déclarations
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    float calcul_prix(); 
    float calcul_prix(double prix_base, double index)
    {
    ....
    }
    Ceci pour expliquer le diagnostic.

    En conclusion, il faut toujours spécifier les prototypes donc mettre la liste des types des paramètres ainsi que le type de retour de la fonction. Les omettre est aujourd'hui un comportement obsolète et un archaïsme.
    C'est valable ici aussi
    qui doit être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int main(void)
    {
    ....

Discussions similaires

  1. Erreur : Conflicting types
    Par Mmemykon dans le forum C
    Réponses: 10
    Dernier message: 17/06/2015, 14h23
  2. Erreur de type dans ma fonction
    Par adriennoob dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 19/04/2010, 11h11
  3. Conflicting types dans fonction déclarée
    Par Spikeuh dans le forum C
    Réponses: 8
    Dernier message: 22/06/2008, 17h49
  4. Erreur de type pour la fonction CStringArray::Add
    Par crossrobotik dans le forum MFC
    Réponses: 9
    Dernier message: 11/06/2007, 10h05
  5. [appel de fonction]Erreur bizarre
    Par DEC dans le forum ASP
    Réponses: 4
    Dernier message: 10/08/2004, 17h08

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