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 :ccool:
Version imprimable
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 :ccool:
Ç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.
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 ;)
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:
Ces fonctions permettent la réallocution des tableaux.Citation:
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