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 :

fonction retournant un tableau


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 13
    Par défaut fonction retournant un tableau
    Bonjour à tous,

    Voilà mon problème : j'ai une fonction qui parcours un fichier et qui stocke au fur et à mesure les caractères dans un tableau en indiquant le nombre de fois que le caractère est rencontré dans le fichier et retourne à la fin le contenu de ce tableau. Cette fonction se trouve dans un fichier test.c.

    Je veux faire appel à cette fonction à partir du fichier main.c de mon application.

    Voici le code du fichier test.c

    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
    45
    46
    47
    48
    49
    50
    51
    52
     
    #include <stdio.h>
    #include <stdlib.h>
     
    #include "test.h"
     
    int freq_carac(char *nom_fichier) {
    	// Déclaration des variables
    	int i;
    	char car_ascii;
    	int tab_carac[127];
    	FILE *fp;
     
    	// Contrôle de l'existance du fichier txt
    	if ((fp = fopen(nom_fichier, "r")) == NULL) {
    		//fprintf("Le fichier n'existe pas \n");
    		exit(1);
    	}
    	else
    	{
    		// Si le fichier existe, ouverture du fichier en mode lecture
    		fp = fopen(nom_fichier, "r");
     
    		// Initialisation du tableau stockant les caractères
    		for (i=31; i < 127; i++)
    			tab_carac[i] = 0;
     
                  	while(1)
                 	{
    			// Récupération du code ascii du caractère lu
                    	car_ascii = fgetc(fp);
     
    			printf("%d", car_ascii);
     
    			// Test si on est à la fin du fichier
                    	if(feof(fp))
                     	{
                        		break;
                    	}
     
    			// Stockage du caractère dans le tableau
                 		if(car_ascii > 31 && car_ascii < 127)
                    		tab_carac[car_ascii]++;
    		}
     
    		// Erreur à corriger
    		return tab_carac;
     
    		// Fermeture du fichier
    		fclose(fp);
            }
     }
    Dois-je utiliser des pointeurs pour accèder au contenu de mon tableau ou pas ? si oui, comment dois-je m'y prendre ? merci de votre aide

  2. #2
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Donc ta fonction retourne un tableau de int d'ou le prototype
    int* freq_carac(char *nom_fichier)

    Par contre si tu retourne tab[127] tu retourne l'adresse d'une variable local
    Donc il faut y aller a coup de malloc et free
    En gros

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int *test(void) {
        int *tab = malloc(10*sizeof(int)):
        if(tab == NULL) exit(-1);
        tab[0]=0;
        return tab;
    }
     
    int main(void) {
        int *t=test();
        printf("%d\n", t[0])):
        free(t);
        return 0;
    }

  3. #3
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 12
    Par défaut
    je vais tenter de répondre en esperant ne pas dire de bêtises :p

    Quand tu déclare :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int tab_carac[127];
    tu as déjà un pointeur, quand tu déclare un tableau comme ça en fait tu déclare un pointeur mais c'est implicite.

    tu aurai tout aussi bien pu faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int *tab_carac=NULL;
    tab_carac=(int*)malloc(sizeof(int)*127);
    ça aurai été la même chose,

    donc pour renvoyer ce pointeur il faut changer le prototype de ta fonction par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int *freq_carac(char *nom_fichier)
    et là tu peux le renvoyer avec :
    à savoir qu'il faut fermer ton fichier avant le return sinon ton code de fermeture de fichier ne sera pas executé

    Voila j'espère ne pas avoir répondu de travers car je ne suis pas (encore? :p) un pro du C
    Et si c'est le cas promis j'arrête de dire des bêtises et laissera des gens plus "pro" que moi répondre :p

  4. #4
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par AxldenieD
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int tab_carac[127];
    tu as déjà un pointeur, quand tu déclare un tableau comme ça en fait tu déclare un pointeur mais c'est implicite.
    Oui mais si il retourne cette adresse elle ne sera plus valable en dehors de la fonction (d'ailleurs warning du compilo si celui ci bien reglé)
    Citation Envoyé par AxldenieD
    tu aurai tout aussi bien pu faire :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int *tab_carac=NULL;
    tab_carac=(int*)malloc(sizeof(int)*127);
    Pas besoin du cast
    tab_carac=malloc(sizeof(int)*127);

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 13
    Par défaut
    Merci pour votre aide, j'ai suivi vos conseils et ça fonctionne. Merci

  6. #6
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 12
    Par défaut
    merci de m'avoir repris

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par AxldenieD
    je vais tenter de répondre en esperant ne pas dire de bêtises :p
    Ahem...
    Quand tu déclare :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int tab_carac[127];
    tu as déjà un pointeur,
    Ah ? Où ça ? Je peux le modifier ?

    http://emmanuel-delahaye.developpez.....htm#pointeurs

    quand tu déclare un tableau comme ça en fait tu déclare un pointeur mais c'est implicite.
    Un pointeur implicite ? C'est fort !
    tu aurai tout aussi bien pu faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int *tab_carac=NULL;
    tab_carac=(int*)malloc(sizeof(int)*127);
    Une façon compliquée d'écrire
    int *tab_carac = malloc (sizeof *tab * 127);
    ça aurai été la même chose,
    Ben non. La principale différence est que dans un cas, le tableau est crée dans la mémoire automatique et donc detruit dès qu'on quitte la fonction. Dans le deuxième cas, la mémoire est crée dans la mémoire allouée, qui existe jusqu'à appel de free(). C'est très différent.

    Maintenant, le fait qu'un pointeur initialisé avec l'adresse d'un tableau puisse s'utiliser avec la notation de type indice p[i] au lieu de la notation pointeur *(p + i) est une facilité offerte par le langage C. C'est tout ce qu'on peut dire.
    donc pour renvoyer ce pointeur il faut changer le prototype de ta fonction par :
    C'est pas le pointeur qu'on renvoit, c'est sa valeur (et on la 'retourne' !), c'est à dire l'adresse du bloc alloué...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int *freq_carac(char *nom_fichier)
    et là tu peux le renvoyer avec :
    Ok... Revoir la terminologie...

  8. #8
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 12
    Par défaut
    Bon okay, message bien reçu
    (/me aimerai bien que sa prof de C lise ce topic :p)

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

Discussions similaires

  1. [PL/SQL] Fonction retournant un tableau
    Par moneyinthebank dans le forum SQL
    Réponses: 6
    Dernier message: 03/11/2006, 11h38
  2. Réponses: 24
    Dernier message: 24/05/2006, 19h19
  3. Fonction retournant un tableau initialisé
    Par ero-sennin dans le forum Delphi
    Réponses: 6
    Dernier message: 13/05/2006, 16h05
  4. [TP] Fonction retournant un tableau
    Par molesqualeux dans le forum Turbo Pascal
    Réponses: 8
    Dernier message: 07/05/2006, 01h01
  5. PB avec fonction retournant un tableau
    Par T-B dans le forum Langage
    Réponses: 2
    Dernier message: 27/01/2006, 22h01

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