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

Fortran Discussion :

Passage par valeur


Sujet :

Fortran

  1. #1
    NairodDorian
    Invité(e)
    Par défaut Passage par valeur
    Bonjour,

    Je suis de nouveau confronter à un problème.
    Je sais que le FORTRAN passe par défaut les paramètres par référence et je voudrai savoir si il est possible de les faires passer par valeurs.

    Par exemple pour un algo MinMax :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    RECURSIVE FUNCTION MINMAX(TREE, LEN_TREE, PLAYER, DEPTH) RESULT(BESTSCORE)
     
    ...
     
    END FUNCTION
    J'aimerai que les paramètres LEN_TREE, PLAYER et DEPTH soient passé par valeur et pas par référence, est-ce possible ?

    Merci d'avance...

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Points : 1 346
    Points
    1 346
    Par défaut
    Pas vraiment possible. D'ailleurs, même le passage par référence n'est pas défini dans le langage. Ce dernier défini le comportement d'un programme, mais pas la méthode effective de passage des paramètres. En pratique, tous les compilateurs, je crois, utilisent le passage par référence, mais ça fait parti de « l'implementation », pas du langage.

    Les seuls cas où on peut passer des arguments « by value », c'est quand on fait du « mix-language » et c'est fortement variable d'un compilateur à l'autre. Avant de te lancer sur cette piste, tu dois t'assurer que c'est bien ce que tu veux...

    Si tu veux avoir des arguments par valeurs pour protéger les valeurs d'un code récursif, tu n'as pas à faire explicitement du passage par valeur. Le langage permet de le faire facilement. Par exemple :
    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
     
       subroutine MergeSort(List)
          type (TSortData), intent(inout) :: List(:)
          type (TSortData) :: Temp(size(List))
     
          call MergeSortSub(1,size(List))
     
       contains
     
          recursive subroutine MergeSortSub(First,Last)
             integer, intent(in) :: First,Last
     
             integer Middle
     
             if (First < Last) then
                Middle = (First + Last) / 2
                call MergeSortSub(First, Middle)
                call MergeSortSub(Middle+1, Last)
                call MergeSub(First, Middle, Last)
             endif
             end subroutine MergeSortSub
     
          subroutine MergeSub(First, Middle, Last)
             integer, intent(in) :: First,Last, Middle
     
             integer k1, k2, k
     
             k1 = First
             k2 = Middle + 1
             k = First
     
    !         write(0,*) 'MergeSub:',First,Middle,Last
     
             do while(k1 <= Middle .and. k2 <= Last)
                if (List(k1) < List(k2)) then
                   Temp(k) = List(k1)
                   k1 = k1 + 1
                else
                   Temp(k) = List(k2)
                   k2 = k2 + 1
                endif
                k = k + 1
             enddo
     
             do while(k1 <= Middle)
                Temp(k) = List(k1)
                k1 = k1 + 1
                k = k + 1
             enddo
     
             do while(k2 <= Last)
                Temp(k) = List(k2)
                k2 = k2 + 1
                k = k + 1
             enddo
     
             do k = First, Last
                List(k) = Temp(k)
             enddo
     
             end subroutine MergeSub
          end subroutine MergeSort

  3. #3
    NairodDorian
    Invité(e)
    Par défaut
    Ok merci mais je ne vois pas trop comment faire avec mon code qui est le suivant :

    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
    ! En fait AlphaBeta
        RECURSIVE FUNCTION MINMAX(TREE, NUMBEROFELEMENTS, PLAYER, DEPTH, DEPTH_M, ALPHA, BETA) RESULT(BESTSCORE)
     
            IMPLICIT NONE
     
            ! Parametres
            TYPE (POINT) TREE(NUMBEROFELEMENTS)     ! On crée l'arbre une seule fois
            INTEGER NUMBEROFELEMENTS
            INTEGER PLAYER
            INTEGER DEPTH
            INTEGER DEPTH_M
            INTEGER ALPHA
            INTEGER BETA
            INTEGER BESTSCORE
     
            ! Variables locales
            INTEGER I
            INTEGER CURRENTSCORE
     
            ! Profondeur nulle ou plateau plein
            IF (DEPTH <= 0 .OR. FULL()) THEN
                BESTSCORE = 0
                RETURN
            END IF
     
            ! On parcourt l'arbre entier
            DO I = 1, NUMBEROFELEMENTS, 1
     
                IF (GAMEBOARD(TREE(I).X, TREE(I).Y) == EMPTY) THEN
     
                    CALL PLAY(PLAYER, TREE(I))
                    CURRENTSCORE = -MINMAX(TREE, NUMBEROFELEMENTS, OPPONENT(PLAYER), DEPTH - 1, DEPTH_M, -BETA, -ALPHA)
                    CALL UNPLAY(TREE(I))
                    IF (CURRENTSCORE >= ALPHA) THEN
                        ALPHA = CURRENTSCORE
                        IF (DEPTH == DEPTH_M) THEN
                            BESTMOVE = TREE(I)
                        END IF
                        IF (ALPHA >= BETA) THEN
                            EXIT
                        END IF
                    END IF
     
                END IF
     
            END DO
     
            BESTSCORE = ALPHA
            RETURN
     
        END FUNCTION
    De plus j'ai une erreur à la ligne Alpha = CurrentScore après le test et je pense aussi que mon compilateur intel passe les paramètres par référence dont je ne protège pas le contenu de mes variables dans ce code récursif.
    Je suis vraiment perdu là...

    A l'aide

  4. #4
    Membre habitué Avatar de Grame
    Profil pro
    Inscrit en
    Août 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Août 2007
    Messages : 148
    Points : 192
    Points
    192
    Par défaut
    Je vais me faire de la pub

    Tu peux récupérer les sources du jeu d'othello (goya.zip) que j'ai mais
    dans les sources de ce forum et tu trouveras une fonction d'élagage alphabeta
    qu'il te suffira t'arranger à ton idée.

Discussions similaires

  1. [PHP-JS] Javascript et PHP, passage par valeur !
    Par Cvbdev dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/04/2008, 16h24
  2. Réponses: 12
    Dernier message: 26/01/2008, 20h23
  3. [Débutant] Passage par valeur d'un objet Corba
    Par peaceinpal dans le forum CORBA
    Réponses: 1
    Dernier message: 29/05/2006, 20h15
  4. Passage par Valeur
    Par xc78370 dans le forum Langage
    Réponses: 8
    Dernier message: 20/03/2006, 23h21
  5. Passage par valeur / passage par adresse
    Par jeje99 dans le forum C++
    Réponses: 13
    Dernier message: 16/02/2006, 10h29

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