[langage C] probleme sur allocation memoire
Résolu
pAUL
-
poumiZ -
poumiZ -
Bonjour,
Etudiant qui essuie tous les plâtres en C, je suis depuis des jours sur un programme tout simple. Je dois relever dans une zone de lecture des mots d'au moins trois lettres et les insérer dans un tableau de dix postes en mettant l'occurrence à zéro pour, par la suite qui n'intervient pas ici, l'incrémenter. J'ai fait des fonctions de reconnaissance de caractères spéciaux , de longueur, de comparaison avec le tableau et d'insertion. J'ai tout passé au débuggueur à plusieurs reprises et au pas à pas, ça marche impec et les affichages de suivi se font sans souci.
Pär contre lorsque je ne fais que taper manuellement à vitesse normale et ne suis plus au débuggueur, tout plante dès le premier mot et ça ferme. Il paraît que j'ai fait des violations en série.
Je ne sais plus où j'en suis. Je suis à court d'idées, j'ai envie de pleurer ou de me défénestrer.
Pourriez-vous me donner votre avis? Qu'est-ce que j'ai fait de mal? Suis-je le dernier des imbéciles? Y a-t-il des choses dont je ne tiens pas compte?
Je vous serais infiniment reconnaissant de jeter un coup d'oeil sur mon travail.
Merci de tout coeur.
voila la partie de mon programme concernée :
[code]#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*-------------- début : déclaration de données ----------*/
struct TITRE
{
char *mot; // les mots du titre >+3
int occmt; // occurrences des mots du titre dans le poème
};
/*-------------- fin : déclaration de donnees -----------*/
/*-------------- PROGRAMME PRINCIPAL ---------------------*/
void main()
{
/*--- début de déclaration principale ----*/
/*-- constantes ---*/
int taille2 =4; // Cste
int taille =4; // Cste
int lgmax =0; // Cste
int MAXTITRE =10; // Cste
/*--- donnees ---*/
TITRE *tabT[10]; // tableau de 10 postes pour les mots du titre
RIME **tabR; // tableau des rimes du nombre de postes inconnu
tabR=(RIME**)malloc(sizeof(RIME*)*4);
char ZL[81]; // Zone de lecture
char *pm;
/*-- variables ---*/
int nb=0, chj=0, // divers indice de boucle
i,j=0,cpt=0,
id=0,lg=0,lgm=0,
numvers=0, // le titre n'est pas numéroté
pos=0,k=0,
rep=0, idf=0;
int numV=0, nbr=0; // divers indice de boucle
/*-----------------------------------*/
/*-- debut prototype de fonctions ---*/
/*-----------------------------------*/
// insert dans tableau des titres le mot titre
void TITRE_INSERT(int, int ,int , char [], TITRE *[]);
int VERS_CHERCHE(char *, TITRE *[], int);
void MINUS(char min_ZL[]); // mise en miuscule
int CARACSPE(char a); // reconnaît les caractères spéciaux
int CHERCHE(char *,TITRE *[], int , int *);// recherche les mots du titre
int CHERCHER(char *,RIME **,int ,int *);// recherche les rimes
void AFFICHETITRE(TITRE *[], int ); // affiche les mots du titre
/*-----------------------------------*/
/*-- fin prototype de fonctions ---*/
/*-----------------------------------*/
/*--- fin de déclaration principale -*/
gets(ZL);
lg = strlen(ZL); // la longueur de la chaîne
MINUS(ZL); // appel de la fonction tolower
printf("\n 1. Le titre et le poeme :\n");
printf("%s\n\n",ZL);
for(i=0; i < lg; i++)
{
if(!(CARACSPE(ZL[i]))) // si pas de caractères spéciaux
{ // on traite la saisie id = i;
id = i;
for(i++; i < lg && !(CARACSPE(ZL[i])); i++);
lgm = i-id; // la longueur du mot
if (lgm >= 3) //on relève les mots d'au moins 3 lettres
{
pm=(char*)malloc(lgm+1); //on alloue un espace temporaire pour copier
strncpy(pm,&(ZL[id]),lgm);
pm[lgm]='\0';
// on cherche dans le tableau pour éliminer les redondances et on test //
if(CHERCHE( pm, tabT, j, &rep) == 0)
{
//si les mots du titre ne sont pas dans le tableau
//insertion dans le tableau
TITRE_INSERT(j, lgm, id, ZL, tabT); // appel de la fonction
free(pm);
j++;
nb++;
} //--- fin si cherche
} //--- fin si 3 car
} //--- fin si car spéciaux
} //--- fin for
}
void MINUS(char z[])
{
int i;
for(i = 0; z[i] != '\0'; i++)
z[i] = tolower(z[i]);
} // fin minuscule
int CARACSPE(char a)
{
/*--- caractere a ne pas prendre en compte ---*/
char TSPEC[11] = {' ','.','!','?','\'',',',';',':','(',')','"'};
int i=0;
for (i = 0; i < 11; i++)
{
if (a == TSPEC[i]) return (1);
}
return (0);
} // fin CARACSPE
/*----------------------------------------------------*/
void TITRE_INSERT(int ti_j,int ti_lgm,int ti_id, char ti_ZL[], TITRE *ti_tabT[])
{
ti_tabT[ti_j] = (TITRE*)malloc(sizeof(TITRE));
ti_tabT[ti_j]->mot = (char*)malloc(sizeof(ti_lgm+1));
strncpy(ti_tabT[ti_j]->mot, &(ti_ZL[ti_id]),ti_lgm);
ti_tabT[ti_j]->mot[ti_lgm] = '\0';
ti_tabT[ti_j]->occmt = 0;
printf("\ntitre / FONCTION insert_tableau\n");
printf("-------------------------------\n");
printf("titre / insert_tab / mot : %s\n", ti_tabT[ti_j]->mot);
printf("titre / insert_tab / occurence: %i\n", ti_tabT[ti_j]->occmt);
} // fin insert titre
int CHERCHE(char *ch_pm, TITRE *ch_tabT[], int ch_nb, int *ch_rep)
{
int chj;
//recherche dans le tableau du titre
for (chj=0; chj < ch_nb && (strcmp((ch_pm), ch_tabT[chj] -> mot)!= 0); chj++);
if (chj < ch_nb)
{
*ch_rep = chj;
return (1); // on a trouve car strcmp vrai donc on sort avant la fin
}
else
return (0); // non trouver
} // fin CHERCHE
[/code]
Etudiant qui essuie tous les plâtres en C, je suis depuis des jours sur un programme tout simple. Je dois relever dans une zone de lecture des mots d'au moins trois lettres et les insérer dans un tableau de dix postes en mettant l'occurrence à zéro pour, par la suite qui n'intervient pas ici, l'incrémenter. J'ai fait des fonctions de reconnaissance de caractères spéciaux , de longueur, de comparaison avec le tableau et d'insertion. J'ai tout passé au débuggueur à plusieurs reprises et au pas à pas, ça marche impec et les affichages de suivi se font sans souci.
Pär contre lorsque je ne fais que taper manuellement à vitesse normale et ne suis plus au débuggueur, tout plante dès le premier mot et ça ferme. Il paraît que j'ai fait des violations en série.
Je ne sais plus où j'en suis. Je suis à court d'idées, j'ai envie de pleurer ou de me défénestrer.
Pourriez-vous me donner votre avis? Qu'est-ce que j'ai fait de mal? Suis-je le dernier des imbéciles? Y a-t-il des choses dont je ne tiens pas compte?
Je vous serais infiniment reconnaissant de jeter un coup d'oeil sur mon travail.
Merci de tout coeur.
voila la partie de mon programme concernée :
[code]#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*-------------- début : déclaration de données ----------*/
struct TITRE
{
char *mot; // les mots du titre >+3
int occmt; // occurrences des mots du titre dans le poème
};
/*-------------- fin : déclaration de donnees -----------*/
/*-------------- PROGRAMME PRINCIPAL ---------------------*/
void main()
{
/*--- début de déclaration principale ----*/
/*-- constantes ---*/
int taille2 =4; // Cste
int taille =4; // Cste
int lgmax =0; // Cste
int MAXTITRE =10; // Cste
/*--- donnees ---*/
TITRE *tabT[10]; // tableau de 10 postes pour les mots du titre
RIME **tabR; // tableau des rimes du nombre de postes inconnu
tabR=(RIME**)malloc(sizeof(RIME*)*4);
char ZL[81]; // Zone de lecture
char *pm;
/*-- variables ---*/
int nb=0, chj=0, // divers indice de boucle
i,j=0,cpt=0,
id=0,lg=0,lgm=0,
numvers=0, // le titre n'est pas numéroté
pos=0,k=0,
rep=0, idf=0;
int numV=0, nbr=0; // divers indice de boucle
/*-----------------------------------*/
/*-- debut prototype de fonctions ---*/
/*-----------------------------------*/
// insert dans tableau des titres le mot titre
void TITRE_INSERT(int, int ,int , char [], TITRE *[]);
int VERS_CHERCHE(char *, TITRE *[], int);
void MINUS(char min_ZL[]); // mise en miuscule
int CARACSPE(char a); // reconnaît les caractères spéciaux
int CHERCHE(char *,TITRE *[], int , int *);// recherche les mots du titre
int CHERCHER(char *,RIME **,int ,int *);// recherche les rimes
void AFFICHETITRE(TITRE *[], int ); // affiche les mots du titre
/*-----------------------------------*/
/*-- fin prototype de fonctions ---*/
/*-----------------------------------*/
/*--- fin de déclaration principale -*/
gets(ZL);
lg = strlen(ZL); // la longueur de la chaîne
MINUS(ZL); // appel de la fonction tolower
printf("\n 1. Le titre et le poeme :\n");
printf("%s\n\n",ZL);
for(i=0; i < lg; i++)
{
if(!(CARACSPE(ZL[i]))) // si pas de caractères spéciaux
{ // on traite la saisie id = i;
id = i;
for(i++; i < lg && !(CARACSPE(ZL[i])); i++);
lgm = i-id; // la longueur du mot
if (lgm >= 3) //on relève les mots d'au moins 3 lettres
{
pm=(char*)malloc(lgm+1); //on alloue un espace temporaire pour copier
strncpy(pm,&(ZL[id]),lgm);
pm[lgm]='\0';
// on cherche dans le tableau pour éliminer les redondances et on test //
if(CHERCHE( pm, tabT, j, &rep) == 0)
{
//si les mots du titre ne sont pas dans le tableau
//insertion dans le tableau
TITRE_INSERT(j, lgm, id, ZL, tabT); // appel de la fonction
free(pm);
j++;
nb++;
} //--- fin si cherche
} //--- fin si 3 car
} //--- fin si car spéciaux
} //--- fin for
}
void MINUS(char z[])
{
int i;
for(i = 0; z[i] != '\0'; i++)
z[i] = tolower(z[i]);
} // fin minuscule
int CARACSPE(char a)
{
/*--- caractere a ne pas prendre en compte ---*/
char TSPEC[11] = {' ','.','!','?','\'',',',';',':','(',')','"'};
int i=0;
for (i = 0; i < 11; i++)
{
if (a == TSPEC[i]) return (1);
}
return (0);
} // fin CARACSPE
/*----------------------------------------------------*/
void TITRE_INSERT(int ti_j,int ti_lgm,int ti_id, char ti_ZL[], TITRE *ti_tabT[])
{
ti_tabT[ti_j] = (TITRE*)malloc(sizeof(TITRE));
ti_tabT[ti_j]->mot = (char*)malloc(sizeof(ti_lgm+1));
strncpy(ti_tabT[ti_j]->mot, &(ti_ZL[ti_id]),ti_lgm);
ti_tabT[ti_j]->mot[ti_lgm] = '\0';
ti_tabT[ti_j]->occmt = 0;
printf("\ntitre / FONCTION insert_tableau\n");
printf("-------------------------------\n");
printf("titre / insert_tab / mot : %s\n", ti_tabT[ti_j]->mot);
printf("titre / insert_tab / occurence: %i\n", ti_tabT[ti_j]->occmt);
} // fin insert titre
int CHERCHE(char *ch_pm, TITRE *ch_tabT[], int ch_nb, int *ch_rep)
{
int chj;
//recherche dans le tableau du titre
for (chj=0; chj < ch_nb && (strcmp((ch_pm), ch_tabT[chj] -> mot)!= 0); chj++);
if (chj < ch_nb)
{
*ch_rep = chj;
return (1); // on a trouve car strcmp vrai donc on sort avant la fin
}
else
return (0); // non trouver
} // fin CHERCHE
[/code]
A voir également:
- [langage C] probleme sur allocation memoire
- Mémoire vive - Guide
- Langage ascii - Guide
- RAM : type, format, CAS, vitesse, tout sur la mémoire vive - Guide
- Langage binaire - Guide
- C'est un secret bien gardé : ce réglage d'expert peut doper les performances de votre PC - Guide
3 réponses
je viens d'essayer de compiler ton prog mais la somme d'erreur que j'obtiens est assourdissant sous gcc.
I can not help you. Don't damn me!
I can not help you. Don't damn me!
Bonjour,
je ne sais pas si tu as vraiment écrit ce programme en C car il y a de gros problemes quand j'essaie de le faire tourner chez moi (meme si c'est vrai que les erreurs affichees dependent des compilateurs).
En tout cas chez moi c'est du n'importe quoi : tout d'abord, ton struct TITRE{...]; ne fonctionne pas. en principe, la declaration d'une structure se fait pas (rien ou typedef) struct (rien ou identifiant a l'interieur de la structure)
{...}<NOM DE TA STRUCTURE>;
En effet, cela me met dans la suite du prog un TITRE nom declare a la compilation. De plus, la declaration des variables (meme globales) et des fonctions se fait en mnuscule, et les constantes (=parametres) en majuscule (ex : #define), c'est pour ca que chez moi le typedef struct{...}TITRE; ne fonctionne pas. Il fonctionne en mettant typedef struct{....}titre;
Voila sinon il y a trop d'erreurs pour tout arranger.
bon courage
je ne sais pas si tu as vraiment écrit ce programme en C car il y a de gros problemes quand j'essaie de le faire tourner chez moi (meme si c'est vrai que les erreurs affichees dependent des compilateurs).
En tout cas chez moi c'est du n'importe quoi : tout d'abord, ton struct TITRE{...]; ne fonctionne pas. en principe, la declaration d'une structure se fait pas (rien ou typedef) struct (rien ou identifiant a l'interieur de la structure)
{...}<NOM DE TA STRUCTURE>;
En effet, cela me met dans la suite du prog un TITRE nom declare a la compilation. De plus, la declaration des variables (meme globales) et des fonctions se fait en mnuscule, et les constantes (=parametres) en majuscule (ex : #define), c'est pour ca que chez moi le typedef struct{...}TITRE; ne fonctionne pas. Il fonctionne en mettant typedef struct{....}titre;
Voila sinon il y a trop d'erreurs pour tout arranger.
bon courage