IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème avec un tableau de structure


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2005
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 55
    Par défaut Problème avec un tableau de structure
    Bonjour,

    Je suis en train de développer un programme en C qui me permet d'enregistrer un fichier dans un tableau de structure. J'obtiens une erreur de compilation qui est:
    erreur incompatible types in return.

    Voici quelques bouts de code.

    Déclaration de ma structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct {
                           char ville[50];
                           int nb;
                        } rmi;
    rmi tab[160];

    Ma fonction de copie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    rmi file_copy(char nomfich[])
    {
    	rmi tab[160];
    	FILE *fiche = NULL;
    	char *p_temp = NULL;
    	char *p_temp_word = NULL;
     
    	char buffer[1024];
    	int i=0, cpt = 0;
     
     
     
    	/* ----- Ouverture du fichier ----- */
     
    	fiche = fopen (nomfich, "r");
     
       	if (!fiche)
    	   {
    	      /* Erreur: impossible d'ouvrir le fichier. */
    	      printf("Erreur: impossible d'ouvrir le fichie");
    	   }
     
    	while (fgets(buffer,BUFSIZ,fiche) )
    		{
    		 char *p = NULL;
    		 p=strstr(buffer, "\n");
    		    if (p != NULL)
    			{
    			 *(p-1) = 0;
    			}
    		    else
    			{
    			 memset (buffer, 0, sizeof (buffer));
    			}
    		 strcpy(tab[i].ville,buffer);
    		 tab[i].nb = 0;
    	         p_temp = NULL;				 
    	      	 i++;cpt++;
    	        }
    fclose(fiche);
    return tab;
     
    }
    Pouvez vous m'aider please?

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ta fonction a un type de retour structure, et tu cherches à lui faire retourner un tableau (l'adresse d'un tableau local, qui plus est...)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Inscrit en
    Juin 2005
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 55
    Par défaut
    Donc il faut que je déclare mon tableau en global comme ce ci?
    Sinon comment je peux retourner mon tableau de type structure rmi?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    rmi file_copy(char nomfich[],rmi tab[];)
    {
     
    	FILE *fiche = NULL;
    	char *p_temp = NULL;
    	char *p_temp_word = NULL;
     
    	char buffer[1024];
    	int i=0, cpt = 0;
     
     
     
    	/* ----- Ouverture du fichier ----- */
     
    	fiche = fopen (nomfich, "r");
     
       	if (!fiche)
    	   {
    	      /* Erreur: impossible d'ouvrir le fichier. */
    	      printf("Erreur: impossible d'ouvrir le fichie");
    	   }
     
    	while (fgets(buffer,BUFSIZ,fiche) )
    		{
    		 char *p = NULL;
    		 p=strstr(buffer, "\n");
    		    if (p != NULL)
    			{
    			 *(p-1) = 0;
    			}
    		    else
    			{
    			 memset (buffer, 0, sizeof (buffer));
    			}
    		 strcpy(tab[i].ville,buffer);
    		 tab[i].nb = 0;
    	         p_temp = NULL;				 
    	      	 i++;cpt++;
    	        }
    fclose(fiche);
    return tab;
     
    }

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Si tu connais à l'avance la taille maximale du tableau, du peux passer le tableau en paramètre en effet.
    Dans ce cas, je te conseille de passer aussi sa taille en paramètre, c'est une bonne pratique :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    #define MY_BUFFER_SIZE 1024
     
    /* Une pratique commune en C:
       On retourne 0 si OK, -1 si erreur. */
    int file_copy(char const nomfich[], rmi tab[], size_t taille)
    {
    	FILE *fiche = NULL;
     
    	char buffer[MY_BUFFER_SIZE];
    	size_t i=0;
     
    	/* ----- Ouverture du fichier ----- */
    	fiche = fopen (nomfich, "r");
     
       	if (!fiche)
    	{
    		/* Erreur: impossible d'ouvrir le fichier. */
    		printf("Erreur: impossible d'ouvrir le fichie");
    		return -1;
    	}
     
    	while (fgets(buffer, MY_BUFFER_SIZE, fiche) && i<taille )
    	{
    		/* Cherche le caractère de nouvelle ligne (Line Feed) */
    		char *pLF = NULL;
    		pLF = strchr(buffer, '\n');
    		if (pLF != NULL)
    		{
    			*p = '\0';
    		}
    		else
    		{
    			/* On finit de lire la ligne jusqu'au LF */
    			int c;
    			while((c=fgetc(fiche)) != '\n' && c != EOF)
    			{ }
     
    			/* ??? */
    			memset (buffer, 0, sizeof (buffer));
    		}
    		strcpy(tab[i].ville, buffer);
    		tab[i].nb = 0;
    	      	i++;
    	}
    	fclose(fiche);
    	return 0;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre averti
    Inscrit en
    Juin 2005
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 55
    Par défaut
    Je te remercie cela fonctionne à merveille. En tout cas chapeau
    Ça faisait 5 ans que je n'avais plus programmé donc je ne te dis pas comment je suis un peu rouillé

    J'ai du modifié quand même un oubli et une érreur que je ne comprend pas vraiment. (voir le texte en rouge)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    while (fgets(buffer, MY_BUFFER_SIZE, fiche) && i<taille )
    	{
    		/* Cherche le caractère de nouvelle ligne (Line Feed) */
    		char *pLF = NULL;
    		pLF = strchr(buffer, '\n');
    		if (pLF != NULL)
    		{
                        /* Petite erreur mais je ne sais pas pourquoi il faut mettre -1*/
    			*(pLF-1) = '\0';
    		}
    		else
    		{
    			/* On finit de lire la ligne jusqu'au LF */
    			int c;
    			while((c=fgetc(fiche)) != '\n' && c != EOF)
    			{ }
     
    		}
    		strcpy(tab[i].ville, buffer);
    		tab[i].nb = 0;
    	      	i++;
    	}

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /* Une pratique commune en C:
       On retourne 0 si OK, -1 si erreur. */
    Euh....

    Une pratique commune en C....

    Il arrive de nombreuses fois qu'on fasse comme un booléen, c'est à dire retourner 0 si erreur ou 1 si ok :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if ( Ouverture_Fichier(....) && Lecture_Fichier(...) )
    {
       /* OK */
    }
    else
     return ERROR ;

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    pek.plus.ultra59 : Es-tu sûr qu'il faut vraiment mettre un -1 ? Je l'ai retiré volontairement, tu sais: Avec le -1, on ne supprime pas seulement le \n, mais aussi le caractère qui le précède!

    souviron34 : En effet, Windows fait ça. Mais généralement dans ce cas-là, on spécifie d'une autre manière que le résultat est booléen (avec un typedef, par exemple).

    Mais j'ai été un peu restrictif, je l'admet: Généralement, quand une fonction standard C ou POSIX retourne un int, c'est plutôt "non-négatif pour succès, négatif pour échec" (et c'est pareil pour les HRESULT, au passage).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec un tableau de structure
    Par Sofute dans le forum C
    Réponses: 10
    Dernier message: 16/10/2007, 15h29
  2. Problème avec redimensionnement tableau
    Par PoZZyX dans le forum Réseau
    Réponses: 18
    Dernier message: 20/04/2006, 15h46
  3. Problème avec un tableau et saut de ligne
    Par ero-sennin dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 08/03/2006, 18h48
  4. Problème avec un tableau de tableau
    Par SubZero2 dans le forum Langage
    Réponses: 4
    Dernier message: 07/12/2005, 15h25
  5. problème avec un tableau dans un insert ...
    Par vbcasimir dans le forum Langage
    Réponses: 3
    Dernier message: 02/11/2005, 14h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo