[C] [RESOLU] je trouve pas mon erreur - pointeur / structure

Bon là je seche, j’arrive pas à voir d’où viens mon erreur, malgré avoir essayé gdb… mais à vrai dire je l’utilise pas trop bien, et puis il trouve pas d’erreur non plus. Et je fais ma compil avec les warning, et rien non plus. Donc je demande un peu d’aide.

VOila le code :

le .h déjà (regexp.h) :

#ifndef REGEXP_H
	#define REGEXP_H
	
	#define TAILLE 30
	#define CHEMIN_FIC_CONFIG "./config"
	struct ligne
	{
  int famille;
  char temps[TAILLE];
  char selection[TAILLE];
	};
	typedef struct ligne ligne_t;
	
	int ouvreFichierConfLecture(FILE* fic_config);
	void fermeFichierConf(FILE* fic_config);
	

	int detecterFamille(char *verbe, FILE* fic_config);

#endif

ensuite le main.c

#include <stdio.h>
#include <stdlib.h>
#include "regexp.h"

int main(int argc, char **argv)
{
	int famille;
	FILE* fic_config;
  
        famille = detecterFamille(argv[1], fic_config);
	return EXIT_SUCCESS;
}

et pour finir le 2eme .c (regexp.c) :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "regexp.h"

// ouvre le fichier de configuration en mode lecture
int ouvreFichierConfLecture(FILE* fic_config)
{
	fic_config = fopen(CHEMIN_FIC_CONFIG, "r");
	
	if (fic_config != NULL)
  return EXIT_SUCCESS;
	else
  return EXIT_FAILURE;
}

// ferme le fichier de configuration
void fermeFichierConf(FILE* fic_config)
{
	fclose(fic_config);
}

// détecte la famille auquel appartient le verbe en argument
// renvoie le numéro de famille si le verbe est pris en charge, sinon retourne -1
int detecterFamille(char *verbe, FILE* fic_config)
{
	ligne_t ligneCourante;
	
	if (ouvreFichierConfLecture(fic_config) == EXIT_SUCCESS)
	{  
  fscanf(fic_config, "%d %s %s", &ligneCourante.famille, ligneCourante.temps, ligneCourante.selection);
  
  printf("%s\n", verbe);
  printf("%s\n", ligneCourante.temps);
  printf("%s\n", ligneCourante.selection);
  
  fermeFichierConf(fic_config);

                return ligneCourante.famille;
	}
	return -1;
}

dans cette partie :

printf("%s\n", verbe);
  printf("%s\n", ligneCourante.temps);
  printf("%s\n", ligneCourante.selection);

ça affiche des “caractères bizarres” donc j’en déduis qu’il ya un probleme avec la mémoire (mauvais emplacement ou quelque chose comme ça…) mais je vois pas d’ou ça viens, vous auriez une idée ? :’(

Ou ta chaîne n’est pas terminé par un \0

Si tu es sous Windows, et que tu te poses des questions sur les caractères accentués, alors ne t’étonne pas :slight_smile:

non je compile sur Linux :wink:

Bonjour,
je ne suis pas du tout dev en C, mais peut-être que ça dépasse: tu met la taille à 30, il faut peut-être plus.
Dans le débuggeur, essaye de vérifier qu’il y a bien le 0 final pour marquer la fin de chaine.
:slight_smile:

non la TAILLE 30 est assez grande, c’est moi qui est créé le fichier conf et le mot le plus long fait dans les 5-6 caractères, donc ca passe.

voila la 1ere ligne de mon fichier conf :

6 present er$

donc d’après mon code je devrais avoir (grace au fscanf) :
6 dans ligneCourante.famille
“present” dans ligneCourante.temps
“er$” dans ligneCourante.selection

or j’ai respectivement 0, et puis des caractère bizarres dans les chaines.

edit: ca avait déjà marché très bien, mais depuis que j’ai passé les ouvertures et fermetures du fichier conf dans des fonctions dédiées, ca marche plus :confused:

Ah ben voilà! ça doit être ça, les ouvertures-fermetures dans tes fonctions: tu passe fic_config par valeur alors que tu l’obtient de fopen: soit il faut le prendre en retour de fonction, soit il faut la passer par référence:
int ouvreFichierConfLecture(FILE** fic_config){
*fic_config=fopen…

puis
if (ouvreFichierConfLecture(& fic_config) == EXIT_SUCCESS)

:slight_smile:

bon j’ai pu résoudre le problème sur un autre forum :slight_smile:

j’ai passé le file descriptor dans la valeur return… c’est plus simple, mais pour gérer les erreurs ca va etre moins faciles, tanpis.

Merci quand même pour ce qui ont répondu dans le topic :jap:

Moi pour gérer les erreurs en C, j’ai été jusqu’à simuler la gestion des exceptions (l’affichage surtout) …