2017-09-21 1 views
0

J'ai programmé une Knuth lecture aléatoire en Fortran comme suitComment passer des tableaux statiques à des fonctions qui acceptent des réseaux affectables sans passer la longueur du tableau

subroutine knuth_shuffle(array, length) 
    implicit none 

    integer :: length 
    integer :: array(length) 

    integer :: randomIndex 
    integer :: temp 

    do i = 1, length - 2 
     randomIndex = floor(randomBetween(real(i), real(length))) 
     temp = array(i) 
     array(i) = array(randomIndex) 
     array(randomIndex) = temp 
    enddo 
end subroutine knuth_shuffle 

Chaque fois que j'appelle le sous-programme, je dois entrer la longueur du tableau aussi.

call knuth_shuffle(A, size(A)) 

Est-il possible que je peux changer le sous-programme quand je l'appelle, il ressemble plus:

call knuth_shuffle(A) 
+0

@Yossarian, s'il vous plaît ne pas faire de montage en masse pour supprimer les balises sans regarder aussi le contenu du poste qui peut être amélioré. – francescalus

Répondre

2

Vous pouvez changer

subroutine knuth_shuffle(array, length) 
    implicit none 

    integer :: length 
    integer :: array(length) 

    integer :: randomIndex 
    integer :: temp 

à

subroutine knuth_shuffle(array) 
    implicit none 

    integer :: array(:) 

    integer :: length 
    integer :: randomIndex 
    integer :: temp 

    length = size(array) 

ou vous pourriez simplement jeter le local variables length et écrire

subroutine knuth_shuffle(array) 
    implicit none 

    integer :: array(:) 

    integer :: randomIndex 
    integer :: temp 
    integer :: i 

    do i = 1, size(array) - 2 
     randomIndex = floor(randomBetween(real(i), real(size(array)))) 
     temp = array(i) 
     array(i) = array(randomIndex) 
     array(randomIndex) = temp 
    enddo 
end subroutine knuth_shuffle 

Alors je réponds: le sous-programme ne sait pas ou de soins si l'argument réel fourni en array est allocatable ou statique. Il n'y a rien dans le sous-programme qui soit affecté par, ou qui affecte, le statut d'allocation du tableau. Du point de vue du sous-programme array est de supposé-forme, sur ce point voir this question and answer.

Comme @francescalus a commenté, si elle a -forme prise arguments du tableau de la procédure nécessite une interface explicite Le moyen facile de prévoir que doit avoir le compilateur génère l'interface; soit (de préférence) mettre la procédure dans un module et use ou (applicabilité plus limitée) l'inclure dans la section contains d'une autre unité de programme (peut-être l'unité de programme principale). Un dernier recours, généralement uniquement à prendre lors de la modification de l'ancien code, serait d'écrire un bloc interface vous-même.

+0

parfait, merci pour l'explication! –