2017-10-11 7 views
2

Je travaille actuellement sur la traduction d'un code Fortran hérité et j'ai du mal à comprendre une ligne particulière du code. Le compilateur semble aussi trouver cette ligne bizarre et jette une erreur. D'après ce que je comprends, il essaie d'initialiser un tableau en séquençant 1 à 9 par incréments de 1 et en complétant la matrice de tableau avec cette séquence en forme majeure de colonne.Initiliser un tableau avec une séquence dans Fortran

program arrayProg 

    integer :: matrix(3,3), i , j !two dimensional real array 

    matrix = reshape((/1:9:1/), (/3,3/)) 

end program arrayProg 

Cette syntaxe est-elle acceptable dans fortran? (Ça doit être parce que ça vient du code existant) Est-ce que je ne comprends pas bien ce que fait la ligne?

+0

Quel type d'erreur le compilateur a-t-il trouvé? Quel compilateur? S'il vous plaît voir [demander] et [mcve], vous devriez toujours donner toutes les informations que vous avez. Le message erro nous est extrêmement important. La syntaxe n'est pas correcte. –

Répondre

4

La syntaxe est incorrecte et un tel code ne peut pas être compilé par un compilateur Fortran, sauf s'il implémente une extension non standard.

Intel Fortran accepte ceci:

A colon-separated triplet (instead of an implied-DO loop) to specify a range of values and a stride; for example, the following two array constructors are equivalent: 
1  INTEGER D(3) 
2  D = (/1:5:2/)    ! Triplet form - also [1:5:2] 
3  D = (/(I, I=1, 5, 2)/)  ! implied-DO loop form 

de https://software.intel.com/en-us/node/678554

Pour générer une séquence d'une façon standard on utilise un sous-entendu faire boucle comme

(/ (i, i=1,9) /) 

la Reshape que change juste la 1D tableau dans un ordre majeur dans la colonne 2D comme vous l'avez deviné.

+3

BTW, chaque fois que quelqu'un recommande d'utiliser une extension non standard, en particulier des choses laides comme les extensions DEC, dans un nouveau code, pensez à des situations comme celle-ci. Quelqu'un héritera du code, obtiendra un compilateur différent et sera vissé ou au moins confus et il sera PIA pour réécrire le code à un formulaire standard. Vous ne pouvez pas dire "C'est portable parce que j'utilise toujours Intel, c'est un non-sens". –

+0

D'accord, même si dans ce cas, il est vraiment irritant que Fortran moderne a une syntaxe parfaitement utilisable pour la génération de séquences entières qui ne peut être utilisé sur les indices de tableau. Il est naturel d'essayer d'utiliser cette approche pour créer des séquences entières uniquement pour trouver que l'on est obligé d'utiliser une boucle implicite-DO pour rester dans la norme du langage (traduction: j'ai été mordu par ça). sous plusieurs compilateurs même si vous n'avez pas l'intention d'utiliser le résultat; vous obtenez une notification rapide des extensions non standard. – arclight