Forum Programmation.c Fonction et pointeurs

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
7
oct.
2017

Bonjour,
Le principe du code, c'est que y et x dans la fonction random() envoie des valeurs aléatoires à la fonction print(), et print() affiche les résultats.

#include <time.h>
#include <stdio.h>

void random(int *y, int *x){
    srand((int)time(NULL));
    *y = rand()% (50-1) + 1;
    *x = rand()% (100-1) + 1;
}
void print(int a, int b){
    random(&a,&b); 
    printf("x:%d,y:%d\n",a,b);
}

int main(){
    random();    
    print();

    return 0;
}

gcc envoie ce résultat :

random.c: In function ‘main’:
random.c:15:5: error: too few arguments to function ‘random’
random();

^
random.c:4:6: note: declared here
void random(int *y, int *x){
^
random.c:16:5: error: too few arguments to function ‘print’
print();
^
random.c:9:6: note: declared here
void print(int a, int b){

Quelqu'un aurait une idée ? Je ne suis pas spécialement bon avec les pointeurs.

  • # incohérence sur print

    Posté par  . Évalué à 5.

    -d'un coté print est déclaré avec 2 arguments
    - de l'autre il est appelé sans print();
    - et dans main(), il faudrait déclarer 2 int.

    • [^] # Re: incohérence sur print

      Posté par  . Évalué à 7.

      Hello.

      Sans être méchant, ce que tu dit n'est pas très clair …. Je vais reprendre :

      Il ne s'agit pas d'un problème de pointeur mais un problème d'appel de fonction.

      La fonction random est déclarée ainsi:

          void random(int *y, int *x)

      Puis dans ton main, ligne 15, tu l'appelles sans lui passer d'arguments:

       random();

      D'ou le message :

      random.c:15:5: error: too few arguments to function ‘random’
      random();

      qui signifie => en ligne 15, colonne 5 (5eme caractère de la ligne, soit le début de l'appel de fonction "random"): trop peu d'argument pour la fonction 'random' (autrement dit, tu appelles une fonction qui s'attend à avoir plus d'arguments).

      Ensuite le compilateur t'indique à quelle fonction il fait référence (ce qui te permet de voir combien de paramètre elle attend, et de la corriger si besoin, ou de corriger l'appe lpour lui passer le bon nombre de paramètre)

      random.c:4:6: note: declared here
      void random(int *y, int *x){
      ^

      Ensuite tu as exactement la même chose pouir la fonction print :

      random.c:16:5: error: too few arguments to function ‘print’
      print();
      ^
      random.c:9:6: note: declared here
      void print(int a, int b){

      Est-ce clair ? C'est pas forcément simple à expliquer par écrit : à l'oral on peut s'appuyer sur les réactions de la personne en face pour savoir si elle a compris.

  • # langues

    Posté par  . Évalué à 4. Dernière modification le 07 octobre 2017 à 17:38.

    salut

    apprendre un langage de programmation sans savoir lire un peu l'anglais informatique, tu vas souvent être obligé d'appeler à l'aide dans les forums…

    tu n'as peut-être pas accès à la configuration de ton poste de travail, mais sur mon poste linux, les messages de gcc sont francisés (via la variable locale d'environnement LC_MESSAGES je crois) et cela donne ça :

        random.c: Dans la fonction « random »:
        random.c:5:5: warning: déclaration implicite de la fonction « srand »; vouliez-vous utiliser « scanf » ? [-Wimplicit-function-declaration]
             srand((int)time(NULL));
             ^~~~~
             scanf
        random.c:6:10: warning: déclaration implicite de la fonction « rand »; vouliez-vous utiliser « random » ? [-Wimplicit-function-declaration]
             *y = rand()% (50-1) + 1;
                  ^~~~
                  random
        random.c: Dans la fonction « main »:
        random.c:15:5: error: trop peu d'arguments pour la fonction « random »
             random();
             ^~~~~~
        random.c:4:6: note: déclaré ici
         void random(int *y, int *x){
              ^~~~~~
        random.c:16:5: error: trop peu d'arguments pour la fonction « print »
             print();
             ^~~~~
        random.c:9:6: note: déclaré ici
         void print(int a, int b){
          ^~~~~
    

    Envoyé depuis mon Archlinux

  • # logique

    Posté par  . Évalué à 5.

    Hello,

    Hors les problèmes d'arguments pointés plus haut, il y a un problème de logique dans ton code.

    La fonction random() est appelée deux fois, une fois dans le main() et une fois dans print().

    Il y a donc un appel de trop.

    Matricule 23415

  • # what's the point ?

    Posté par  . Évalué à 3.

    Difficile de comprendre la finalité d'un code aussi compliqué pour rien..
    Mais ceci fonctionne :

    #include <time.h>
    #include <stdio.h>
    
    void random(int *y, int *x){
        srand((int)time(NULL));
        *y = rand()% (50-1) + 1;
        *x = rand()% (100-1) + 1;
    }
    void print(){
        int a;
        int b;
        random(&a,&b); 
        printf("x:%d,y:%d\n",a,b);
    }
    
    int main(){   
        print();
        return 0;
    }
    
  • # random ?

    Posté par  . Évalué à 2.

    C'est toujours une bonne habitude d'ajouter les flags de warning à ton compilo : (-Wall ou -Wextra si tu veux être vraiment rigoureux).

    En les activant, tu aurais eu un warning disant que srand() n'est pas déclaré et qu'il faut inclure .

    Et que du coup, en l'incluant, tu aurais vue que random() est déjà une fonction définie par la libc !

    Bref, active toujours les flags de warning, à minima -Wall, -Wextra et -Werror étant l'idéal.

    Ah aussi, reconfigure ta locale pour avoir des messages en français, si tu n'es pas à l'aise avec l'anglais …

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.