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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 67
    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 confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 771
    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 771
    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 confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 599
    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 confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 67
    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 confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 67
    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 actif 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
    Par défaut
    Es ce que tu a peu un compris la notion de Structure de donnée ??

  7. #7
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    Par défaut
    Question assez importante: pourquoi avoir nommée ta structure "classeAnimaux"

  8. #8
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 771
    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 771
    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
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    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

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    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 = {...};.

+ 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