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 :

procédure, tableau et pointeurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2022
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2022
    Messages : 18
    Par défaut procédure, tableau et pointeurs
    Salut j'ai un problème avec mon programme je ne sais pas si je dois utiliser les pointeurs ou non
    voici la partie du code ou j'ai des problèmes
    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
     
    COMM_Prod commProduit[10];
    void commande(int *numero){
        printf("-------------------------------------------------------------------\n");
        printf("--Pour commander taper le numéro associé au plat que vous voulez---\n");
        scanf("%d",&numero[0]);
        switch (numero[0])
        {
        case 1:
            printf("-------------------------------------------------------------------\n");
            printf("--------------Vous avez choisi \"Salade de cruidité\"--------------\n");
            printf("-------------------------------------------------------------------\n");
            printf("---------------------Combien en voulez-vous ?----------------------\n");
            scanf("%d",&commProduit[0].quantite);
    jjj
        case 2:
            printf("-------------------------------------------------------------------\n");
            printf("--------------Vous avez choisi \"Salade grésier\"--------------\n");
            printf("-------------------------------------------------------------------\n");
            printf("---------------------Combien en voulez-vous ?----------------------\n");
            scanf("%d",&commProduit[1].quantite);
            break;
    Et pour appeler le procédure

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    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 833
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par tahiratou Voir le message
    je ne sais pas si je dois utiliser les pointeurs ou non
    On n'utilise les pointeurs que dans 3 cas
    • on veut que la fonction appelée modifie une variable de l'appelant (comme la fonction n'a pas accès à la variable par son nom on lui passe son adresse pour qu'elle puisse quand-même y accéder)
    • on passe un tableau à la fonction (or un nom de tableau, correspondant à l'adresse de son premier élément, sera alors stocké par la fonction dans un pointeur)
    • on passe une structure à la fonction (et donc il vaut mieux alors passer son adresse car copier une adresse de 8 octets ça va plus vite que copier une structures de peut-être 8 milliards d'octets)


    Citation Envoyé par tahiratou Voir le message
    voici la partie du code ou j'ai des problèmes void commande(int *numero) {
    Alors c'est quoi "numero" ? C'est l'adresse d'un int. Donc cela sous-entend que l'appelant
    • possède un int et qu'il passe son adresse à la fonction
    • possède un tableau d'int et qu'il le passe tel quel à la fonction (or passer un tableau revient à passer l'adresse de son premier élément)

    Est-ce le cas?

    Citation Envoyé par tahiratou Voir le message
    Et pour appeler le procédure commande(numero);
    Hé ben voilà. Si comme je le crois "numero" est un simple int, alors la fonction reçoit une copie de cet int et non pas une adresse. Pourtant avant d'apprendre les pointeurs tu as dû apprendre les passages simples de variables à des fonctions. Pourquoi alors tout d'un coup tu ne sais plus faire cette opération si simple ??? Tu apprends "A", puis plus tard tu apprends "B" mais ce n'est alors pas une raison pour oublier "A"...
    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]

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2022
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2022
    Messages : 18
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    [*]on passe un tableau à la fonction (or un nom de tableau, correspondant à l'adresse de son premier élément, sera alors stocké par la fonction dans un pointeur)
    Enfaîte c'est ça que je tentais de faire

    Citation Envoyé par Sve@r Voir le message
    Alors c'est quoi "numero" ? C'est l'adresse d'un int. Donc cela sous-entend que l'appelant
    • possède un int et qu'il passe son adresse à la fonction
    • possède un tableau d'int et qu'il le passe tel quel à la fonction (or passer un tableau revient à passer l'adresse de son premier élément)

    Est-ce le cas?
    oui
    J'ai réussi à le faire finalement
    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
     
    void comm(int *numero){
     
        printf("-------------------------------------------------------------------\n");
        printf("--Pour commander taper le numéro associé au plat que vous voulez---\n");
        scanf("%d",numero);
        switch (*numero)
        {
        case 1:
            printf("-------------------------------------------------------------------\n");
            printf("--------------Vous avez choisi \"Salade de cruidité\"--------------\n");
            printf("-------------------------------------------------------------------\n");
            printf("---------------------Combien en voulez-vous ?----------------------\n");
            scanf("%d",&commProduit[0].quantite);
            break;
    Et voilà l'appelle de la fonction
    Merci à vous.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    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 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tahiratou Voir le message
    J'ai réussi à le faire finalement
    Je n'en suis pas si sûr que toi. Ce n'est pas parce qu'un code compile et s'exécute qu'il est correct.

    Citation Envoyé par tahiratou Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void comm(int *numero){
    ...
    }
    Et voilà l'appelle de la fonction: comm(numero);
    Donc numero c'est un tableau. J'aimerais bien voir comment il a été déclaré. Et ensuite j'aimerais bien savoir à quoi sert un tableau dans lequel il n'a été stocké qu'une seule valeur.
    Et aussi savoir si cette valeur sera utilisée ensuite par l'appelant...
    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 averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2022
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2022
    Messages : 18
    Par défaut
    Citation Envoyé par Sve@r Voir le message

    Donc numero c'est un tableau. J'aimerais bien voir comment il a été déclaré.
    Voilà la déclaration de la fonction
    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
    int numero[1000];
    void comm(int *numero){
     
        printf("-------------------------------------------------------------------\n");
        printf("--Pour commander taper le numéro associé au plat que vous voulez---\n");
        scanf("%d",numero);
        switch (*numero)
        {
        case 1: ...
        default:
            printf("-------------------------------------------------------------------\n");
            printf("------------le numéro choisi n'est associé à aucun plat------------\n");
            return comm(numero);
            break;
        }
    Citation Envoyé par Sve@r Voir le message
    Et ensuite j'aimerais bien savoir à quoi sert un tableau dans lequel il n'a été stocké qu'une seule valeur.
    Et aussi savoir si cette valeur sera utilisée ensuite par l'appelant...
    Le tableau ne stocke pas qu'une seule valeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int p=0;
            do
            {
                p=p+1;
                strcmp(choix,"OUI");
                system("clear");
                if (strcmp(choix,"OUI")==0)
                {
                    Menu();
                   comm(numero+p); 
                    facture(n);
                    ...
            } while (strcmp(choix,"OUI")==0);

  6. #6
    Membre expérimenté

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 329
    Par défaut
    Je suis un peu dubitatif quant à l'utilisation par 3 fois de strcmp()...
    C'est pas grave en soi mais sans les commentaires je me demande ce que tu veux faire...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    do
    {
      p=p+1;
      strcmp(choix,"OUI");
      system("clear");
      if (strcmp(choix,"OUI")==0)
      {
        Menu();
        comm(numero+p); 
        facture(n);
        ...
    } while (strcmp(choix,"OUI")==0);
    p <-- essaye d'utiliser des "noms parlants" p ça veut rien dire, et la lecture du code source risque d'être pénible, si c'est un entier signé il faudrait peut-être le précéder par le préfixe 'i'... exemple iCompteur, iParcoursPlats, ... c'est déjà mieux.
    strcmp(choix,"OUI"); <-- si choix est NULL ton programme va probablement partir en sucette, ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(choix!=NULL)
    {
      int codederetour=strcmp(choix,"OUI");
      ... // faire quelque chose avec le codederetour
    }
    if (strcmp(choix,"OUI")==0)
    {
    }
    <-- tu vérifies si choix est égal à "OUI" dans le while()... je comprends pas pourquoi tu refais le test ici... si -- supposition -- tu comptes exécuter toutes les instructions tant que "choix" est "OUI"... en espérant qu'à un moment dans tes fonctions
    "choix" puisse être modifié... à moins que tu veuilles que ton programme ne tourne "à l'infini"

    Fais attention avec la fonction scanf()... elle risque en l'état de poser soucis... &numero[positiondansletableau] me paraît plus approprié... ici tu risques de ne modifier que le premier élément de ton tableau &numero[0] <=> numero...
    Moi je n'utiliserais pas la fonction system()... les séquences d'échappement ANSI sont plus "portables"... à condition que le système hôte soit compatible ANSI.

    C'est un programme assez compliqué me semble-t-il... c'est normal que tu patauges un peu... cependant si tu arrives à le faire fonctionner tu auras appris beaucoup de choses.
    Les pointeurs sont les éléments les plus complexes en langage C/C++, donc pas de panique si ça ne rentre pas tout seul.

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    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 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tahiratou Voir le message
    Voilà la déclaration de la fonction int numero[1000]
    Ok, numero est bien un tableau. Faudrait que tu expliques pourquoi tu le mets en global, et si le global est nécessaire alors pourquoi tu te fais chier à le passer à une fonction qui le connait déjà mais bon, c'est une autre histoire.

    Citation Envoyé par tahiratou Voir le message
    Le tableau ne stocke pas qu'une seule valeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int p=0;
            do
            {
                p=p+1;
                strcmp(choix,"OUI");
                system("clear");
                if (strcmp(choix,"OUI")==0)
                {
                    Menu();
                   comm(numero+p); 
                    facture(n);
                    ...
            } while (strcmp(choix,"OUI")==0);
    Exact, chaque boucle décale "p" et comme la fonction remplit à chaque boucle numero[p] on remplit donc peu à peu tout le tableau. On remarquera que "p" commençant à 1, la case [0] du tableau n'est donc pas utilisée. Le strcmp(choix, "OUI") initial me laisse dubitatif (je compare puis je n'utilise pas le résultat de la comparaison) et les autres aussi (comme choix n'est pas modifié, soit il est égal à "OUI" et il le sera toujours, soit il ne l'est pas et il ne le sera jamais) mais ça reste pour l'instant du détail.

    La question principale demeure : à quoi sert de remplir un tableau de numeros si ton programme ne le traite pas ensuite (ou, dit dans l'autre sens, si on s'occupe du numero[p], à quoi sert d'avoir gardé en mémoire le numero[p-1], numero[p-2], etc...) ???
    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]

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

Discussions similaires

  1. VBA - Tableau de pointeurs sur des fonctions (ou procédures).
    Par Costa Guy dans le forum Général VBA
    Réponses: 2
    Dernier message: 07/06/2017, 13h35
  2. Tableau de pointeurs sur objets
    Par bassim dans le forum C++
    Réponses: 11
    Dernier message: 13/12/2005, 19h45
  3. [GCC] Tableau de pointeurs pour accès multiples en asm
    Par Flo. dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 12/12/2005, 08h47
  4. tableau de pointeurs
    Par seal3 dans le forum C++
    Réponses: 7
    Dernier message: 01/11/2005, 20h51
  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