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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

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