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 :

retour d'un programme entré/sortie


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 19
    Par défaut retour d'un programme entré/sortie
    Bonjour à tous,

    J'ai commencé Fortran hier pour m'adapter à un projet déjà existant, je suis plutôt habitué à python...
    j'ai donc realisé un petit programme (voir ci-dessous) qui est sensé prendre en entrée une liste de 0 et de 1 et me donner l'entropie de shannon de ce signal.
    cependant, quand je tape une liste à la main quand j'execute mon programme dans le terminal il me retourne "NaN"....
    j'ai des difficulté à comprendre la source problème.
    Merci !


    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
    program testEnt
     
    	implicit none
    	integer, dimension(:), allocatable::sig
    	read(*,*),sig
    	print*, Entropy(sig)
     
    contains 
     
    	!--fonction to get log in base 2
    	real function log2(x)
      		implicit none
      		real, intent(in) :: x
      		log2 = log(x) / log(2.)
    	end function log2
     
    	!--fonction to get the Shannon Entropy from list of booleans
    	real function Entropy(signal)
    		implicit none 
    		integer, dimension(:), intent(inout)::signal 
    		integer::n
    		integer::nb1
    		n=size(signal)
    		nb1=sum(signal)
    		Entropy=-((real(nb1)/n)*log2(real(nb1)/n)+(real((n-nb1))/n)*log2(real(n-nb1)/n))
    	end function Entropy 
     
    end program testEnt

  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
    Par défaut
    Tu déclares « sig » comme étant allocatable. Tu dois impérativement l'allouer avant de lire.

    Peux-être t'attends-tu à ce qu'une allocation dynamique soit effectuée par le read au nombre d'éléments fourni, mais ce n'est pas le cas.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 19
    Par défaut ça marche !
    Effectivement, ça marche mieux une fois alloué ! :

    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
    program testEnt
     
    	implicit none
    	integer::i, a
    	integer, dimension(:), allocatable::sig
     
    	print*, 'sample size ?'
    	read*,a
     
    	allocate(sig(a)) 
    	do i=1,a
    		read*,sig(i)
    	end do
    	print*,sig
    	print*, Entropy(sig)
     
    contains 
     
    	!--fonction to get log in base 2
    	real function log2(x)
      		implicit none
      		real, intent(in) :: x
      		log2 = log(x) / log(2.)
    	end function log2
     
    	!--fonction to get the Shannon Entropy from list of booleans
    	real function Entropy(signal)
    		implicit none 
    		integer, dimension(:), intent(in)::signal 
    		integer::n
    		integer::nb1
    		n=size(signal)
    		nb1=sum(signal)
    		Entropy=-((real(nb1)/n)*log2(real(nb1)/n)+(real((n-nb1))/n)*log2(real(n-nb1)/n))
    	end function Entropy 
     
    end program testEnt
    Merci beaucoup !!

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/01/2015, 20h44
  2. Réponses: 1
    Dernier message: 02/05/2013, 11h10
  3. Réponses: 5
    Dernier message: 04/08/2010, 15h05
  4. Réponses: 3
    Dernier message: 18/06/2007, 19h06
  5. [commande DOS] Récupérer le code retour d'un programme
    Par bobunny dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 04/06/2004, 16h51

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