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, tableau et pointeur


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 67
    Points : 61
    Points
    61
    Par défaut Fonction, tableau et pointeur
    Bonjour à tous,

    Je débute le langage C après avoir fait du python.
    Je souhaite réaliser un programme qui me donne le poids, la taille et la vitesse d'un animal.
    J'ai réalisé ceci et des problèmes apparaissent:

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int proprietes(char Nom[]) {
     
        int tableau[3];
     
        int Loup[3] = {80,80,60};
        int Ours[3] = {300,150,30};
        int Lynx[3] = {30,60,80};
     
        if (Nom == "Loup") {
                tableau[0] = Loup[0];
                tableau[1] = Loup[1];
                tableau[2] = Loup[2];
        }
        else if (Nom == "Ours") {
                tableau[0] = Ours[0];
                tableau[1] = Ours[1];
                tableau[2] = Ours[2];
        }
        else if (Nom == "Lynx") {
                tableau[0] = Lynx[0];
                tableau[1] = Lynx[1];
                tableau[2] = Lynx[2];
        }
     
    	return tableau; // warnings : return makes integer without a cast - function returns adress of local variable
    }
     
    int main() {
     
        char Animal[5] = "Loup";
        int tableau[3] = proprietes(Animal); // error : invalid initializer
     
    	printf("\nVos caracteristiques :\n\n");
    	printf("    Animal : %s\n",Animal);
    	printf("    Poid : %s\n",tableau[0]);
    	printf("    Taille : %s\n",tableau[1]);
    	printf("    Vitesse: %s\n",tableau[2]);
     
    	return 0;
    }
    J'ai cherché, et j'en ai déduis qu'il fallait définir comme type de retour un pointeur sur mon tableau .
    Parce que en C on ne peut pas retourner un tableau .

    Mais comment puis-je utiliser mon pointeur ... ... pour ce que je désire ? On dirait qu'il faut utiliser des notions très compliquées pour un problème simple .

    Ou alors je peux faire autrement pour ce que veux réaliser ?
    Merci par avance pour vos indication.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    2 grosses choses:

    1) Nom == "Loup" ce n'est pas le bon test. Tu es en C. Tu testes 2 pointeurs.
    Par exemple utilise strcmp avec un #include <string.h>.

    2) On ne peut pas retourner un tableau, mais un pointeur int* proprietes(char Nom[]) { (<- note la petite étoile)
    Il te manque la notion de pointeurs ->

  3. #3
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    Utiliser un tableau n'est pas adapté ici.
    Une structure est plus adaptée et plus lisible, d'autant qu'une fonction peut retourner une structure.
    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
    typedef struct CaractAnimal
    {
        int poids;
        int taille;
        int vitesse;
    } CaractAnimal;
     
    CaractAnimal proprietes( const char nom[] ) {
     
        CaractAnimal  animal;
     
        static const CaractAnimal  Loup = {80,80,60};
        static const CaractAnimal  Ours = {300,150,30};
        static const CaractAnimal  Lynx = {30,60,80};
     
        if ( stricmp( nom , "Loup") == 0 ) {
            animal = Loup;   // une structure se copie avec le '='
        }
        else if ( stricmp( nom , "Ours" ) == 0 ) {
            animal = Ours;
        }
        else if ( stricmp( nom , "Lynx" ) == 0 ) {
            animal = Lynx;
        }
        else {
            printf( "animal '%s' est inconnu\n" );
        }
        return animal;  // une structure peut être retournée par une fonction
    }
     
    int main() {
     
        char  nomAnimal[5] = "Loup";
        CaractAnimal  caractAnimal = proprietes( nomAnimal );
     
        printf( "\nVos caracteristiques :\n\n" );
        printf( "    Animal : %s\n", nomAnimal );           // on utilise %s pour des chaînes
        printf( "    Poids : %d\n", caractAnimal.poids );  // on utilise %d pour les entiers
        printf( "    Taille : %d\n",  caractAnimal.taille );
        printf( "    Vitesse: %d\n", caractAnimal.vitesse );
     
        return 0;
    }

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 67
    Points : 61
    Points
    61
    Par défaut
    Merci pour vos réponses à tous les deux. J'ai vu les pointeurs mais je ne maîtrise pas du tout. Et je n'ai pas encore abordé les structures.

    Je reviens vers vous dès que j'aurais compris ces 2 notions

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 67
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par foetus
    Nom == "Loup" ce n'est pas le bon test. Tu es en C. Tu testes 2 pointeurs.
    Par exemple utilise strcmp avec un #include <string.h>.
    J'ai modifié avec stricmp(Nom,"Loup")==0 si je veux vérifier que mon nom est lexicographiquement égal à Loup.

    Citation Envoyé par foetus
    Il te manque la notion de pointeurs.
    Si je résume ce que j'ai compris, un pointeur c'est l'adresse mémoire d'une variable. Pour le petit programme que je veux faire, c'est beaucoup trop pointu
    Plus sérieusement, j'ai vu et compris comment déclarer un pointeur, écrire et réutiliser sa case mémoire, pour un type int ou char. Je vais donc utiliser une structure, non pas par fainéantise mais parce que c'est effectivement une solution adaptée à ce que je désire.

    Citation Envoyé par dalfab
    Une structure est plus adaptée et plus lisible, d'autant qu'une fonction peut retourner une structure.
    Avec ce que j'ai compris, j'ai écris ça, une utilisation toute basique d'une structure :
    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>
    #include <string.h>
     
    typedef struct {
        char nom[10]; // Je ne peux rentrer un nombre de caractères supérieur à 10
        int poids;
        int taille;
        int vitesse;
     
    } classeAnimaux;
     
    int main() {
     
        classeAnimaux animal;
     
        printf("\nChoisissez votre animal :\n");
        scanf("%s",animal.nom);
     
    	printf("\nVos caracteristiques :\n\n");
    	printf("    Animal : %s\n",animal.nom);
    	//printf("    Poids : %s\n",animal.poids);
    	//printf("    Taille : %s\n",animal.taille);
    	//printf("    Vitesse : %s\n",animal.vitesse);
    	return 0;
    }
    Je reviens vers vous dés que j'aurais avancé dans la compréhension du code de dalfab

  6. #6
    Membre habitué Avatar de Abacar94
    Homme Profil pro
    L2 Math-informatique
    Inscrit en
    Novembre 2015
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Niger

    Informations professionnelles :
    Activité : L2 Math-informatique

    Informations forums :
    Inscription : Novembre 2015
    Messages : 103
    Points : 133
    Points
    133
    Par défaut
    Es ce que tu a peu un compris la notion de Structure de donnée ??

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Question assez importante: pourquoi avoir nommée ta structure "classeAnimaux"
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par Leododo Voir le message
    c'est beaucoup trop pointu
    Manque de bol pour toi , un tableau c'est un pointeur, avec une arithmétique et quelques différences sur le fond (mais pas forcément sur la forme)

  9. #9
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ternel Voir le message
    Question assez importante: pourquoi avoir nommée ta structure "classeAnimaux"
    J'allais poser la même question !

    Il n'y a pas de classe en C. Je nommerais donc de nommer une telle structure Animal, tout simplement.

    Citation Envoyé par foetus Voir le message
    Manque de bol pour toi , un tableau c'est un pointeur, avec une arithmétique et quelques différences sur le fond (mais pas forcément sur la forme)
    On pourrait arrêter de dire ça à tous les débutants ? C'est faux et ça leur fait croire qu'un tableau et un pointeur, c'est pareil !!!

    Je te redonne encore une fois le lien vers cet article : https://gradot.wordpress.com/2012/08...ointeurs-en-c/

  10. #10
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Selon la réponse à "pourquoi classeAnimaux?", il pourrait être intéressant de s'intéresser au C++, plutôt qu'au C.
    Je ne dénigre pas le C, mais quitte à apprendre un nouveau langage, autant que c'en soit un adapté au besoin.

    Dans tous les cas, le pluriel n'est pas de mise.
    En effet, un type n'est décrit qu'une fois, mais son nom est utilisé pour chaque variable.
    Ca serait étrange d'écrire classeAnimaux crocodile = {...}; classeAnimaux Giraffe = {...};.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 67
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par Abacar94
    Est-ce que tu as un peu compris la notion de Structure de données ??
    Pour moi une structure de données, c'est la démarche que l'on utilise pour faire un programme. Par exemple si je veux stocker plusieurs variables d'affilé, j'utiliserais une liste plutôt que de déclarer chaque variables tel quelle. C'est une manière d'organiser son programme.

    Citation Envoyé par ternel
    Question assez importante: pourquoi avoir nommée ta structure "classeAnimaux"
    Hahaha ce fut une longue réflexion. J'aurais pu mettre "caracteristiquesAnimaux" => bien mais trop long. Ou "caractAnimaux" => ça me plaisait bof. Ou bien "proprietesAnimaux" => J'aime bien mettre des accents et en programmation c'est moyen. "attributsAnimaux" ou "classeAnimaux" ça fait un peu java, j'en ai pris un des deux tant pis. Ou encore "Animaux", mais lors de la déclaration : Animaux animal;, c'est un coup à confondre.
    C'est marrant que vous me demandiez cela car je suis allé chercher des synonymes et tout pour avoir un nom qui me plaise

    Citation Envoyé par ternel
    Je nommerais donc de nommer une telle structure Animal, tout simplement.
    Citation Envoyé par Bktero
    Dans tous les cas, le pluriel n'est pas de mise.
    Mais c'est pire, Animal animal;

  12. #12
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 67
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Merci

    Ooooh regardez comme c'est intéressant :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    typedef struct {
     
        char nom[10];
        int poids;
        int taille;
        int vitesse;
     
    } structureAnimal;
     
    int main() {
     
        structureAnimal animal;
     
        printf("\nChoisissez votre animal :\n");
        scanf("%s",animal.nom);
     
        if (stricmp(animal.nom,"Loup") == 0) {
            animal.poids = 50;
            animal.taille = 80;
            animal.vitesse = 60; }
     
        else if (stricmp(animal.nom,"Lynx") == 0) {
            animal.poids = 30;
            animal.taille = 60;
            animal.vitesse = 80; }
     
        else if (stricmp(animal.nom,"Ours") == 0) {
            animal.poids = 200;
            animal.taille = 140;
            animal.vitesse = 30; }
     
    	printf("\nVos caracteristiques :\n\n");
    	printf("    Animal : %s\n",animal.nom);
    	printf("    Poids : %d\n",animal.poids);
    	printf("    Taille : %d\n",animal.taille);
    	printf("    Vitesse : %d\n",animal.vitesse);
     
    	return 0;
    }
    Lorsque je teste ce programme qui avec loup ou lynx ou ours, il me retourne ce que je veux, c'est à dire ce qui est écrit dans le programme.
    En revanche, si je teste avec chien ou sardine ou n'importe quoi d'autre ( dans la limite de 10 caractères), il me retourne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Poids = 78
    Taille = 8
    Vitesse = 70
    Toujours ces mêmes valeurs, c'est trop rigolo !

    Plus sérieusement, je cherche actuellement pourquoi il me retournes cela et non un message d'erreur, car je n'ai volontairement pas prévu de else.

  13. #13
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Leododo Voir le message
    Mais c'est pire, Animal animal;
    Et pourtant, c'est ce que tu retrouves dans toute la POO et souvent aussi dans la programme non OO mais utilisant des types structurés. Un classique dans les exemples Java est de faire Object object; voire .
    Mais je pense que tu écrira en général Animal sardine; ou Animal chien;, ce qui sera logique. Animal animal;, c'est quand tu sais pas quel animal ce sera, et dans ce cas, c'est logique comme nommage, non ?


    Citation Envoyé par Leododo Voir le message
    En revanche, si je teste avec chien ou sardine ou n'importe quoi d'autre ( dans la limite de 10 caractères), il me retourne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Poids = 78
    Taille = 8
    Vitesse = 70
    Toujours ces mêmes valeurs, c'est trop rigolo !

    Plus sérieusement, je cherche actuellement pourquoi il me retournes cela et non un message d'erreur, car je n'ai volontairement pas prévu de else.
    Dans tous les cas, il affiche ta structure. Tu n'as pas fait de else explicite, donc dans les cas non prévus par tes if else, il affiche la structure qui contient forcément des données. La question est : quelles sont ces données puisque tu n'as pas explicitement renseigné les champs ?

    Bonne nouvelle, j'ai aussi écrit un article sur le sujet https://gradot.wordpress.com/2012/09...ructures-en-c/

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 23/06/2009, 16h52
  2. tableau de pointeur de fonction
    Par exhortae dans le forum C
    Réponses: 2
    Dernier message: 31/12/2007, 12h33
  3. [BCB6]Tableau de pointeurs sur fonctions
    Par rtg57 dans le forum C++Builder
    Réponses: 6
    Dernier message: 06/10/2006, 20h49
  4. Tableau de pointeur de fonction
    Par Gryzzly dans le forum C
    Réponses: 7
    Dernier message: 31/12/2005, 10h47
  5. Tableau de pointeurs de fonctions
    Par Alp dans le forum C++
    Réponses: 7
    Dernier message: 29/10/2005, 13h19

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