Le programme plante à la fin

Résolu
cs_deguelator Messages postés 6 Date d'inscription dimanche 13 mai 2007 Statut Membre Dernière intervention 28 août 2007 - 28 août 2007 à 11:07
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 - 28 août 2007 à 18:31
Bonjour à tous. J'ai posté ce messange en espérant que vous puissiez m'aider sur un problème que je n'arrive pas à résourdre.
Le programme permet de creer des pages HTML. J'utilise la bibliothèque Malloc (avec gets) pour récuperer les données nécéssaires. Le programme fonctionne correctement mais en sortie de boucle FOR, le programme plante. Le code en bleu vous pouvez laisser tomber. Le code qui me semble fautif est souligné à la fin.

MERCI.


<hr />


#include <stdio.h>
#include <conio.h>
#include <malloc.h>
#include <string.h>

int main()
{
        /*
   Déclaration de l'ensemble des variables
   */
  
   char *nom_de_la_page, *titre_de_la_page, *localisation, *description, *image, *image2, *image3, *description_detaillee ,    *en_savoir_plus;
   char *commentaire1, *commentaire2, *commentaire3;
   int prix, reference, surface_terrain, surface_habitable, nombre_de_produit , nombre_reference;
  
   nom_de_la_page = (char *)malloc(15);
   titre_de_la_page = (char *)malloc(15);
   localisation = (char *)malloc(15);
   description = (char *)malloc(25);
   image = (char *)malloc(15);
   description_detaillee = (char *)malloc(200);
   en_savoir_plus = (char *)malloc(15);
   image2 = (char *)malloc(15);
   image3 = (char *)malloc(15);
   commentaire1 = (char *)malloc(15);
   commentaire2 = (char *)malloc(15);
   commentaire3 = (char *)malloc(15);
  
   nombre_reference = 0;
  
  
 
   /*
   Debut du traitement
   */
  
   puts("\nCombien de produits desirez-vous ajouter?");
   scanf("%d",&nombre_de_produit);
  
   fflush(stdin);
  
  
   puts("\nSaisir le nom de la page:");
   gets(nom_de_la_page);
  
   puts("\nSaisir le titre de la page:");
   gets(titre_de_la_page);
  
  
   /*Creation du listing*/
   printf("\n\tCreation de la page %s",nom_de_la_page);
                                        
   char filename[255];
             
   FILE *fichier;
   sprintf((char *) &filename,"%s.html",nom_de_la_page);
   fichier = fopen(filename,"w");
                                                
   if(fichier == NULL)
   {
              puts("\n\t\t---->LA PAGE HTML N'A PU ETRE CREE");
              fclose(fichier);
   }
                                                
   else
   {
              puts("\n\t\t---->CREATION DE LA PAGE HTML REUSSIE");
   }
                                        
 
  
   for(nombre_reference = 0;nombre_reference < nombre_de_produit;nombre_reference++)
   {
                                        
                                         /*Saisie des variables de type caractère*/
                                        
                                         puts("\nSaisir la localisation du produit:");
                                         gets(localisation);
                                        
                                         puts("\nSaisir une description succinte du produit:");
                                         gets(description);
                                        
                                         puts("\nSaisir le nom de l'image a afficher en indiquant son format:");
                                         gets(image);
                                        
                                         puts("\nSaisir la description detaillee du produit:");
                                         gets(description_detaillee);
                                        
                                         puts("\nSaisir le nom de la page 'en savoir plus'");
                                         gets(en_savoir_plus);
                                        
                                         puts("\nDonnez les noms de image2 et 3 puis des comm:");
                                         gets(image2);
                                         gets(image3);
                                         gets(commentaire1);
                                         gets(commentaire2);
                                         gets(commentaire3);
                                        
                                        
                                         /*Saisie des variables de type entiers*/
                                         puts("\nSaisir la surface habitable");
                                         scanf("%d",&surface_habitable);
                                        
                                         puts("\nSaisir la surface du terrain:");
                                         scanf("%d",&surface_terrain);
                                        
                                         puts("\nSaisir la reference du produit:");
                                         scanf("%d",&reference);
                                        
                                         puts("\nSaisir le prix:");
                                         scanf("%d",&prix);
                                        
                                        
                                                  /*
                                                     Ecriture dans le listing
                                                  */
      
       fprintf(fichier,"<HTML>\n<HEAD>\n<TITLE>%s</TITLE>\n</HEAD>",nom_de_la_page);
       fprintf(fichier,"\n");
       fprintf(fichier,"\n AGENCE DOMIMMO ");
       fprintf(fichier,"\nTéléphone: 06 98 84 38 00
Fax: 04 93 42 34 66
Mail:

[mailto:agencedomimmo@free.fr



]

>");
       fprintf(fichier,"\n<CENTER>");
       fprintf(fichier,"\n\t[mailto:agencedomimmo@free.fr



]

>");
       fprintf(PLUS,"\n<CENTER>");
       fprintf(PLUS,"\n\tAPPARTEMENTS");
       fprintf(PLUS,"\n\tMAISONS DE VILLAGE
\n\tVILLAS\n\tLOCATIONS\n\tTERRAINS\n\tNEUFS\n\tNOUS CONTACTER\n</CENTER>");
       fprintf(PLUS,"<CENTER> FLATS\tHOUSES\tVILLAS\tLOCATIONS\tLANDS\tNEUFS\tCONTACT US </CENTER>");
       fprintf(PLUS,"\n
\n<CENTER>%s</CENTER>\n

",titre_de_la_page);
       fprintf(PLUS,"\n<CENTER>\n\n----
\n\t%s, \",localisation);
       fprintf(PLUS,\"\n%s, \",description);
       fprintf(PLUS,\"\n\n----
\n\n<form name ='formname'>\n
<center><table cellspacing='1' cellpadding='4' bgcolor='#000000'>");
       fprintf(PLUS,"\n----, \n\",image);
       fprintf(PLUS,\"\n</TD>\n\n ----
\n<select name='slide' onChange='change();' size='1'>");
       fprintf(PLUS,"\n<option value='/image/%s' selected>%s</option>",image,commentaire1);
       fprintf(PLUS,"\n<option value='/image/%s'>%s</option>",image2,commentaire2);
       fprintf(PLUS,"\n<option value='/image/%s'>%s</option>",image3,commentaire3);
       fprintf(PLUS,"\n</select>\n, \n\n----
\n");
       fprintf(PLUS,"\n");
       fprintf(PLUS,"\n");
       fprintf(PLUS,"\n' style='border:1 SOLID #e6e6e6;'>");
       fprintf(PLUS,"\n>' title='>>' style='border:1 SOLID #e6e6e6;'>");
       fprintf(PLUS,"\n, \n\n</TD>\n
\n</center>\n
\n</form>\n<!-- FIN DU SCRIPT DIAPORAMA-->");
       fprintf(PLUS,"\n\n<TD width=500 valign='top'  bgcolor='#9966FF'>");
       fprintf(PLUS,"\n\t\tVille: %s
",localisation);
       fprintf(PLUS,"\n\t\tType: %s
",titre_de_la_page);
       fprintf(PLUS,"\n\t\tSurface habitable: %ld m²
",surface_habitable);
       fprintf(PLUS,"\n\t\tSurface terrain: %ld m²
",surface_terrain);
       fprintf(PLUS,"\n\t\tRéférence: %d
",reference);
       fprintf(PLUS,"\n\t\tPrix: %ld euros
",prix);
       fprintf(PLUS,"\n

\n<CENTER>\n<HR width= 200>\n</CENTER>%s",description_detaillee);
       fprintf(PLUS,"\n

\n RETOUR A LA PAGE  PRECEDENTE</gras> ");
       fprintf(PLUS,"\n

\n<FORM action ='/repertoire/formulaire.html' name='eform' onSubmit='lance(document.eform.nombre);return false'>Référence :<SELECT name='nombre' size='1'>\n<OPTION value='%d'> %d</OPTION>",reference,reference);
       fprintf(PLUS,"\n</SELECT>\n\n</FORM>\n\n</TD>\n</TR>\n</TABLE>\n</CENTER>\n\n</HTML>");
      
       fclose(PLUS);
 
       fflush(stdin);
 
       free(localisation);
       free(description);
       free(image);
       free(image2);
       free(image3);
       free(description_detaillee);
       free(en_savoir_plus); 
       free(commentaire1);                                   
       free(commentaire2);
       free(commentaire3);
      
       printf("\n\tCREATION DE LA PAGE %s ACHEVEE\n",en_savoir_plus);
   }
      
   puts("\n\n\t\tSORTIE DE LA BOUCLE for");
   getch();  
      
   fprintf(fichier,"\n\n\n</HTML>");
   
   /*On ferme les fichiers*/
   fclose(fichier);
   
   /*On libère la mémoire*/
   free(nom_de_la_page);
   free(titre_de_la_page);
   free(localisation);
   free(description);
   free(image);
   free(image2);
   free(image3);
   free(description_detaillee);
   free(en_savoir_plus); 
   free(commentaire1);                                   
   free(commentaire2);
   free(commentaire3);
   
   puts("\n\n\tFERMETURE DU FICHIER EFFECTUEE");
  
   getch();
}

11 réponses

cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
28 août 2007 à 18:31
Un jour lointain je comprendrai comment faire marcher la police correctement...
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
28 août 2007 à 11:57
Et ça plante à quel endroit, quel message d'erreur?
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
28 août 2007 à 12:09
En fait problème repéré tu ne dois pas faire free(localisation)...jusqu'à free(commentaire3) dans ta boucle for puisque tu es censé pouvoir les réutiliser et de toutes façons tu le fais une deuxième fois après la boucle => plantage puisque ressources déjà libérées, les pointeurs ne sont plus valides.
Ce problème réglé ça tourne correctement.
milhandril Messages postés 55 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 11 décembre 2008
28 août 2007 à 12:14
Si c'est un problème de boucle essai avec
for(nombre_reference = 0;nombre_reference < nombre_de_produit - 1;nombre_reference++)

c'est tout bete mais ca regle un pb de for sur 2

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_deguelator Messages postés 6 Date d'inscription dimanche 13 mai 2007 Statut Membre Dernière intervention 28 août 2007
28 août 2007 à 13:18
Ok merci. Mais si je veux creer au moins 2 produits, cela ne fonctionne pas. Pour le premier sa passe. Mais le second non. Il ne se passe plus lorsque que le message           puts("\n\t\t---->CREATION DE LA PAGE HTML REUSSIE"); 
s'affiche.
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
28 août 2007 à 13:53
Fais pas ce que t'as dit milhandril c'est faux (suffit de savoir compter pour régler les conditions de boucle, pas de bricoler jusqu'à ce que ça marche).
J'ai essayé chez moi après la correction que je t'ai donnée et il y a bien création de 2 produits.
cs_deguelator Messages postés 6 Date d'inscription dimanche 13 mai 2007 Statut Membre Dernière intervention 28 août 2007
28 août 2007 à 14:07
ben oui j'ai fait ce que tu as dit mais le programme ne fini pas correctement puisqu'il bug au message. Je peux pas faire plus de 2 pages html. Et la page que l'on creer en tout premier avant la boucle for et vide.
cs_deguelator Messages postés 6 Date d'inscription dimanche 13 mai 2007 Statut Membre Dernière intervention 28 août 2007
28 août 2007 à 14:28
Si je veux creer 2 produits, alors il va y avoir dans un premier temps la création d'une première page qui contiendra le listing des produits. Pour chaque produit, on créé une nouvelle page HTML (créée lors de la boucle FOR). Alors pour 2 produits j'aurais 3 pages.

Le problème c'est que si j'éxecute le programme j'aurais bien 3 pages. Mais celle récapitulant les produits est vide. Il y a une erreur à la fin de la création d'une page spécifique à un produit (fin boucle FOR). Donc je peux pas créer plus de 2 produits.
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
28 août 2007 à 16:24
Je comprends pas, chez moi il y a bien création de 3 pages avec les contenus désirés (listing, détail1, détail2). Tu peux reposter ton code avec les modifs que tu y as ajoutées?
cs_deguelator Messages postés 6 Date d'inscription dimanche 13 mai 2007 Statut Membre Dernière intervention 28 août 2007
28 août 2007 à 17:51
J'ai ajouté quelques variables en plus.

#include <stdio.h>
#include <conio.h>
#include <malloc.h>
#include <string.h>





int main()
{
        /*
   Déclaration de l'ensemble des variables
   */
  
   char *nom_de_la_page, *titre_de_la_page, *localisation, *description, *image, *image2, *image3, *description_detaillee , *en_savoir_plus;
   char *commentaire1, *commentaire2, *commentaire3 , *lien_page_suivante , *lien_page_precedente, *nom_repertoire;
   int prix, reference, surface_terrain, surface_habitable, nombre_de_produit , nombre_reference;
  
   nom_de_la_page = (char *)malloc(20);
   titre_de_la_page = (char *)malloc(20);
   localisation = (char *)malloc(20);
   description = (char *)malloc(30);
   image = (char *)malloc(20);
   description_detaillee = (char *)malloc(200);
   en_savoir_plus = (char *)malloc(20);
   image2 = (char *)malloc(20);
   image3 = (char *)malloc(20);
   commentaire1 = (char *)malloc(20);
   commentaire2 = (char *)malloc(20);
   commentaire3 = (char *)malloc(20);
   lien_page_suivante = (char *)malloc(20);
   lien_page_precedente = (char *)malloc(20);
   nom_repertoire = (char *)malloc(20);
  
   nombre_reference = 0;
  
  
 
   /*
   Debut du traitement
   */
  
   puts("\nCombien de produits desirez-vous ajouter?");
   scanf("%d",&nombre_de_produit);
  
   fflush(stdin);
  
  
   /*Saisie du nom et du titre de la page*/
  
   puts("\nSaisir le nom de la page:");
   gets(nom_de_la_page);
  
   puts("\nSaisir le titre de la page:");
   gets(titre_de_la_page);
  
  
   /*Creation du listing*/
  
   printf("\n\tCreation de la page %s",nom_de_la_page);
                                        
   char filename[255];
             
   FILE *fichier;
   sprintf((char *) &filename,"%s.html",nom_de_la_page);
   fichier = fopen(filename,"w");
  
  
   /*Gestion des erreurs*/
                                                
   if(fichier == NULL)
   {
              puts("\n\t\t---->LA PAGE HTML N'A PU ETRE CREE");
              fclose(fichier);
   }
                                                
   else
   {
              puts("\n\t\t---->CREATION DE LA PAGE HTML REUSSIE");
   }
   
   
    /*Première écriture dans le fichier*/
   
    fprintf(fichier,"<HTML>\n<HEAD>\n<TITLE>%s</TITLE>\n</HEAD>",nom_de_la_page);
    fprintf(fichier,"\n");
    fprintf(fichier,"\n AGENCE DOMIMMO
");
    fprintf(fichier,"\nTéléphone: 06 98 84 38 00
Fax: 04 93 42 34 66
Mail:
[mailto:agencedomimmo@free.fr

agencedomimmo@free.fr


");
    fprintf(fichier,"\n<CENTER>");
    fprintf(fichier,"\n\t]APPARTEMENTS
");
    fprintf(fichier,"\n\t[mailto:agencedomimmo@free.fr

agencedomimmo@free.fr


");
       fprintf(PLUS,"\n<CENTER>");
       fprintf(PLUS,"\n\t]APPARTEMENTS
");
       fprintf(PLUS,"\n\tMAISONS DE VILLAGE\n\tVILLAS\n\tLOCATIONS\n\tTERRAINS\n\tNEUFS\n\tNOUS CONTACTER\n</CENTER>");
       fprintf(PLUS,"<CENTER> FLATS\tHOUSES\tVILLAS\tLOCATIONS\tLANDS\tNEUFS\tCONTACT US </CENTER>");
       fprintf(PLUS,"\n
\n<CENTER>%s</CENTER>\n

",titre_de_la_page);
       fprintf(PLUS,"\n<CENTER>\n\n----
\n\t%s, \",localisation);
       fprintf(PLUS,\"\n%s, \",description);
       fprintf(PLUS,\"\n\n----
\n\n<form name ='formname'>\n
<center><table cellspacing='1' cellpadding='4' bgcolor='#000000'>");
       fprintf(PLUS,"\n----, \n\",image);
       fprintf(PLUS,\"\n</TD>\n\n ----
\n<select name='slide' onChange='change();' size='1'>");
       fprintf(PLUS,"\n<option value='/image/%s' selected>%s</option>",image,commentaire1);
       fprintf(PLUS,"\n<option value='/image/%s'>%s</option>",image2,commentaire2);
       fprintf(PLUS,"\n<option value='/image/%s'>%s</option>",image3,commentaire3);
       fprintf(PLUS,"\n</select>\n, \n\n----
\n");
       fprintf(PLUS,"\n");
       fprintf(PLUS,"\n");
       fprintf(PLUS,"\n' style='border:1 SOLID #e6e6e6;'>");
       fprintf(PLUS,"\n>' title='>>' style='border:1 SOLID #e6e6e6;'>");
       fprintf(PLUS,"\n, \n\n</TD>\n
\n</center>\n
\n</form>\n<!-- FIN DU SCRIPT DIAPORAMA-->");
       fprintf(PLUS,"\n\n<TD width=500 valign='top'  bgcolor='#9966FF'>");
       fprintf(PLUS,"\n\t\tVille: %s
",localisation);
       fprintf(PLUS,"\n\t\tType: %s
",titre_de_la_page);
       fprintf(PLUS,"\n\t\tSurface habitable: %ld m²
",surface_habitable);
       fprintf(PLUS,"\n\t\tSurface terrain: %ld m²
",surface_terrain);
       fprintf(PLUS,"\n\t\tRéférence: %d
",reference);
       fprintf(PLUS,"\n\t\tPrix: %ld euros
",prix);
       fprintf(PLUS,"\n

\n<CENTER>\n<HR width= 200>\n</CENTER>%s",description_detaillee);
       fprintf(PLUS,"\n

\n RETOUR A LA PAGE PRECEDENTE</gras> ",nom_de_la_page);
       fprintf(PLUS,"\n

\n<FORM action ='/repertoire/formulaire.html' name='eform' onSubmit='lance(document.eform.nombre);return false'>Référence :<SELECT name='nombre' size='1'>\n<OPTION value='%d'> %d</OPTION>",reference,reference);
       fprintf(PLUS,"\n</SELECT>\n\n</FORM>\n\n</TD>\n</TR>\n</TABLE>\n</CENTER>\n\n</HTML>");
      
       printf("Fichier %s créé.",en_savoir_plus);
      
       fclose(PLUS);
 
       fflush(stdin);
 
       free(localisation);
       free(description);
       free(image);
       free(image2);
       free(image3);
       free(description_detaillee);
       free(en_savoir_plus); 
       free(commentaire1);                                   
       free(commentaire2);
       free(commentaire3);
      
      
   }
      
   puts("\n\n\t\tSORTIE DE LA BOUCLE for");
     
   
   fprintf(fichier," \n\n\n

\n<CENTER>");
   fprintf(fichier,"\nPage précèdente",lien_page_suivante);
   fprintf(fichier,"\nPage suivante\n</CENTER>",lien_page_precedente);
   fprintf(fichier,"\n\n\n</HTML>");
   
   /*On ferme les fichiers*/
   fclose(fichier);
   
   /*On libère la mémoire*/
   free(nom_de_la_page);
   free(titre_de_la_page);
   free(lien_page_suivante);
   free(lien_page_precedente);
   free(nom_repertoire);
  
   
   puts("\n\n\tFERMETURE DU FICHIER EFFECTUEE");
  
   getch();
}
    

    
    


                               


 


 


 
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
28 août 2007 à 18:01
Ton paquet
       free(localisation);
       free(description);
       free(image);
       free(image2);
       free(image3);
       free(description_detaillee);
       free(en_savoir_plus); 
       free(commentaire1);                                   
       free(commentaire2);
       free(commentaire3);

n'est pas au bon endroit, il faut le mettre en fin de programme (là où t'as mis le commentaire libération de la mémoire .
Rejoignez-nous