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 retourne array


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2011
    Messages : 13
    Points : 10
    Points
    10
    Par défaut fonction retourne array
    Bonsoir,


    je débute en c ... j'ai écrit mon premier code mais je bute sur une fonction.

    J'aimerais que celle-ci me retourne un tableau....


    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
     
    #include <stdio.h>
     
     
    int convert ( int iNumber, int iBase ) {
        int cResult[sizeof(int)];
        int iCompteur = 0;
     
        while ( iNumber != 0 ) {
            cResult[iCompteur] = iNumber % iBase;
            iNumber = iNumber / iBase;
            iCompteur++;
     
        }
        iCompteur = iCompteur - 1;
        while ( iCompteur >= 0 ) {
            printf("%d", cResult[iCompteur]);
            iCompteur--;
        }
        printf("\n");
     
        //return cResult;
    }
     
    int main (int argc, const char * argv[])
    {
     
        // insert code here...
        convert(10,2);
     
        return 0;
    }

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    J'aimerais que celle-ci me retourne un tableau....
    1- Une fonction ne peut pas retourner un tableau
    2- Une fonction peut retourner l'adresse de début d'un tableau
    3- Cette adresse doit être celle d'un tableau valide, donc ne peut être celle d'une variable locale (non static c.a.d une variable créée par allocation automatique et qui est détruite en sortie de tableau)
    4- Si le tableau est créé par la fonction, il doit donc l'être par allocation dynamique (malloc())
    5- Le schéma est alors dans ce cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int * convert ( int iNumber, int iBase )
    {
      // int cResult[sizeof(int)];
      int * cResult = malloc(sizeof(int)*sizeof(int) );   // création d'un tableau de sizeof(int) int
      if(cResult!= NULL)
      {
             ......
      }
      return cResult;
    }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2011
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    mais en faisant ainsi j'ai un soucis dans mon code...

    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
    #include <stdio.h>
    #include <stdlib.h>
     
     
    int * convert ( int iNumber, int iBase )
    {
        int * cResult = malloc(sizeof(int)*sizeof(int));
        int iCompteur = 0;
     
        if ( cResult != NULL )
        {
            while ( iNumber != 0 ) {
                cResult[iCompteur] = iNumber % iBase;
                iNumber = iNumber / iBase;
                iCompteur++;
     
            }
            //iCompteur = iCompteur - 1;
            //int p = cResult;
            //while ( iCompteur >= 0 ) {
            //p = cResult[iCompteur];
            //printf("%d", p);
            //iCompteur--;
            //}
     
     
        }
        return cResult;
    }
     
    int main (int argc, const char * argv[])
    {
     
        // insert code here...
        int iNumbre = convert(2,2);
        printf("%d", iNumbre);
        return 0;
    }

    me retourne ceci :

    [Switching to process 1565 thread 0x0]
    1051136Program ended with exit code: 0

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par the_nmy Voir le message
    mais en faisant ainsi j'ai un soucis dans mon code...

    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
    #include <stdio.h>
    #include <stdlib.h>
    
    
    int * convert ( int iNumber, int iBase )
    {
        int * cResult = malloc(sizeof(int)*sizeof(int));
        int iCompteur = 0;
        
        if ( cResult != NULL )
        {
            while ( iNumber != 0 ) {
                cResult[iCompteur] = iNumber % iBase;
                iNumber = iNumber / iBase;
                iCompteur++;
                
            }
            //iCompteur = iCompteur - 1;
            //int p = cResult;
            //while ( iCompteur >= 0 ) {
            //p = cResult[iCompteur];
            //printf("%d", p);
            //iCompteur--;
            //}
            
             
        }
        return cResult;
    }
    
    int main (int argc, const char * argv[])
    {
    
        // insert code here...
        int iNumbre = convert(2,2);
        printf("%d", iNumbre);
        return 0;
    }

    me retourne ceci :

    [Switching to process 1565 thread 0x0]
    1051136Program ended with exit code: 0
    Salut

    Ta fonction convert() renvoie une adresse (l'adresse d'une zone qu'on peut considérer comme un tableau). Or toi, tu te sers de ce qu'elle te renvoie comme d'un entier (on peut d'ailleurs remarquer que chez-toi, cette adresse vaut 1051136)

    Accessoirement je ne pige absolument pas ton malloc(sizeof(int) * sizeof(int)).
    malloc sers à allouer des éléments donc la syntaxe générale c'est malloc(nb_elem_desirés * taille_d_un_element). Et ensuite, quand tu remplis la zone allouée il te faut bien entendu veiller à ne pas rentrer plus d'éléments que prévus (ce que tu ne fais absolument pas avec ton iCompteur++ qui monte ad-vitam)

    Donc
    1) tu réécris ta fonction un petit peu mieux
    2) tu réécris ton main en prenant en compte le fait qu'il reçoit maintenant l'adresse d'une zone (donc en fait quasiment l'équivalent d'un tableau) et non plus un simple int
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2011
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    euh....rien compris...

    sinon le malloc m' a été proposé ici...

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par the_nmy Voir le message
    euh....rien compris...
    Peut-être alors qu'il te faut acquérir certaines bases avant d'essayer de coder ton algo.

    Citation Envoyé par the_nmy Voir le message
    sinon le malloc m' a été proposé ici...
    Je n'ai pas dit que malloc n'était pas à utiliser !!! J'ai quand-même lu le post de Diogène. Mais Diogène t'a donné un schéma de code, un exemple généralisé qu'il te faut adapter à ton propre cas. Il te faut donc dire à malloc que tu demandes une zone adaptée à n entiers et stocker l'adresse de cette zone dans un pointeur => exemple: int *pt=malloc(12 * sizeof(int)) pour allouer par exemple 12 espaces mémoires pouvant chacun d'eux stocker un int
    Cela présuppose que tu connaisses, dans ta fonction, le nombre d'int dont tu auras besoin. Cette connaissance peut te parvenir par le biais d'un compteur, un algo ou autre on s'en fout mais quand malloc est invoqué, tu dois savoir à ce moment là de combien d'éléments tu auras besoin. Sinon on entre dans un autre cas de figure : la réallocation qui est plus complexe et dont je ne suis pas certain que tu aies les connaissances pour t'y intéresser de suite...

    Donc voici un exemple pour ta fonction convert
    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
    int * convert ( int iNumber, int iBase )
    {
        int * cResult;
        int iCompteur = 0;
        int nb_elem;
     
        nb_elem=<tout un code permettant de trouver de combien de int tu auras besoin>;
        cResult = malloc(nb_elem *sizeof(int));
        if (cResult == NULL)
        {
            printf("Erreur malloc - Abort\n");
            return NULL;
        }
     
     
        ... tout le remplissage de cResult...
     
        return cResult;
    }

    Maintenant ta fonction convert() alloue l'espace et le remplit. Mais ce qu'elle te renvoie c'est un pointeur ; ou pour faire plus simple (même si ce n'est pas exact au sens strict), c'est un tableau. Or quand tu as écrit ton topic, tu demandais comment renvoyer un tableau. Ben voilà, ton tableau tu l'as dans le main. Sauf que tu ne l'affiches pas !!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Réponses: 10
    Dernier message: 15/04/2014, 18h49
  2. Fonction retournant la partie entière d'un nombre
    Par annedjomo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/11/2004, 15h58
  3. fonction retournant une valeur
    Par ryan dans le forum ASP
    Réponses: 4
    Dernier message: 06/09/2004, 17h45
  4. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37
  5. [Manip de fichiers] Fonction retournant des infos
    Par sans_atouts dans le forum C
    Réponses: 3
    Dernier message: 24/07/2002, 14h16

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