[C]Fonction malloc ne répond pas
Résolu
ilan27
Messages postés
395
Statut
Membre
-
fiddy Messages postés 11653 Statut Contributeur -
fiddy Messages postés 11653 Statut Contributeur -
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 pc se bloque et ne répond plus - Guide
- Comment fermer un programme qui ne répond pas - Guide
- Fonction miroir - Guide
- Fonction moyenne excel - Guide