begin process at 2012 05 28 14:55:18
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Bug windows avec mon programme (nivo débutant)


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Bug windows avec mon programme (nivo débutant)

vendredi 20 mai 2005 à 14:54:24 | Bug windows avec mon programme (nivo débutant)

MATHIS49

Membre Club
Bonjour !
Etant un gros debutant en C je m'essai à faire un programme d'amortissement tout simple.
Mais le probleme c'est que windows plante lorsque je compile, ce plantage est intervenu apres la création d'une fonction "mois_translate" qui traduit le nombre de mois en lettre (ex : 12 = décembre).
J'ai cherché mais je n'ai pas trouvé mon erreur.
Pouvez vous m'aider ?

Merci

PS :  mon programme est bien sur pas fini du tout.

Mon code :

/*--------------------------------------------------------------------------*/
/* Nom du programme amor.c                                                  */
/*  Ce programme permet de calculer un amortissement sur plusieurs années   */
/*--------------------------------------------------------------------------*/

/*------------------------------*/
/* Fichiers inclus              */
/*------------------------------*/
#include <stdio.h>
#include <stdlib.h>


/*------------------------------*/
/* Définition des constantes    */
/*------------------------------*/
#define MAX  12
#define OUI  1
#define NON  0
#define TOT_MOIS  12

/*------------------------------*/
/* Variables                    */
/*------------------------------*/
char banque ;                     /*Stock le nom de la banque             */
long mont_pret;                   /*Stock le montant du pret              */
int  nb_annee;                    /*Stock le nombre d'années              */
int  deb_annee;                   /*Stock le debut de l'année             */
int  taux_pret;                   /*Stock le taux du pret en %            */
int  taux_assu;                   /*Stock le taux d'assurance vie en %    */
int  nb_mois;                     /*Stock le nombre de mois               */
char nom_mois[TOT_MOIS+1];        /*Stok le nom des mois +1 car tablo     */

int x,w ;                          /*compteurs*/
int cont;                          /*controle */

/*------------------------------*/
/* Prototypes des fonctions     */
/*------------------------------*/


void main(void);
void lecture(void);
void affiche_result(void);
int affiche_instruction(void);
int continuer(void);
char mois_translate(int);

/*------------------------------*/
/* Début du programme           */
/*------------------------------*/
void main(void)
{
     cont = affiche_instruction();
    
     if(cont== OUI)
     {
      lecture();
      affiche_result();
     }
     else
      printf("\nProgramme interrompu par l'utilisateur ! \n\n") ;
     
system("PAUSE");   
return 0;
}

/*------------------------------------------------------------*/
/* Fonction : affiche_instruction()                           */
/* Objectif : Affiche le mode d'emploi du programme et        */
/*            demande à l'utilisateur d'entrer 0 pour         */
/*            sortir ou 1 pour continuer                      */
/* Valeur renvoyées : NON si l'utilisateur tape 0             */
/*                    OUI si l'utilisateur tape un nombre     */
/*                        different de 0                      */
/*------------------------------------------------------------*/
int affiche_instruction(void)
{
    printf("\a\n\n");
    printf("\n################################################################");
    printf("\nCe programme vous permet de saisir le nombre d'année et");
    printf("\nle montant d'un capital à amortir et permet ainsi de");
    printf("\ncalculer et afficher un tableau d'amortissement sur x mois");
    printf("\n################################################################");
    printf("\n");
   
    cont = continuer();
   
    return(cont);
}

/*------------------------------------------------------------*/
/* Fonction : lecture()                                       */
/* Objectif : Cette fonction lit les données entrées par      */
/*            l'utilisateur relatif au pret.                  */
/* Valeurs renvoyées : aucune                                 */
/* Remarque : aucune                                          */
/*------------------------------------------------------------*/
void lecture(void)
{
         printf("\a\n--------------------------------------------");
         printf("\nEntrez les informations relatif au pret   ");
         printf("\n--------------------------------------------\n\n");        

         printf("\n\tEntrer le nom de la banque : ");
         scanf("%s",&banque);
        
         printf("\n\tEntrer le montant du pret : ");
         scanf("%d",&mont_pret);

         printf("\n\tEntrer lannée de début de l'amortissement : ");
         scanf("%d",&deb_annee);

         printf("\n\tAmortissement sur combien d'année ? : ");
         scanf("%d",&nb_annee);
     
         printf("\n\tEntrer le taux du pret : ");
         scanf("%d",&taux_pret);

         printf("\n\tEntrer le taux de l'assurance vie : ");
         scanf("%d",&taux_assu);

        

}        

