[C]Fonction malloc ne répond pas
Résolu
ilan27
Messages postés
394
Date d'inscription
Statut
Membre
Dernière intervention
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je suis en train de créer un petit programme en C qui, à partir d'une feuille (fichier que j'ouvre avec fopen), crée un tableau de structures que j'ai nommée 'acte'. Dans une boucle while qui semble marcher, le programme:
_Lit la ligne
_Traite la ligne et insère les données dans la structure i du tableau (i indice incrémenté)
..etc...
Au fur et à mesure, j'affiche les résultats pour être sûr: ça s'affiche correctement. Mais sur les 18 lignes à lire, le programme s'arrète tantôt à la 9eme, tantôt à la 10eme... et ne termine jamais la feuille, sans jamais m'afficher un message d'erreur. Comme si tout se passait bien.J'ai localisé le problème dans la fonction malloc du while (voir plus bas). En effet, j'ai fait des affichages, et il semble s'arrêter au malloc. Ce n'est pas un problème de mémoire, sinon un message me l'aurait signalé (j'ai fait un test).
Même après des recherches sur Internet, je n'ai rien trouvé.
Voici le programme (j'ai enlevé des fonctions pour faire léger, elles marche très bien):
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "utile.h"
int main()
{
FILE *fiche=fopen("actes.txt", "r");
char *ligne=(char *)malloc(301*sizeof(char));
char *nom=(char *)malloc(10*sizeof(char));
char *description=(char *)malloc(200*sizeof(char));
char *acte1=(char *)malloc(10*sizeof(char));
char *acte2=(char *)malloc(10*sizeof(char));
char *das=(char *)malloc(10*sizeof(char));
double prix1=0;
double prix2=0;
double prix;
double min;
double max;
double da;
int i=0;
fgets(das, 9, fiche);
da=stodb(das);
printf("DA= %g %%\n\n",da);
while(fgets(ligne, 300, fiche)!=NULL && i<NOMBRE){
if((actes[i]=(struct acte *)malloc(sizeof(struct acte)))==NULL){ //************ICI: après, le programme s'arrète, et ce qui suit
//************ne s'affiche pas
printf("Pas assez de place\n"); // Ne s'affiche jamais
}
printf("%d\n", i);
decompo(ligne, nom, description, &prix);
strcpy(actes[i]->nom,nom);
strcpy(actes[i]->description,description);
actes[i]->prix=prix;
i++;
}
//Tableau crée
printf("Veuillez entrer le code de l'acte n°1, en majuscules:\n");
scanf("%s", acte1);
printf("Veuillez entrer le code de l'acte n°2, en majuscules:\n");
scanf("%s", acte2);
i=0;
for(i; actes[i]!=NULL && i<NOMBRE; i++){
if(!strcmp(actes[i]->nom, acte1)){
//Acte 1 rentré
prix1=actes[i]->prix;
}
if(!strcmp(actes[i]->nom, acte2)){
//Acte 2 rentré
prix2=actes[i]->prix;
}
}
if(prix1==0 || prix2==0){
printf("Code(s) incorrects\n");
}else{
min=(prix1<=prix2)?prix1:prix2;
max=(prix1>=prix2)?prix1:prix2;
printf("\n\nVoici les resultats:\n\n");
printf("Acte 1 sans da: %g, avec da: %g\n", min, ceilf(min*da));
}
free(ligne);
free(nom);
free(description);
free(acte1);
free(acte2);
free(das);
fclose(fiche);
}
Merci beaucoup!! (J'utilise Code::blocks)
Je suis en train de créer un petit programme en C qui, à partir d'une feuille (fichier que j'ouvre avec fopen), crée un tableau de structures que j'ai nommée 'acte'. Dans une boucle while qui semble marcher, le programme:
_Lit la ligne
_Traite la ligne et insère les données dans la structure i du tableau (i indice incrémenté)
..etc...
Au fur et à mesure, j'affiche les résultats pour être sûr: ça s'affiche correctement. Mais sur les 18 lignes à lire, le programme s'arrète tantôt à la 9eme, tantôt à la 10eme... et ne termine jamais la feuille, sans jamais m'afficher un message d'erreur. Comme si tout se passait bien.J'ai localisé le problème dans la fonction malloc du while (voir plus bas). En effet, j'ai fait des affichages, et il semble s'arrêter au malloc. Ce n'est pas un problème de mémoire, sinon un message me l'aurait signalé (j'ai fait un test).
Même après des recherches sur Internet, je n'ai rien trouvé.
Voici le programme (j'ai enlevé des fonctions pour faire léger, elles marche très bien):
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "utile.h"
int main()
{
FILE *fiche=fopen("actes.txt", "r");
char *ligne=(char *)malloc(301*sizeof(char));
char *nom=(char *)malloc(10*sizeof(char));
char *description=(char *)malloc(200*sizeof(char));
char *acte1=(char *)malloc(10*sizeof(char));
char *acte2=(char *)malloc(10*sizeof(char));
char *das=(char *)malloc(10*sizeof(char));
double prix1=0;
double prix2=0;
double prix;
double min;
double max;
double da;
int i=0;
fgets(das, 9, fiche);
da=stodb(das);
printf("DA= %g %%\n\n",da);
while(fgets(ligne, 300, fiche)!=NULL && i<NOMBRE){
if((actes[i]=(struct acte *)malloc(sizeof(struct acte)))==NULL){ //************ICI: après, le programme s'arrète, et ce qui suit
//************ne s'affiche pas
printf("Pas assez de place\n"); // Ne s'affiche jamais
}
printf("%d\n", i);
decompo(ligne, nom, description, &prix);
strcpy(actes[i]->nom,nom);
strcpy(actes[i]->description,description);
actes[i]->prix=prix;
i++;
}
//Tableau crée
printf("Veuillez entrer le code de l'acte n°1, en majuscules:\n");
scanf("%s", acte1);
printf("Veuillez entrer le code de l'acte n°2, en majuscules:\n");
scanf("%s", acte2);
i=0;
for(i; actes[i]!=NULL && i<NOMBRE; i++){
if(!strcmp(actes[i]->nom, acte1)){
//Acte 1 rentré
prix1=actes[i]->prix;
}
if(!strcmp(actes[i]->nom, acte2)){
//Acte 2 rentré
prix2=actes[i]->prix;
}
}
if(prix1==0 || prix2==0){
printf("Code(s) incorrects\n");
}else{
min=(prix1<=prix2)?prix1:prix2;
max=(prix1>=prix2)?prix1:prix2;
printf("\n\nVoici les resultats:\n\n");
printf("Acte 1 sans da: %g, avec da: %g\n", min, ceilf(min*da));
}
free(ligne);
free(nom);
free(description);
free(acte1);
free(acte2);
free(das);
fclose(fiche);
}
Merci beaucoup!! (J'utilise Code::blocks)
A voir également:
- [C]Fonction malloc ne répond pas
- Fonction si et - Guide
- Mon écran se fige et plus rien ne répond - Guide
- Comment fermer un programme qui ne répond pas - Guide
- Fonction miroir - Guide
- Fonction moyenne excel - Guide
2 réponses
Bon, en fait, ce n'est pas un problème du malloc. Enfin si mais pas celui-là: il fallait aussi allouer de l'espace mémoire à toutes les variables-pointeur (ici nom et description) qui composent la structure. Je ne sais pas comment ça se passe, mais en tout cas maintenant tout marche.