Le programme plante à la fin [Résolu]

Signaler
Messages postés
6
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
28 août 2007
-
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
-
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

Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Un jour lointain je comprendrai comment faire marcher la police correctement...
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Et ça plante à quel endroit, quel message d'erreur?
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
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.
Messages postés
55
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
11 décembre 2008

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
Messages postés
6
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
28 août 2007

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.
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
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.
Messages postés
6
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
28 août 2007

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.
Messages postés
6
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
28 août 2007

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.
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
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?
Messages postés
6
Date d'inscription
dimanche 13 mai 2007
Statut
Membre
Dernière intervention
28 août 2007

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();
}
    

    
    


                               


 


 


 
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
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 .