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 :

Erreur de parenthèse lors de l'allocation d'un nombre complexe


Sujet :

Fortran

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 19
    Points : 21
    Points
    21
    Par défaut Erreur de parenthèse lors de l'allocation d'un nombre complexe
    Bonjour,

    Je me suis remis à Fortran récemment dans le cadre de mon apprentissage et on m'a posé un problème que j'aimerais résoudre avec des outils dont je n'ai l'habitude. Malheureusement, j'ai une erreur dont je comprends pas la provenance. Le programme étant relativement court, je me permet de le mettre en entier :

    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
    program julia
    	implicit none
     
    	integer, parameter :: r = 8, mini = -2, maxi = 2, n = 1000
    	complex, parameter :: c = (0,1)
     
    	type :: Qc
    		complex(kind = r) :: z
    		integer :: k
    	end type
     
    	integer :: i, j, m, temp
    	real(kind = r) :: pas, norme, rayon
    	complex(kind = r) :: element
    	type(Qc), dimension(1:n*n) :: points
    	type(Qc), dimension (1:2) :: test
     
     
    	rayon = max(2., sqrt(c%re**2 + c%im**2))
    	pas = (maxi - mini) / (n-1)
    	temp = 0
    	do i = 1, n
    		do j = 1, n
    			temp = temp + 1
    			points(temp)%z = (mini + (i-1)*pas,mini + (j-1)*pas)
    			element = points(temp)%z
    			do m = 1,15
    				norme = sqrt(element%re**2 + element%im**2)
    				if (norme <= rayon) then
    					points(temp)%k = m
    					exit
    				else if (m == 15) then
    					points(temp)%k = m
    					exit
    				else
    					element = element**2 + c
    					cycle
    				end if
    			end do
    		end do
    	end do
    end program
    J'attire votre attention sur la ligne 25 où se situe l'erreur de compilation. Voici ce qu'indique gfortran :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       25 |                         points(temp)%z = (mini + (i-1)*pas,mini + (j-1)*pas)
          |                                                           1
    Error: Expected a right parenthesis in expression at (1)
    Les outils qui sont nouveaux pour moi ici sont les type et les complex, c'est pour ça que j'ai commencé par regarder de ce côté là. Je me suis renseigné sur la possibilité de créer des listes de types personnalisés, la syntaxe m'a l'air correcte, il en va de même pour les complexes que j'ai testé rapidement dans un petit programme, d'autant que le compilateur ne renvoie pas d'erreur sur la constante c. Je ne saisi donc pas la nature de l'erreur.

    Merci pour votre temps et votre aide.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 152
    Points : 191
    Points
    191
    Par défaut
    Bonjour,
    D'après https://gcc.gnu.org/onlinedocs/gfortran/COMPLEX.html
    A priori le problème vient du fait que vous ne spécifiez pas les champs de la structure complexe (qui est composée d'un champ X et d'un champ Y) dans laquelle vous souhaitez entrer ces valeurs.
    Je pense que l'une de ces deux solutions devrait résoudre votre problème :
    1. Spécifier : points(temp)%z%X=(mini + (i-1)*pas et : points(temp)%z%Y=mini + (j-1)*pas
    ou
    2. points(temp)%z=COMPLEX(mini + (i-1)*pas,mini + (j-1)*pas)
    ?

    Bonne journée,
    Marlan

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 103
    Points : 1 035
    Points
    1 035
    Billets dans le blog
    1
    Par défaut constantes littérales versus conversions
    La syntaxe (réel, imaginaire) est réservée aux constantes littérales, c'est-à-dire à un nombre écrit directement, par exemple (1.0, 4.0)
    Par contre on ne peut pas écrire (1.0, 2.0*2.0), ou (2*x, 3*y)

    On peut effectivement utiliser la fonction COMPLEX(x,y) dans ces cas calculés, mais attention il est bien spécifié qu'il s'agit d'une extension GNU. La fonction de la norme Fortran s'appelle CMPLX(x,y) :
    https://gcc.gnu.org/onlinedocs/gfortran/CMPLX.html

    Enfin, attention au KIND : "If KIND is not specified, the result is of the default COMPLEX kind, regardless of the kinds of X and Y. "
    Si le KIND (type de réel) par défaut de votre compilateur est un réel 4 octets (simple précision), et qu'on travaille en double précision, il faudra spécifier KIND=dp où dp est la constante du KIND souhaité. Attention, KIND=8 donnera des réels double précision sur certains compilateurs, mais pas tous, ce n'est pas normalisé. Mieux vaut importer le module intrinsèque iso_fortran_env et utiliser sa constante real64 pour le kind.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 19
    Points : 21
    Points
    21
    Par défaut
    Merci pour ces deux réponses complémentaires. Le problème venait bien de là. Merci également pour les conseils, j'avais déjà réfléchi à ces aspects en attendant et défini mes complexes en double précision
    Après j'ai pu tester la consistance de mon code et puis j'ai vu une bête faute sur la définition de ma variable pas, fortran ne traite pas les divisions entières comme des divisions classique. Dur dur de revenir sur Fortran après Python

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 103
    Points : 1 035
    Points
    1 035
    Billets dans le blog
    1
    Par défaut Python Fortran Rosetta Stone
    Citation Envoyé par theop8 Voir le message
    Dur dur de revenir sur Fortran après Python
    Vous pourriez être intéressé par la page Python Fortran Rosetta Stone qui compare les syntaxes des deux langages et fournit les correspondances. Cette page est en cours d'importation sur le site Fortran-lang.org, et devrait y apparaître actualisée d'ici quelques jours. Peut-être même y sera-t-elle un jour traduite en français (seules les pages principales du site sont pour l'instant traduites)...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur lors de l allocation de Vector
    Par harsh dans le forum SL & STL
    Réponses: 4
    Dernier message: 21/05/2006, 18h11
  2. Erreur : Non implémenté lors de l'appel d'un evenement
    Par pedouille dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 10/12/2005, 10h15
  3. Réponses: 1
    Dernier message: 13/07/2005, 21h37
  4. Erreur de périphérique lors du réglage
    Par Sunchaser dans le forum Windows XP
    Réponses: 2
    Dernier message: 28/03/2005, 21h55
  5. erreur "ORA-22905" lors de l'execution d'un requet
    Par benji999 dans le forum Administration
    Réponses: 26
    Dernier message: 14/04/2004, 11h47

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