/*------------------------------------------------------------*/
/* Fonction : affiche_result()                                */
/* Objectif : affiche le résultat des calcules à l'écran      */
/* Valeurs renvoyées : aucunes                                */
/*------------------------------------------------------------*/
void affiche_result()
{
  
    for (w=0; w<= nb_annee ; w++,deb_annee++) /* boucle année */
    {  
       
   
             for (x=1; x<= TOT_MOIS ; x++) /* boucle mois */
             {                          
             printf("\n%s / %d :",mois_translate(x),deb_annee) ;
             /*Affichage nom du mois et année */
             }
            
   
    }
}
/*------------------------------------------------------------*/
/* Fonction : mois_translate()                                */
/* Objectif : affiche le nom d'un mois                        */
/* Valeurs renvoyées : aucunes                                */
/*------------------------------------------------------------*/
char mois_translate(int mois)
{
nom_mois[1]="janv";
nom_mois[2]="fevr";
nom_mois[3]="mars";
nom_mois[4]="avri";
nom_mois[5]="mai";
nom_mois[6]="juin";
nom_mois[7]="juil";
nom_mois[8]="aout";
nom_mois[9]="setp";
nom_mois[10]="octo";
nom_mois[11]="nove";
nom_mois[12]="dece";

return nom_mois[mois] ;

}
/*------------------------------------------------------------*/
/* Fonction continuer()                                       */
/* Objectif : cette fonction demande à l'utilisateur s'il     */
/*            veut continuer                                  */
/* Valeurs renvoyées : OUI si l'utilisateur désire poursuivre */
/*                     NON si l'utilisateur veut sortir       */
/*------------------------------------------------------------*/   
int continuer(void)
{
    printf("\a\n\nVoulez vous continuer ? (0=non / 1=oui) :");
    scanf("%d", &x) ;
   
    while (x < 0 || x>1)
    {
          printf("\n%d est erroné !", x);
          printf("\nEntrez 0 pour sortir ou 1 pour continuer :");
          scanf("%d",&x);
    }
   
    if(x == 0)
    return(NON) ;
    else
    return(OUI) ;
}





vendredi 20 mai 2005 à 14:59:31 | Re : Bug windows avec mon programme (nivo débutant)

MATHIS49

Membre Club
OUPS ! Je rectifie, le bug ne vient pas suite à la compilation mais après que la fonction "lecture" est fini sa tache.
Merci
vendredi 20 mai 2005 à 17:16:55 | Re : Bug windows avec mon programme (nivo débutant)

mezaya

attention a ta variable nom_mois. tu la construit comme un tableau de 13 caractères. alors que je pense que tu veut un tableau de 13 chaine de caractères. le mieux pour résoudre ton probleme c'est de créer un seul tableau de 50 caractères par exemple et de copier les noms des mois dans ton tableau avec strcpy().

Exemple :

char nom_mois[50];

char* mois_translate(int mois)
{
strcpy( nom_mois , "janvier" );
strcpy( nom_mois , "fevrier" );
...   // continue pour tout les mois

return nom_mois;
}

Attention regarde bien le fonctionnement des chaines de caractères en C.


Voili,Voilou
vendredi 20 mai 2005 à 17:19:43 | Re : Bug windows avec mon programme (nivo débutant)

mezaya

oups je suis allez trop vite pour te répondre il faut faire des test avant de copier le bon mois.

ex :


... // fonction mois_translate
if( mois == 1 )
    strcpy( nom_mois , "janvier" );
if( mois == 2 )
    strcpy( nom_mois , "fevrier" );
.. // continue comme ça pour les autres mois



Voili,Voilou
vendredi 20 mai 2005 à 17:52:31 | Re : Bug windows avec mon programme (nivo débutant)

MATHIS49

Membre Club

Bah pourquoi ca marche pas avec ma méthode? Peux tu m'expliquer ? Merci

vendredi 20 mai 2005 à 18:01:30 | Re : Bug windows avec mon programme (nivo débutant)

Joky

