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 :

Equivalent d'un push_back en FORTRAN ?


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Doctorant en Astrophysique
    Inscrit en
    Mars 2009
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Astrophysique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2009
    Messages : 312
    Par défaut Equivalent d'un push_back en FORTRAN ?
    Bonjour.

    Existe-t-il l'équivalent en Fortran de la fonction push_back des vector en C++ et si oui comment s'utilise-t-il ?

    Merci

  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
    Ça n'existe pas avant Fortran 2003. Dans ce cas, tu devras le programmer toi même.

    À compter de Fortran 2003, il y a quelque d'assez près. Si tu affecte à une variable allocatable un vecteur plus long que l'allocation précédente, il y a déallocation du vecteur précédent, allocation du nouveau et copie des valeurs.

    Ce n'est pas aussi efficace que le push_back car chaque ajout requiert la deallocation/reallocation alors que le push_back fait une allocation par bloc, refait donc la deallocation/reallocation seulement quand le bloc est rempli.

  3. #3
    Membre éclairé
    Homme Profil pro
    Doctorant en Astrophysique
    Inscrit en
    Mars 2009
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Astrophysique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2009
    Messages : 312
    Par défaut
    Je précise que je bosse sur du code existant fortran 90/95 et que même si le compilo prend en compte fortran 2003 (encore heureux), je vais essayer de rester dans la norme 90/95.

    Mon problème est en fait le suivant :
    J'ai plusieurs tableaux gigantesques (simulations scientifiques) et je dois les parcourir en entier en faisant des comparaisons pour chaque "ligne". Si telle ligne rempli les conditions, alors je stocke son indice dans un autre tableau. Actuellement je suis obligé de faire les comparaisons 2 fois de suite, la première pour calculer le nombre de lignes qui vérifient les bonnes conditions et allouer mon tableau, la seconde pour le remplir : et c'est assez coûteux en temps...
    Un push_back aurait donc été le bienvenu...

    Si quelqu'un a une autre façon de procéder en tête je suis preneur.
    J'aurai aussi voulu savoir si l'allocation/copie/désallocation d'un gros tableau était une "grosse opération" en mémoire.

    Merci

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 152
    Par défaut
    Il existe des fonctions en libre accès de Numerical Recipes qui te permettent de reallouer la mémoire d'un tableau. Elles se trouvent dans le module nrutil.

    (je les joints à ce message, mais si les modos ne juge pas cela aproprié, qu'ils n'hésitent pas à modifier mon post svp)

    Les voici:
    FUNCTION reallocate_rv(p,n)
    REAL(SP), DIMENSION(: ), POINTER :: p, reallocate_rv
    INTEGER(I4B), INTENT(IN) :: n
    INTEGER(I4B) :: nold,ierr
    allocate(reallocate_rv(n),stat=ierr)
    if (ierr /= 0) call &
    nrerror('reallocate_rv: problem in attempt to allocate memory')
    if (.not. associated(p)) RETURN
    nold=size(p)
    reallocate_rv(1:min(nold,n))=p(1:min(nold,n))
    deallocate(p)
    END FUNCTION reallocate_rv
    !BL
    FUNCTION reallocate_iv(p,n)
    INTEGER(I4B), DIMENSION(: ), POINTER :: p, reallocate_iv
    INTEGER(I4B), INTENT(IN) :: n
    INTEGER(I4B) :: nold,ierr
    allocate(reallocate_iv(n),stat=ierr)
    if (ierr /= 0) call &
    nrerror('reallocate_iv: problem in attempt to allocate memory')
    if (.not. associated(p)) RETURN
    nold=size(p)
    reallocate_iv(1:min(nold,n))=p(1:min(nold,n))
    deallocate(p)
    END FUNCTION reallocate_iv
    !BL
    FUNCTION reallocate_hv(p,n)
    CHARACTER(1), DIMENSION(: ), POINTER :: p, reallocate_hv
    INTEGER(I4B), INTENT(IN) :: n
    INTEGER(I4B) :: nold,ierr
    allocate(reallocate_hv(n),stat=ierr)
    if (ierr /= 0) call &
    nrerror('reallocate_hv: problem in attempt to allocate memory')
    if (.not. associated(p)) RETURN
    nold=size(p)
    reallocate_hv(1:min(nold,n))=p(1:min(nold,n))
    deallocate(p)
    END FUNCTION reallocate_hv
    !BL
    FUNCTION reallocate_rm(p,n,m)
    REAL(SP), DIMENSION(:,: ), POINTER :: p, reallocate_rm
    INTEGER(I4B), INTENT(IN) :: n,m
    INTEGER(I4B) :: nold,mold,ierr
    allocate(reallocate_rm(n,m),stat=ierr)
    if (ierr /= 0) call &
    nrerror('reallocate_rm: problem in attempt to allocate memory')
    if (.not. associated(p)) RETURN
    nold=size(p,1)
    mold=size(p,2)
    reallocate_rm(1:min(nold,n),1:min(mold,m))=&
    p(1:min(nold,n),1:min(mold,m))
    deallocate(p)
    END FUNCTION reallocate_rm
    !BL
    FUNCTION reallocate_im(p,n,m)
    INTEGER(I4B), DIMENSION(:,: ), POINTER :: p, reallocate_im
    INTEGER(I4B), INTENT(IN) :: n,m
    INTEGER(I4B) :: nold,mold,ierr
    allocate(reallocate_im(n,m),stat=ierr)
    if (ierr /= 0) call &
    nrerror('reallocate_im: problem in attempt to allocate memory')
    if (.not. associated(p)) RETURN
    nold=size(p,1)
    mold=size(p,2)
    reallocate_im(1:min(nold,n),1:min(mold,m))=&
    p(1:min(nold,n),1:min(mold,m))
    deallocate(p)
    END FUNCTION reallocate_im
    Ces fonctions permettent la réallocution des tableaux.

Discussions similaires

  1. format nombre equivalent au F9 Fortran
    Par oomph dans le forum MATLAB
    Réponses: 4
    Dernier message: 01/08/2012, 11h01
  2. Réponses: 2
    Dernier message: 24/09/2007, 20h43
  3. Réponses: 4
    Dernier message: 20/11/2006, 14h13
  4. Réponses: 2
    Dernier message: 20/11/2006, 10h52
  5. [Kylix] Equivalent ShellExec en CLX
    Par Anonymous dans le forum EDI
    Réponses: 7
    Dernier message: 14/08/2002, 11h55

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