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 :

Problème de cast/conversion ?!


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut Problème de cast/conversion ?!
    Bonjour,

    Au moment d'initialiser la structure hall de type level dans le main, quand je l'affiche, j'ai des valeurs différentes de ce qui devrait être ! Si je l'affiche c'est parce que je me suis rendu compte qu'il y avait une erreur dans les résultats. Et ça viendrait donc bien d'ici.

    Pourtant j'ai fais attention d'avoir toujours le même type de variable quand je fais le calcul.

    C'est dans cette fonction que je fais le calcul

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void initLevelStructure( level hall, float fieldNumbers )
    {
        float j = (1.+0.05*fieldNumbers);
     
        unsigned int i;
        for ( i=0 ; i<=10 ; i++ )
        {
            hall.village[i] =  25000.*(float)i*j;
            hall.town[i]    =  50000.*(float)i*j;
            hall.city[i]    =  75000.*(float)i*j;
            hall.capitol[i] = 100000.*(float)i*j;
        }
    }
    Qu'est ce que j'ai raté ?

    Merci d'avance

    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
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct
    {
        float village[10];
        float town[10];
        float city[10];
        float capitol[10];
    }level;
     
    void initLevelStructure( level hall, float fieldNumbers )
    {
        float j = (1.+0.05*fieldNumbers);
     
        unsigned int i;
        for ( i=0 ; i<=10 ; i++ )
        {
            hall.village[i] =  25000.*(float)i*j;
            hall.town[i]    =  50000.*(float)i*j;
            hall.city[i]    =  75000.*(float)i*j;
            hall.capitol[i] = 100000.*(float)i*j;
        }
    }
     
    float getTaxRate ( level hall, unsigned int hallLevel, unsigned int armysPower )
    {
        float taxRate[10];
        taxRate[0] = 0;
        taxRate[1] = 0.0096;
        taxRate[2] = 0.0204;
        taxRate[3] = 0.0324;
        taxRate[4] = 0.0456;
        taxRate[5] = 0.06;
        taxRate[6] = 0.0756;
        taxRate[7] = 0.0924;
        taxRate[8] = 0.1104;
        taxRate[9] = 0.1296;
        taxRate[10] = 0.15;
     
        if ( hallLevel == 1 )
        {
            int i;
            for ( i=0 ; i<10 ; i=i+2 )
            {
                if ( hall.village[i] <= (float)armysPower && (float)armysPower < hall.village[i+1] )
                {
                    printf("\n %f && %f => %f", hall.village[i], hall.village[i+1], taxRate[i]);
                    return taxRate[i];
                }
            }
        }
     
        else if ( hallLevel == 2 )
        {
            int i;
            for ( i=0 ; i<10 ; i=i+2 )
            {
                if ( hall.town[i] <= (float)armysPower && (float)armysPower < hall.town[i+1] )
                {
                    return taxRate[i];
                }
            }
        }
     
        else if ( hallLevel == 3 )
        {
            int i;
            for ( i=0 ; i<10 ; i=i+2 )
            {
                if ( hall.city[i] <= (float)armysPower && (float)armysPower < hall.city[i+1] )
                {
                    return taxRate[i];
                }
            }
        }
     
        else if ( hallLevel == 4 )
        {
            int i;
            for ( i=0 ; i<10 ; i=i+2 )
            {
                if ( hall.capitol[i] <= armysPower && armysPower < hall.capitol[i+1] )
                {
                    printf("\n %f && %f => %f", hall.village[i], hall.village[i+1], taxRate[i]);
                    return taxRate[i];
                }
            }
        }
     
        else
        {
        printf("\n ERREUR : Valeur incorrecte pour le niveau du village\n");
        return -100000;
        }
    }
     
    unsigned int getMaintenancesCost ( level hall, unsigned int armysPower, unsigned int hallLevel, unsigned int sphinxNumbers, float tenancierBonus )
    {
        float taxRate = getTaxRate( hall, hallLevel, armysPower );
     
        return (unsigned int)(taxRate*armysPower*( 1-(tenancierBonus+sphinxNumbers*0.05) ));
    }
     
    int main(void)
    {
        system("title Calcul cout maintenance par _00");
        system("mode con cols=50 lines=35");
        unsigned int hallLevel    = 0;
        unsigned int armysPower   = 0;
        float fieldNumbers = 0;
        unsigned int sphinxNumbers = 0;
        float tenanciersBonus = 0;
     
        printf("\n_________________________________________________\n");
        printf("\n Conseil du Village -> 1 ");
        printf("\n Mairie             -> 2 ");
        printf("\n Hotel de ville     -> 3 ");
        printf("\n Capitol            -> 4 ");
        printf("\n\n - Niveau de la ville ? ");
        scanf("%d", &hallLevel );
        printf("\n_________________________________________________\n\n");
        printf(" - Puissance de l'armee ? ");
        scanf("%d", &armysPower );
        printf("\n_________________________________________________\n\n");
        printf(" - Nombre de champs ? ");
        scanf("%f", &fieldNumbers );
        printf("\n_________________________________________________\n\n");
        printf(" - Nombre de sphinxs ? ");
        scanf("%d", &sphinxNumbers );
        printf("\n_________________________________________________\n\n");
        printf(" - bonus tenancier ? ");
        scanf("%f", &tenanciersBonus );
        printf("\n_________________________________________________\n\n");
     
        level hall;
        initLevelStructure( hall, fieldNumbers );
     
        int i;
        for ( i=0 ; i<=10 ; i++ )
        {
            printf("\n v = %d ", (int)hall.capitol[i]);
        }
     
     
     
        printf(" MAINTENANCE = %d or", getMaintenancesCost ( hall, armysPower, hallLevel, sphinxNumbers, tenanciersBonus ) );
        printf("\n_________________________________________________\n\n");
     
        return 0;
    }

  2. #2
    Membre très actif
    Avatar de TheDrev
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Par défaut
    Ta fonction initLevelStructure prend en parametre une structure de type level par valeur : ta va donc initialiser une copie en memoire de ta structure.
    La solution est de passer l'adresse de ta structure pour effectivement la modifier.

    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
     
    void initLevelStructure( level *hall, float fieldNumbers )  //attendre un pointeur de level
    {
        float j = (1.+0.05*fieldNumbers);
     
        unsigned int i;
        for ( i=0 ; i<=10 ; i++ )
        {
            hall->village[i] =  25000.*(float)i*j;   //la -> signifie acceder a la valeur pointé par ton pointeur (déreferance)
            hall->town[i]    =  50000.*(float)i*j;
            hall->city[i]    =  75000.*(float)i*j;
            hall->capitol[i] = 100000.*(float)i*j;
        }
    }
     
    int main (){
      level hall;
       initLevelStructure(&level, x);
     
    }
    Cette entrée dans la faq explique très bien comment proceder : http://c.developpez.com/faq/?page=fo..._par_reference

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    De plus, à de nombreux endroits, tu débordes de tes tableaux.

    Juste deux exemples.

    On voit ceci à de nombreux endroits :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ( i=0 ; i<=10 ; i++ )
    Là, pareil, tu débordes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    float taxRate[10];
    (...)
    taxRate[10] = 0.15;
    etc.

  4. #4
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut
    OUla ouai, faut que j'aille dormir moi. Merci ^^

  5. #5
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void initLevelStructure( level hall, float fieldNumbers )
    ....
    Ici, dans cette fonction, tu vas modifier la copie locale (hall) passée en argument de la fonction, pas la structure d'origine.

    Tu dois passer l'adresse du level à modifier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void initLevelStructure( level * hall, float fieldNumbers )
    { 
    ....
         hall->village[i] =  25000.*i*j;
    ....
    }
    int main(void)
    {
    .....
        level hall;
        initLevelStructure( &hall, fieldNumbers );
    .....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [CASTS]problème de cast de Time
    Par DeVoN dans le forum Langage
    Réponses: 7
    Dernier message: 22/02/2006, 17h24
  2. [JDBC Driver][JSTL] Problème de cast de données
    Par GyLes dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 27/09/2005, 10h00
  3. problème de cast!
    Par LaseLiep dans le forum Langage
    Réponses: 3
    Dernier message: 03/06/2005, 09h30
  4. Problème de cast/serialization/externalization ?
    Par Linlin dans le forum CORBA
    Réponses: 1
    Dernier message: 06/12/2004, 16h46
  5. [C#] Problème de casting de @IDENTITY
    Par bilb0t dans le forum Accès aux données
    Réponses: 7
    Dernier message: 03/09/2004, 09h42

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