Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C] questions en l'air sur les fonctions

    11 janvier 2006 à 14:27:05

    1)
    int truc(x, y){
                   int x, y, somme;
                   somme = x + y;
                   return somme;
                  }
    Si j'ai bien compris, cette fonction prend en argument x et y, et renvoie la valeur x + y, nan?

    2) quand on voit:
    int main(int argc, char *argv[])
    à quoi ça sert de donner des arguments à main() ? ça signifie qu'on peut entrer ces arguments? Si oui, comment ça? o_O

    3)
    Quand on définit: int truc() ça signifie que la valeur renvoyée par truc doit être un integer? Qu'est-ce qu'il se passe si ça renvoie un char par exemple?

    Pour l'instant j'ai que ça à demander :-°
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      11 janvier 2006 à 14:33:03

      Citation : V1944

      1)

      int truc(x, y){
                     int x, y, somme;
                     somme = x + y;
                     return somme;
                    }

      Si j'ai bien compris, cette fonction prend en argument x et y, et renvoie la valeur x + y, nan?

      2) quand on voit:

      int main(int argc, char *argv[])

      à quoi ça sert de donner des arguments à main() ? ça signifie qu'on peut entrer ces arguments? Si oui, comment ça? o_O

      Pour l'instant j'ai que ça à demander :-°


      1) oui, mais pas besoin de redéclarer x et y, tu les met en arguments quand tu appelles la fonction

      2) aucune idée, tu peux même les enlever
      Edit: désolé j'avais pas vu la 3), mais de toute manière je sais pas
      • Partager sur Facebook
      • Partager sur Twitter
        11 janvier 2006 à 14:38:54

        Les arguments de main(), même s'ils ne me servent pas, peuvent être chouettes à certains moments... personnaliser son main() peut toujours servir...
        • Partager sur Facebook
        • Partager sur Twitter
          11 janvier 2006 à 14:40:33

          1/

          int truc(x, y)
          {
              return x+y;
          }


          Comme ceci c'est mieux.

          2/ argv est un tableaux de pointeur vers des chaînes de caractères qui sont en fait des arguments passés au programme, argc c'est tout simplement le nombre d'arguments passés. J'en sais pas plus ^^

          3/ Oui la valeur renvoyé sera un int, si c'est un char qui récupère la valeur, alors je pense que ça fera rien de special si la valeur est entre -128 et 127, ou de 0 à 258 (pour un unsigned char).
          Si la valeur n'est pas dans ces limites aucune idée de ce qui se passera, surement une erreur ^^

          • Partager sur Facebook
          • Partager sur Twitter
            11 janvier 2006 à 14:46:05

            2) argc c'est la taille du tableau argv (sans tenir compte du dernier élément, un pointeur nul).
            argv c'est :
            [0] => commande utilisée pour accéder au programme
            [1 -> argv] => arguments éventuels

            Tu peux par exemple lancer un programme en faisant lala.exe -truc
            dans ce cas-là, [0] vaudra "lala.exe" et [1] vaudra "-truc"

            Ca sert à faire varier un paramètre pour un programme, par exemple pour faire varier la limite de calcul d'un calculateur de nombres premiers...

            3) Rien, on gaspille seulement de la mémoire pour rien.
            • Partager sur Facebook
            • Partager sur Twitter
              11 janvier 2006 à 14:47:29

              Ops, j'avais oublié que le char en lui-même est un nombre ^__^ ;

              ===============================================================================================

              Alors comme je suis un newbie en fonctions j'ai créé un projet composé de main.c et de mesfonctions.h:

              main.c:
              #include <stdio.h>
              #include "mesfonctions.h"



              int main(){
                  int addition(a, b);
                  getchar();
              }

              mesfonctions.h:
              int addition(int a, int b){
                  printf("entrer un nombre:");
                  scanf("%ld", &a);
                  printf(" + ");
                  scanf("%ld", &b);
                  printf("\n%ld + %ld = ", a, b);
                  return a + b;
                            }
              Pis bon, si ça marchait, je posterais pas ici >_> en fait ça ne prend pas en compte mon appel de fonction, main.c lance à l'exécution uniquement le getchar()... je jure avoir relu les cours de M@theo pourtant =/

              J'dois être con

              EDIT:

              Citation : Elentar

              Tu peux par exemple lancer un programme en faisant lala.exe -truc
              dans ce cas-là, [1] vaudra "-truc"

              Aaah, oui, un gars m'avait dit:

              Citation : un gars

              chaussette() c'est bien. Mais chaussette -verte -puante c'est mieux!

              Voilà pour la minute scientifique... >_>
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                11 janvier 2006 à 14:52:39

                Euh.... a et b ne sont pas déclarées si je ne m'abuse?
                • Partager sur Facebook
                • Partager sur Twitter
                  11 janvier 2006 à 14:53:15

                  Ne mets pas de définitions de fonctions dans les headers, uniquement des prototypes.
                  Et puis on ne mets pas de variables pas encore définies pour utiliser une fonction, c'est totalement illogique...
                  int addition(a, b); est incorrect, inutile de repréciser le type de retour de la fonction (int en l'occurence).
                  Peut-être est-ce que tu voulais faire int var = addition(a, b);

                  Et en fait, si ça affiche le résultat de l'addition, pourquoi retourner la valeur aussi ? Soit tu mets en type void sans retour, soit tu n'affiche pas le résultat et tu gêres ça dans main()
                  • Partager sur Facebook
                  • Partager sur Twitter
                    11 janvier 2006 à 14:55:55

                    Et dans le header, je mets:
                    int addition(int a,int b);
                    ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      11 janvier 2006 à 14:57:58

                      Oui tu mets ça dans header.

                      Et pour ta fonction fait plutot du genre :

                      int addition()
                      {
                          int a, b;
                          printf("Entrez un nombre : ");
                          scanf ("%d", &a);
                          printf("Entrez un autre nombre : ");
                          scanf ("%d", &b);
                         
                          return a+b;
                      }
                                   
                      int main(int argc, char *argv[])
                      {
                          printf("Le resultat est %d\n", addition());

                          system("pause");
                          return 0;
                      }
                      • Partager sur Facebook
                      • Partager sur Twitter
                        11 janvier 2006 à 14:58:15

                        reste plus qu'à trouver ce que je mets dans le .c! :lol: *fuit*

                        Edit: pwned, merci Araya ^^

                        Mais à ce moment-là, il ne faut pas inclure mesfonction.h :o et justement ce qui m'intéresserait ce serait de comprendre le fonctionnement des header, qu'est-ce qui est portable du .c au .h, de définir le maximum dans mesfonctions.h, quoi.
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          11 janvier 2006 à 14:59:07

                          Ou alors tu crée un fichier "mesfonctions.c" (le nom c'est le même que celui du header mais en .c) et dedans tu met ta fonction addition
                          • Partager sur Facebook
                          • Partager sur Twitter
                            11 janvier 2006 à 14:59:28

                            dans ce cas il faut que ce soit ta fonction qui renvoit la valeur obtenue avec les deux variables , sinon il faut utiliser trois variables et des pointeurs il me semble
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              11 janvier 2006 à 15:03:35

                              Plusieurs erreurs :

                              Pas d'implémantations de fonctions dans les .h, fauit créer des .c (ou les laisser dans le main.c là c'est court).

                              Il me semble que dans le code de Araya il t'affichera "Le résultat est Entrez un nombre : "... faudrait mieux récupérer une valeur avec int resultat = addition();

                              Et aussi pour ta 3ème question : si tu déclares ta fonction en int elle renverra un int et pas autre chose, sinon erreur. Par contre tu peux récupérer son contenu dans un char, après, mais tu risques un dépassement de capacité en stockant u int trop grand dans un char.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                11 janvier 2006 à 15:04:59

                                Citation : Araya

                                Oui tu mets ça dans header.

                                Et pour ta fonction fait plutot du genre :

                                int addition()
                                {
                                    int a, b;
                                    printf("Entrez un nombre : ");
                                    scanf ("%d", &a);
                                    printf("Entrez un autre nombre : ");
                                    scanf ("%d", &b);
                                   
                                    return a+b;
                                }
                                             
                                int main(int argc, char *argv[])
                                {
                                    printf("Le resultat est %d\n", addition());

                                    system("pause");
                                    return 0;
                                }

                                Citation : V1944

                                Mais à ce moment-là, il ne faut pas inclure mesfonction.h :o et justement ce qui m'intéresserait ce serait de comprendre le fonctionnement des header, qu'est-ce qui est portable du .c au .h, de définir le maximum dans mesfonctions.h, quoi.

                                Ce serait mon problème n°1 en ce moment...

                                REP> louisclem: non, le code d'Araya marche impec...
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  11 janvier 2006 à 15:06:03

                                  Citation : louisclem



                                  Il me semble que dans le code de Araya il t'affichera "Le résultat est Entrez un nombre : "... faudrait mieux récupérer une valeur avec int resultat = addition();



                                  Non, ca marche parfaitement ^^
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    11 janvier 2006 à 15:07:16

                                    Alors ce qu'il faudrait que je fasse c'est créer des fonctions "globales"? (si je veux que mon main() soit le plus épuré possible)
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Anonyme
                                      11 janvier 2006 à 16:26:46

                                      Oups, tant mieux si ça marche, j'étais pas trop sûr de ce qui se passerait, c'est un peu confus d'appeller dans un printf une fonction qui en fait elle même, mais on dirait que la fonction est appellée avant (logique en fait c'est mieux) :D

                                      V1944 > euh là vu la taille du code, laisses dans un seul fichier c'est beaucoup beaucoup beaucoup plus simple. Sinon, tu crées ta fonction addition dans un .c, tu la daclares dans un .h, et tu inclus ce .h dans main.c et l'autre .c et tous les .c où tu auras besoin d'appeller ta fonction addition.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        11 janvier 2006 à 16:29:55

                                        truc.h -> prototype de la fonction
                                        machin.c -> fonction entière
                                        main.c -> #include "truc.h" -> et là c'est censé marcher?
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Anonyme
                                          11 janvier 2006 à 16:46:33

                                          Euh déja nommes de la même manière un .h et son .c

                                          truc.c => implémentation (le corps de la fonction quoi) + include de truc.h
                                          truc.h => prototypes des fonctions de truc.c
                                          main.c => include de truc.h pour utilises ses fonctions.
                                          autre.c => include de truc.h si il a besoins des fonctions de truc.c

                                          Et là.... oh ça marche :waw:
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Anonyme
                                            11 janvier 2006 à 16:47:25

                                            WI.
                                            N'oubli pas les macros #define dans ton .h ...
                                            (Esque mateo explique sa dnas son cour, au moin?)
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              11 janvier 2006 à 17:06:14

                                              Hé, j'ai un problème...


                                              ...Ca marche :lol:
                                              *évite les tartes aux cerises*
                                              Merci louisclem et les autres!
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                11 janvier 2006 à 18:22:36

                                                JC_MASTER -> non, M@eo n'a pas expliqué la prérogative #define dans son cours
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Anonyme
                                                  12 janvier 2006 à 21:09:44

                                                  Ralala, esque qu'ilquin pourais mêtre sa en vue pour eviter de le répèter :
                                                  Tout les fichier d'entète, affin d'éviter d'être re-inclut et de provoquer des ereures durant la compilation, car le compilateur tombe deux fois sur le même prototype(A cause du fichier a.h qui inclu b.h, et du fichier c.h qui inclut a.h et b.h, par exmeple), il existe uen solution :
                                                  L'utilisation des macro et d'une constante. Explication :
                                                  Quand on inclut pour la première fois el fichier .h, on affiche el code, et on défini une constante. Au prochain passage, si la constante est défini, on fout rien :
                                                  #ifndef NOMDUFICHIERPOINTCETPOINTH_H
                                                  #define NOMDUFICHIERPOINTCETPOINTH_H
                                                  //Code qui ne seras inclut que la première fois.
                                                  #nedif

                                                  Vous pouvez tout de suite tester en fesan :
                                                  #include file.h
                                                  #include file.h
                                                  Avec ou sans les macros, et vous verez que sans, sa ne compilera pas ^^
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    12 janvier 2006 à 21:11:33

                                                    L'autre solution étant de ne pas inclure récursivement des fichiers d'en-têtes les uns dans les autres.
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    Anonyme
                                                      13 janvier 2006 à 17:39:32

                                                      Oui, mais cette solution n'est pas la meilleur, et n'est aps toujour possible. Exemple :

                                                      Projet 1 :
                                                      On fait plin de header, dont le header MySys.h qui inclut b.h
                                                      Projet 2 :
                                                      On fait encore plin de code avec MyGame.h qui inclut b.h
                                                      Projet 3 :
                                                      On ecrit encore plin de code, et on decide de réutiliser els libréries MyGame et MySys, on les incluts donc tous les deux, pour utiliser leur fonctions, et alors..... BUG!!![A moin d'utiliser les macros comme précédeament]
                                                      Tout les lengages permètent l'inclusion d'isposent d'une sécuriter de ce genre. n c++ c'est des macros, en php c'est require_once ou include_once....
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        13 janvier 2006 à 17:55:52

                                                        Bah tu fais n'imp là, je viens de dire "ne pas inclure récursivement" et tu le fais en incluant "inclut b.h" dans un autre header alors c'est sûr...

                                                        Nan mais le truc ce serait de laisser au fichier principal la charge d'inclure tous les headers requis par les autres headers, je préfère cette solution.
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          14 janvier 2006 à 11:36:34

                                                          Ben dans main tu peu maitre ce que tu veu je croi...
                                                          tu peu maitre main() ou main(x,y,z) bref met ce que tu veu.

                                                          Mais ça peu toujours servir de personnaliser main(). Je te conseil d'enlever les argument s'il ne te servent à rien... C'est mieu je trouve ;)

                                                          ++
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                          ~( ・   ω   ・)~
                                                          Anonyme
                                                            14 janvier 2006 à 11:45:02

                                                            Regarde, pourtant c'est exactement ce qui se produit avec les ficheirs standarts!
                                                            Regarde, tu fait un header, tu inclut <iostu en fait un autre, tu inclura aussi <iostream>. Si tu e fait un qui inclut ces deux la, tu ne peut que inclure iostream!
                                                            Et souvent, c'est inevitable.

                                                            Exemple avec Qt :
                                                            Dans chaque header, on défini des objets dériver de qt, des fonctions retournant des object/types qt ect, donc, dans header1.h, on inclut QtGui. Dans Header2.h, on inclut encore QtGui car on défini une seconde class. Quand tu voudra créer une aplication Qt qui utilise tes deux composant, il se provoquera une double inclusion de QT!
                                                            Ceci est inévitable, logique, obliger. Et ne me dit pas que j'ai cas inclure QtGui dnas mon .cpp et avent els inclusion de header, parce que la c'est :
                                                            Peut pratique
                                                            Demande une modification des fichier de code
                                                            Ne suit plus le principe de réutilisation du code.

                                                            Donc, ce que j'ai dit est vrai. Et si tu veut t'en persuader, tu n'a qu'a regarder le contenu des headers standarts! Tu vera que eux aussi s'inclusent recursivement.
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter

                                                            [C] questions en l'air sur les fonctions

                                                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                            • Editeur
                                                            • Markdown