2010-12-03 41 views
0

Je rencontre un comportement très étrange quand je fais cela. Je suppose que c'est l'origine de la question, mais je peux me tromper. Si l'un de vous peut le confirmer est en effet un comportement non défini, je au moins savoir ce qui se passeComportement non défini pour le tableau épissé intention (out) dans fortran 90?

suppose que je (ne prétend pas compiler)

subroutine X 
    real, allocatable :: block(:,:) 
    allocate(block(20,20)) 

    call Sub(block(1:5, 1:5)) 
! here is undefined behavior 
end subroutine 

subroutine Sub(b) 
    real, intent(out) :: b(:,:) 
    b = 0.0 
end subroutine 

Ma question est: ce que je fais quelque chose de bizarre ? J'ai le sentiment que l'intention (out) indéfinit le bloc entier, même si j'ai passé une tranche, et j'ai besoin d'un inout. Pouvez-vous confirmer de la norme?

Édition: inout donne le même comportement indéfini, mais en passant un tableau non découpé à des sous-travaux. Cela signifie-t-il que c'est une violation de la norme de passer des tableaux tranchés pour l'initialisation de sous-blocs?

Merci

Répondre

2

Tout d'abord, si vous passez une tranche, je suppose que vous devez utiliser l'intention (inout) parce que vous n'allez pas affecter tout le tableau, bien que je ne suis pas tout à fait sûr que , intention (out) pourrait être correct dans ce cas.

Mais la source de votre problème n'est-elle pas que vous faites l'erreur d'utiliser un tableau de formes supposées dans un sous-programme sans avoir une interface explicite ou le placer dans un module? Ou avez-vous omis cette partie du code?

J'ai ajouté une interface explicite à votre code, assigné 1 à bloquer, compilé, et ensuite je pourrais définir n'importe quel type de tranche, il a été correctement défini sur 0. Donc, si vous faites les choses correctement, peut-être devriez-vous élaborer quel genre de comportement indéfini vous voyez exactement?

+0

J'ai une interface explicite. J'ai simplement omis le code non pertinent pour le problème en question. Le comportement indéfini libère (ou réaffecte, ou envoie à la mémoire aléatoire) un pointeur contenu dans un type qui n'est pas du tout touché par le code. –

+2

Pourriez-vous nous fournir un morceau de code qui reproduit le problème alors? – steabert

+0

Ça va être très dur. Cependant, j'ai juste travaillé autour du problème, donc à ce stade est juste une curiosité. –