Membre Club
Quand tu veux acheter un snickers à 1 €uro ( oui je sais c'est cher ), bé tu mets pas 10 € dans la machine
La tu veux mettre plusieur caractere "janvier" ( 7 ici + le caractère de fin de chaine donc 8 jpense ) et donc tu veux stocker tout ça dans une variable qui peut contenir qu'un seul caractere.

Donc moi j'aurais proposé avec un switch moins lourd comme méthode.

char Buff[256];

switch(mois)
{
      case 1:
            strcpy( Buff, "Janvier");
            break;

   etc...
}

et comme dis au dessus une fonction du type char* qui renvoi un tableau de caractère et non un seul

void Aurevoir( void ); //Bonne journée

vendredi 20 mai 2005 à 18:03:04 | Re : Bug windows avec mon programme (nivo débutant)

Joky

Membre Club


void Aurevoir( void ); //Bonne journée

vendredi 20 mai 2005 à 18:06:48 | Re : Bug windows avec mon programme (nivo débutant)

mezaya

ton "janv" est alloue par le compilateur automatiquement. quand tu fait mom_mois[1] = "janv" en faite tu récupère l'adresse ou est alloué la chaine "janv". une adresse est codé sur 4 octets ton char est sur 1 octects. donc quand tu fait ça 3 octets déborde. pour l'index 1  du tableau cela va déborder sur les index 2 ,3 ,4 tu tableaux. mais pour l'index 10 et suivant cela va déborder en dehors de ton tableaux et donc de la mémoire non alloué par ton programme donc très souvent erreur d'adresse = plantage.

Les chaines de caractères en C sont assez compliqué il font appel au pointeur. donc si tu veut plus d'information ou si ce que j'ai dit n'est pas trop clair regarde une source qui explique bien les pointeurs et chaine de caractères


Voili,Voilou
vendredi 20 mai 2005 à 20:38:46 | Re : Bug windows avec mon programme (nivo débutant)

dan34

Si tu veux garder ta structure tu peux faire la chose suivante :
char** nom_mois[TOT_MOIS+1][5];        /*Stok le nom des mois +1 car tablo     */

- Tu met TOT_MOIS +1 parce qu'un tableau commence à 0 et que tu ne l'utilise pas puisque les mois commencent à 1.
- Tu met 5 dans les deuxième crochet parceque tu utilise 4 caractères du mois + le caractère de fin de chaine de texte qui est le code ASCII 0 ou '\0' en char (si tu reste comme ça tu peux en mettre un nombre plus grand mais ça ne sert à rien et sa bouffe de la memoire pour rien)

En fait là on vient de créer un tableau de pointeur pointant sur une chaine de caractère, une chaine de caractère étant un tableau a elle seule

Ensuite tu initialise ton tab au début du prog comme ça tu le fais qu'une fois avec
nom_mois[1]="janv";
nom_mois[2]="fevr";
nom_mois[3]="mars";
nom_mois[4]="avri";
nom_mois[5]="mai";
nom_mois[6]="juin";
nom_mois[7]="juil";
nom_mois[8]="aout";
nom_mois[9]="setp";
nom_mois[10]="octo";
nom_mois[11]="nove";
nom_mois[12]="dece";

Et ta fonction devient :
char* mois_translate(int mois)
{
   return nom_mois[mois] ;
}

pour récupérer le mois tu crée une variable en char* par exemple szMois (le sz c'est pour string donc chaine de caractère finissant par zéro du moins je crois)

et tu appele ta fonction en faisant
szMois = mois_translate(3);   // Par exemple

et tu récupère mars dans ta variable que tu peux afficher avec printf telle quelle avec le %s comme d'habitude.

Si tu choisi cette sol et que tu as des questions n'hésite pas

Dan34
vendredi 20 mai 2005 à 20:46:07 | Re : Bug windows avec mon programme (nivo débutant)

MATHIS49

Membre Club
Désolé j'ai commencé à essayer de programmer en php et php est carrement moins contraignant.
Donc je savais pas qu'on pouvais pas stocké une chaine de caractere dans un tableau en C.
Merci et vive worms et les snickers à 1€ ;)

1 2

Cette discussion est classée dans : affiche, int, printf, void, mois


Répondre à ce message

Sujets en rapport avec ce message

bitte hilfe!!!!!!!!! [ par sansan_2 ] Bonjour!!!!!!!! le programme c est un FIFO (ringpufffer) et j aimerais avoir une amelioration. Apres execution du programme, faire une tabulation, un Pbm de spawning sur un prog de classe? [ par romca ] J'ai un exo et le programme est le suivant en bas. Il n'est pas complété c'est normal, c'est le but de l'exercice,(merci de ne pas me le compléter).Ma Afficher un float a l'ecran, %f de printf [ par kaervas ] Bonjour, je suis en train de coder la fonction %f de printf, je galere un peu en fait! Pour le %d on utilise des modulos et des puissances decroissant calendrier [ par chinois57 ] bjr tt le monde mon prof de math ma demander de faire un calendier perpituel en C mais je coince un peu bcp "please help me" ma source est :#include # programmation en C [ par badramus ] Bonjour voici  le programme que j'ai pu faire mais ça ne marche comme je le souhaite. veuillez m'aidez a reoudre ce problème.voici le programme       Equation du 3éme degrée [ par jeanphilippe37 ] Slt, je t'envoie le programme de maths, ms j'ai essayé de mettre un system(pause) ms cela me fou une erreur de compilation. Pourré-tu me dire Langage C : Puissance 4 [ par breakeur59150 ] Bonjour à tous,j'ai une ou deux question à vous poser, je suis en train de faire le jeu puissance 4 en langage c sous borland C, C'est un projet que l aide [ par achrafgassolina ] salut tout le monde la j ai une érreure et je c pas comment la resoudre dans la ligne 296:36 dans la condition if et aprés je veux faire la saisie des Afficher unTriangle de Pascal en language C [ par shaqe80 ] shaqe80,s'il vous y aurait il quelqu'un de bienveillant pour m'aider à rabibocher ce programme?#include #include #define PMAX 13 tri d'un tableau de struct [ par sdiri_med ] Salut à tous j'ai un petit problème de tri d'un tableau de structurede but d'extraire l'employer le plus âgé Pouvez-vous m'aider s.v.p a résoudre se


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,760 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales