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 :

passage de pointeur en arguments


Sujet :

C

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 10
    Par défaut passage de pointeur en arguments
    Bonjour,

    J ai de nouveau un problème, toujours avec mon programme:
    Je travail un générateur de nombre aléatoire intitulé
    ran2
    qui prend en argument un pointeur, &iseed.
    maintenant, j appelle cette fonction à l intérieur d une autre fonction :
    generate_matrix :


    *******fichier matrix.h******

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    extern void generate_matrix(double matrix[nx][ny],long *iseed);
    *******fichier matrix.c*****

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void generate_matrix(double matrix[nx][ny],long *iseed){
    long i,j ;
    for (i=0;i<nx;i++){
    for (j=0;j<ny;j++){
    double rand=ran2(&iseed) ;
    matrix[i][j]=(rand<0.5) ? (matrix[i][j]=-1.) : (matrix[i][j]=1.) ;
    printf("matrix[%d][%d]=%f\n",i,j,matrix[i][j]) ;
    }
    }
    printf("I m going out of generate matrix\n") ;
    }
    //puis quand j appelle dans ma fonction main, je fais :


    *******fichier main.c *****************

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    generate_matrix(matrix,&iseed) ;
    **************************************

    Il me retourne :
    matrix.c:28: warning: passing argument 1 of 'ran2' from incompatible pointer type
    (j ai essayé un peu toutes les combinaisons de *,&,rien imaginables, et ben ça marche toujours pas).

    Que dois je faire?

    Merci d avance pour vos réponse.

    Olivier

  2. #2
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Je travail un générateur de nombre aléatoire intitulé
    ran2
    qui prend en argument un pointeur,
    Montre nous cette fonction parce qu'avec le code que tu donnes, ça n'aide pas ...

    double rand=ran2(&iseed) ;
    Si j'en crois ton code, tu envoie un long ** à la fonction ran2. Si c'est un pointeur simple, c'est rien du tout qu'il faut que tu donnes. (ie: ran2(iseed) )

    Mais je le redis, postes la fonction ran2 (au moins sa signature)

    (j ai essayé un peu toutes les combinaisons de *,&,rien imaginables, et ben ça marche toujours pas).
    Le langage C n'est pas un langage de bidouillage ! Pas la peine de tester n'importa quoi, quand ça t'arrive, tu laches ton clavier et tu prend un peu de recul pour réfléchir.

    PS,

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 10
    Par défaut
    C est un code qui vient directement de numercial recipies, donc qui n est pas de moi :

    **ran2.h****

    * date -- 06/07/03 */

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #ifndef RAN2_H
    #define RAN2_H
    float ran2(long*);
    #endif
    ****ran2.c*****

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    #define IM1 2147483563 
    #define IM2 2147483399 
    #define AM (1.0/IM1) 
    #define IMM1 (IM1-1) 
    #define IA1 40014 
    #define IA2 40692 
    #define IQ1 53668 
    #define IQ2 52774 
    #define IR1 12211 
    #define IR2 3791 
    #define NTAB 32 
    #define NDIV (1+IMM1/NTAB) 
    #define EPS 1.2e-7 
    #define RNMX (1.0-EPS)
     
    /*
    Long period (> 2 X 10^18 ) random number generator of L'Ecuyer with 
    Bays-Durham shuffle and added safeguards. Returns a uniform random deviate 
    between 0.0 and 1.0 (exclusive of the endpoint values). Call with idum a 
    negative integer to initialize; thereafter, do not alter idum between 
    successive deviates in a sequence. RNMX should approximate the largest 
    floating value that is less than 1.
    */
     
    float ran2(long *idum) 
    {
    int j; 
    long k; 
    static long idum2=123456789; 
    static long iy=0;
    static long iv[NTAB]; 
    float temp;
     
    /* Initialize. */
     
    if (*idum <= 0)
    {
     
    /* Be sure to prevent idum = 0. */
     
    if (-(*idum) < 1) *idum=1;
    else *idum = -(*idum); 
    idum2=(*idum);
     
    /* Load the shuffle table (after 8 warm-ups). */
     
    for(j=NTAB+7;j>=0;j--) 
        {
         k=(*idum)/IQ1; 
         *idum=IA1*(*idum-k*IQ1)-k*IR1; 
         if (*idum < 0) *idum += IM1; 
         if (j < NTAB) iv[j] = *idum;
    }
    iy=iv[0]; 
    } 
     
     
    /* Start here when not initializing. */
     
    /* Compute idum=(IA1*idum) % IM1 without overflows by Schrage's method. */
     
    k=(*idum)/IQ1; 
    *idum=IA1*(*idum-k*IQ1)-k*IR1;
    if(*idum < 0) *idum += IM1;
     
    /* Compute idum2=(IA2*idum) % IM2 likewise. */
     
    k=idum2/IQ2;
    idum2=IA2*(idum2-k*IQ2)-k*IR2; 
    if (idum2 < 0) idum2 += IM2;
     
    /* Will be in the range 0..NTAB-1. */
     
    j=iy/NDIV;
     
    /* Here idum is shuffled, idum and idum2 are combined to generate output. */
     
    iy=iv[j]-idum2; 
    iv[j] = *idum;
    if (iy < 1) iy += IMM1; 
     
    /* Because users don't expect endpoint values. */
     
    if((temp=AM*iy) > RNMX) return RNMX;
    else return temp;
    }
    Et on m a dit pour l utiliser, faut appeler, ran2(&iseed)
    Ce que je fais...
    Mais ça marche plus quand je l appel à l intérieur de ma fonction.
    Pour un non informatitien malheureusement, prendre du recul est parfois un luxe qu'il est difficile de se permettre, quand ce n est pas absolument nécéssaire.


    Olivier

  4. #4
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    C'est d'une logique imparable. Ta fonction a comme prototype:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void generate_matrix(double matrix[nx][ny],long *iseed);
    Tu l'appelles surement comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    generate_matrix(matrix, &iseed);
    ran2() attend:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    float ran2(long *idum);
    Conclusion? L'appel de ran2() a l'interieur de generate_matrix() est simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    float rand=ran2(iseed);
    C'est logique, non?

  5. #5
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Et on m a dit pour l utiliser, faut appeler, ran2(&iseed)
    Oui, c'est exact, dans la mesure où iseed est un entier long et pas un pointeur comme dans ton cas, c'est ce que je t'avais dis dans mon premier message.

    Et n'oublie pas :



    Parce que bon nombre de personnes ne veulent pas lire tes messages car il sont mal formatés.

  6. #6
    HRS
    HRS est déconnecté
    Membre chevronné
    Avatar de HRS
    Inscrit en
    Mars 2002
    Messages
    678
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 678
    Par défaut
    la confusion vient du fait que vous donnez le même
    nom (iseed) à un paramètre formel qui est un pointeur
    d'entier et à un paramètre effectif qui est un entier

  7. #7
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 10
    Par défaut
    Merci à tous encore une fois pour vos réponses.
    Je crois que j ai compris en effet, ce qui se passe.
    GT un peu confus entre les *iseed, les &iseed et les iseed tout court.
    Merci en tous les cas.

    Olivier

  8. #8
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 10
    Par défaut
    Mince en fait non, ça marche pas...

    Mon iseed reste constant, là où il devrait changer à chaque appel à la fonction ran2.
    Comme ran2 est un générateur de nombre aléatoire, il a besoin de iseed change à chaque itération(sinon, ça devient un générateur de nombre constant, ce qui perd de son intéret)....
    Je suis encore perdu... Snif....

    Merci d avance à tous encore une fois

  9. #9
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par abelolive
    Mince en fait non, ça marche pas...
    Montre nous:
    - la declaration de iseed dans main()
    - l'appel de la fonction generate_matrix() par main()
    - l'appel de la fonction ran2() par generate_matrix()

  10. #10
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 10
    Par défaut
    *********main :*****************
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      generate_matrix(matrix,&iseed) ;
    *******************************



    *********matrix.c***************

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void generate_matrix(double matrix[nx][ny],long *iseed){
      long i,j ;
      for (i=0;i<nx;i++){
         for (j=0;j<ny;j++){
           printf("%d\n",iseed) ;
           double rand=ran2(iseed) ;
           matrix[i][j]=(rand<0.5) ? (matrix[i][j]=-1.) : (matrix[i][j]=1.) ;
           printf("matrix[%d][%d]=%f\n",i,j,matrix[i][j]) ;
         }
       }
      printf("I m going out of generate matrix\n") ;
    }
    ****************************

    **********matrix.h**************
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern void generate_matrix(double matrix[nx][ny],long *iseed);
    ***************************

    ben dans ce cas, iseed reste constant.

  11. #11
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Et dans main(), tu as bien la ligne
    n'est-ce pas?

    (l'initialisation a -1, c'est parce que la routine des NR attend que iseed soit negatif au premier appel de ran2)

  12. #12
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 10
    Par défaut
    oui tout à fait,

  13. #13
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Je m'apercois tout juste de cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("%d\n",iseed) ;
    Ici, tu imprimes la valeur de l'adresse de iseed. Cela ne risque pas de changer (heureusement). Pour obtenir la valeur de la variable dont l'adresse est iseed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("%d\n", *iseed);
    Edit: si tu es perdu, renomme iseed dans generate_matrix() par p_iseed pour bien te souvenir que tu travailles avec un pointeur, non la variable directement.

  14. #14
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 10
    Par défaut
    En effet, ça marche maintenant.

    Merci de votre patience.

    Olivier

Discussions similaires

  1. Réponses: 12
    Dernier message: 17/07/2007, 08h29
  2. passage de pointeurs entre appli delphi et DLL c++
    Par e-teo dans le forum Langage
    Réponses: 1
    Dernier message: 13/10/2005, 21h46
  3. Passage de pointeur en session
    Par goondi dans le forum Langage
    Réponses: 6
    Dernier message: 21/09/2005, 11h54
  4. Problème passage de pointeur
    Par mick74 dans le forum MFC
    Réponses: 2
    Dernier message: 21/04/2004, 18h34
  5. [allegro]passage de pointeur sur image
    Par Gonath dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 13/12/2003, 18h47

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