[langage C] probleme sur allocation memoire

Résolu/Fermé
pAUL - 22 janv. 2005 à 11:34
 poumiZ - 9 févr. 2005 à 14:24
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]
A voir également:

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!
0
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
0
Bonjour,

à quoi correspond le type RIME?
0