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 :

probleme fortran 90 exception:access violation


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 9
    Par défaut probleme fortran 90 exception:access violation
    Bonjour,
    j'ai commencé à faire un petit programme pour simuler une partie de black jack, quand je compile, tout va bien, mais régulièrement (soit immédiatement, soit qq coups plus tard) j'ai cette erreur qui tombe :

    Exception: Access Violation
    At line 135 of file bj.f90
    Traceback: (Innermost first)
    Called from line 124 of file bj.f90
    NB: (le called from line peut varier 125,127 par exemple)
    J'ai beau chercher je ne comprend pas, je pensais que c'était les goto, mais non, j'ai rajouté un bloc interface, ça ne change pas. D'après les repères, c'est au niveau des appels de fonctions que ça bloque.
    Si qq'un a une idée, merci d'avance !

    voilà le programme :

    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
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    program black_jack
    implicit none 
    integer,external :: somme
    integer,external :: search
    real :: alea
    integer :: nbr_jeux,i,k,res,nbr_cartes,l,temp
    integer,dimension(1:13,1:2) :: paquet ! 1=mbr restant 2=valeur
    integer,dimension(1:312) :: sabot
    integer,dimension(1:13) :: croupier,joueur1,joueur2,joueur3 
     
     
    ! demande du nombre de jeu
    nbr_jeux=6
    nbr_cartes=nbr_jeux*52
     
    10 continue
    !définition valeur des cartes
    paquet(:,2)=10
    do i=2,9
        paquet(i,2)=i
    end do
    paquet(1,2)=11
     
    !mise a zero des jeux de chaque personnes
    croupier=0;joueur1=0;joueur2=0;joueur3=0
     
    !!! melange du paquet
        !preparation du paquet (jeu non melange)
        paquet(1:13,1)=4*nbr_jeux
     
    k=13
    do i=1,nbr_cartes
        call random_seed
        call random_number(alea) 
        res=k*alea+1
        sabot(i)=paquet(res,2)
        paquet(res,1)=paquet(res,1)-1
     
        !diminution de la longueur de recherche
        if (paquet(res,1)==0) then
            paquet(res,1)=paquet(k,1)
            paquet(res,2)=paquet(k,2)
            k=k-1
        end if
    end do
     
     
    ! distribution premieres cartes
     
    joueur1(1)=sabot(1)
    joueur1(2)=sabot(2)
     
    joueur2(1)=sabot(3)
    joueur2(2)=sabot(4)
     
    croupier(1)=sabot(5)
     
    k=6
    ! tour du joueur 1
        l=3
    1 continue
        do while(somme(joueur1)<17)
            joueur1(l)=sabot(k)
            l=l+1
            k=k+1
        end do
            if ((somme(joueur1)>21).or.(search(joueur1)/=0)) then !ligne 67
                temp=search(joueur1)
                joueur1(temp)=1
                goto 1
            end if
     
    ! tour du joueur 2
        l=3
    2 continue     
        do while(somme(joueur2)<17)
            joueur2(l)=sabot(k)
            l=l+1
            k=k+1
        end do
            if ((somme(joueur2)>21).and.(search(joueur2)/=0)) then 
                temp=search(joueur2)
                joueur2(temp)=1
                goto 2
            end if
     
    ! tour du croupier
        l=2
    3 continue     
        do while(somme(croupier)<17)
            croupier(l)=sabot(k)
            l=l+1
            k=k+1
        end do
            if ((somme(croupier)>21).and.(search(croupier)/=0)) then 
                temp=search(croupier)
                croupier(temp)=1
                goto 3
            end if
     
    print*,somme(croupier)
    print*,somme(joueur1)
    print*,somme(joueur2)
    print*,""
    print*,"Nouvelle partie ? 0=non 1=oui"
    read*,k
    if (k==1) then 
    goto 10
    else 
    goto 11
    end if
     
    11 continue
     
    end program 
     
     
    integer function somme(tab)
    implicit none
    integer,dimension(1:13) :: tab
    integer :: j
    somme=0
    do j=1,13
        somme=somme+tab(j)
    end do
    end function somme
     
    integer function search(wer)
    implicit none
    integer,dimension(1:13) :: wer
    integer :: z
    z=1
    search=0
    do while ((search==0).or.(z<14))
        if (wer(z)==11) then          !ligne 135
            search=z
        end if
        z=z+1
    end do
    end function search

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

    Informations forums :
    Inscription : Août 2007
    Messages : 148
    Par défaut
    Bonjour

    Citation:
    Exception: Access Violation
    At line 135 of file bj.f90
    Traceback: (Innermost first)
    Called from line 124 of file bj.f90
    NB: (le called from line peut varier 125,127 par exemple)
    J'ai beau chercher je ne comprend pas, je pensais que c'était les goto, mais non, j'ai rajouté un bloc interface, ça ne change pas. D'après les repères, c'est au niveau des appels de fonctions que ça bloque.
    Si qq'un a une idée, merci d'avance !
    Je ne sais pas quel OS et quel compilateur tu utilises, mais sous linux avec gfortran, avec l'option -fbounds-check, j'ai un message d'erreur très clair :

    ~/jaille> ./a.out
    At line 135 of file bj.f90
    Fortran runtime error: Array reference out of bounds for array 'wer', upper bound of dimension 1 exceeded (14 > 13)
    Celà signifie que tu cherches à adresser le 14ieme élement du tableau wer qui est définit comme ayant 13 éléments.

    En creusant un peu plus, si je modifie la routine search pour afficher z et search :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    . . .
    do while ((search==0).or.(z<14))
      print *, 'z = ',z,' search = ',search
        if (wer(z)==11) then          !ligne 135
       . . .
    J'obtiens le résultat :
    ~/jaille> ./a.out
    z = 1 search = 0
    z = 2 search = 0
    z = 3 search = 0
    z = 4 search = 0
    z = 5 search = 0
    z = 6 search = 0
    z = 7 search = 0
    z = 8 search = 0
    z = 9 search = 0
    z = 10 search = 0
    z = 11 search = 0
    z = 12 search = 0
    z = 13 search = 0
    z = 14 search = 0
    At line 136 of file bj.f90
    Fortran runtime error: Array reference out of bounds for array 'wer', upper bound of dimension 1 exceeded (14 > 13)
    Comme search vaut toujours 0 et que tu as un .or. dans le test d'entrée de ta boucle while, tu rentres dedans quel que soit z. Il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    do while ((search==0) .AND. (z<14))
    ou décomposer comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    do
      if  (search /= 0 .or. z > 13) exit
     . .  .
    done
    A toi de voir ce que tu veux exactement.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 9
    Par défaut
    oups, j'avais pas vu que j'avais eu une réponse. mille excuses, mais mieux vaut tard que jamais. Merci pour l'aide !

Discussions similaires

  1. [VxiR2] Exception Access Violation lors de la sauvegarde d'un rapport
    Par carden752 dans le forum Deski
    Réponses: 2
    Dernier message: 05/08/2011, 12h53
  2. First-chance exception + Access violation
    Par ben_popcorn dans le forum C++/CLI
    Réponses: 0
    Dernier message: 08/10/2010, 13h58
  3. Exception Access violation
    Par khalifa_2111 dans le forum Général Java
    Réponses: 0
    Dernier message: 13/07/2009, 12h24
  4. Exception : access violation
    Par marie_p dans le forum Fortran
    Réponses: 6
    Dernier message: 11/03/2009, 16h30
  5. Exception access violation
    Par davish dans le forum Général Java
    Réponses: 11
    Dernier message: 04/06/2008, 13h19

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