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 entier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 79
    Par défaut fonction retournant un tableau entier
    Bonjour
    Voici le probleme

    J'ai un tableau de 4 valeurs
    int tab[4] = {1,9,6,7};

    je crée par exemple une fonction qui retranche 5 à toute les valeurs du tableau, mais je veux que cette fonction me ressorte le tableau entier.

    fonction (int tab[]) et je veux qu'elle retourne tab_sortie = {-4,4,2,3};

    Alors j'arrive à le faire en faisant comme suit mais ce n'est pas exactement ce que je voudrais faire

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    void soustraction(int *tab_entree, int *tab_sortie)
    {
        int i = 0;
        for (i = 0; i < 4; ++i)
        {
            tab_sortie[i] = tab_entree[i] - 5;
        }
    }
     
    int main()
    {
        int entree[4] =  {1,9,6,7};
        int result[4];
        int j = 0;
        soustraction(entree, result);
        for  (j = 0; j < 4; ++j)
        {
            printf("%d\n", result[j]);
        }
        system("pause");
        return 0;
    }
    alors moi je désirerai une fonction qui accepte en entrée :
    soustraction(int *tab_entree) uniquement

    et qui en sortie dans ma fonction "main" me donne le résultat:
    par exemple dans "main" j'aimerai pourvoir faire

    result = soustraction(entree)
    mais je n'y arrive pas sniffff

    merci d'avance

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Par défaut
    Il faudrait que tu alloue dynamiquement le tableau result dans soustraction.
    int * result = (int*)malloc(4*sizeof(int))
    mais 4 pourrait etre un parametre de la fonction, etant le nombre d'elements dans les tableaux.
    Et a la fin de la fonction soustraction tu retourne result :
    return result

    et soustraction se declare comme ceci : int * soustraction(int * entree);

    Ton code serait plus lisible entre balises (surtout pour l'identation).

  3. #3
    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
    pasdeface: On ne caste pas le retour de malloc() en C.

    ninours23: tu as deux choix: Soit retourner un tableau alloué dynamiquement, soit passer le tableau de sortie, déjà alloué, en paramètre:
    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
    /* Dynamiquement: */
    #include <stdio.h>
    #include <stdlib.h>
     
    int * soustraction(int const *tab_entree)
    {
    	int *tab_sortie = malloc(4 * sizeof(*tab_sortie));
    	if(tab_sortie != NULL)
    	{
    		size_t i = 0;
    		for (i = 0 ; i < 4 ; ++i)
    		{
    			tab_sortie[i] = tab_entree[i] - 5;
    		}
    	}
    	return tab_sortie;
    }
     
    int main(void)
    {
    	int entree[4] = {1,9,6,7};
    	int *result = soustraction(entree);
    	if(result != NULL)
    	{
    		size_t j = 0;
    		for (j = 0 ; j < 4 ; ++j)
    		{
    			printf("%d\n", result[j]);
    		}
    		free(result), result=NULL;
    	}
    	system("pause");
    	return 0;
    }
    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
    /* Statiquement: */
    #include <stdio.h>
    #include <stdlib.h>
     
    void soustraction(int const *tab_entree, int *tab_sortie)
    {
    	size_t i = 0;
    	for (i = 0 ; i < 4 ; ++i)
    	{
    		tab_sortie[i] = tab_entree[i] - 5;
    	}
    }
     
    int main(void)
    {
    	int entree[4] = {1,9,6,7};
    	int result[4];
    	size_t j = 0;
    	soustraction(entree, result);
    	for (j = 0; j < 4; ++j)
    	{
    		printf("%d\n", result[j]);
    	}
    	system("pause");
    	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.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 79
    Par défaut
    Je vous remercie mais je ne vois pas du tout ce qu'il faut faire, j'ai appris le C sur le tas et je l'utilise de façon non-academique : faire des calculs rapide pour des besoins scientifique ^^
    si quelqu'un pouvais m'écrire un truc se serai cool, car l'allocation dynamique je vois même pas à quoi ça peut ressemblé ^^

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 79
    Par défaut
    merci je vais essayer ^^

  6. #6
    Membre chevronné Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Par défaut
    quand tu fais un "int tab[4]", tu crées un tableau de 4 entiers et tu alloues l'espace mémoire suffisant pour le contenir.

    tu peux aussi définir un pointeur vers un tableau d'entiers, puis allouer l'espace mémoire pour contenir ce tableau et afin faire pointer ton pointeur vers le premier éléments de ton tableau. C'est la seule chose que tu puisses faire si tu ne veux pas donner le tableau de résultat en paramètres : une fonction C ne peut pas renvoyer un tableau, par contre, elle peut renvoyer un pointeur vers le premier élément d'un tableau.

    [edit] : oula, le temps que je rédige et déjà plein de message !!!

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    pasdeface: On ne caste pas le retour de malloc() en C.
    j'aurai appris un truc
    soit passer le tableau de sortie, déjà alloué, en paramètre:
    C'est ce qu'il faisait il me semble

  8. #8
    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
    Citation Envoyé par pasdeface Voir le message
    C'est ce qu'il faisait il me semble
    En effet, je l'ai juste mis au propre (surtout que quand j'ai posté, il manquait les balises code).
    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.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 79
    Par défaut
    La version statique fonctionne, normal je le faisais et toi aussi ^^
    par contre le dynamique renvoi une erreur :

    error ligne 7 (celle du malloc) invalid conversion from 'void*' to 'int*'

  10. #10
    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 ninours23 Voir le message
    alors moi je désirerai une fonction qui accepte en entrée :
    soustraction(int *tab_entree) uniquement

    et qui en sortie dans ma fonction "main" me donne le résultat:
    par exemple dans "main" j'aimerai pourvoir faire

    result = soustraction(entree)
    C'est pas possible. La première solution était correcte.

    http://emmanuel-delahaye.developpez....ourner_tableau

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

Discussions similaires

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

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