2017-09-22 7 views
1

Tenir compte de la variableComment initialiser une variable de caractère dans fortran 77?

character*100 xx 

Je veux initialiser une certaine valeur, peut-être certains caractères imprimables ou blancs. J'ai essayé

data xx /100*char(120)/ 

Mais cela n'a pas fonctionné. exemple Minimum:

cat car_array.F 
    character*10 xx 
    data xx /10*char(120)/ 
    write(*,*)xx 
    end 


    ifort car_array.F 
    car_array.F(2): error #6169: This construct is not valid in this context. [CHAR] 
      data xx /10*char(120)/ 
    --------------------^ 
    compilation aborted for car_array.F (code 1) 
+1

Qu'est-ce que cela signifie * qui n'a pas fonctionné *? Ça ne dit rien d'utile. Messages d'erreur? Mauvais résultats? Lesquels? S'il vous plaît montrer un exemple compilable ([mcve]). –

+0

ajouté plus de détails – wander95

+0

Maintenant, je vois, 'char()' n'est pas autorisé dans l'instruction DATA. –

Répondre

1

faire une hypothèse audacieuse que vous n'avez pas vraiment besoin d'être standard F77 conforme, vous devriez essayer:

character*10 :: xx=repeat(char(120),10) 

à F77 vous auriez besoin pour faire de cette une mission d'exécution,

character*10 xx 
    integer i 
    do i=1,10 
    xx(i:i)=char(120) 
    end do 

la seule façon que je vois d'utiliser un nombre de répétitions data déclaration pour initialiser une st anneau en F77 est par équivalence avec une longueur de 1 tableau de caractères, et ici vous ne pouvez pas utiliser la fonction char

equivalence(x,y) 
    character*10 x 
    character*1 y(10) 
    data y/10*'a'/ 
    write(*,*)x 

aaaaaaaaaa

+0

drôle. Il semble n'y avoir aucun moyen simple de le faire. Je vais attendre un jour ou deux avant d'accepter cette réponse .. – wander95

+0

f77 a fait beaucoup de choses encombrantes. C'est pourquoi * personne * ne devrait l'utiliser. – agentp

+0

Il n'y a pas besoin de s'en tenir à F77 - l'utilisation de repeat est exactement comme cela devrait être fait dans n'importe quel compilateur qui supporte F2003, ce que ifort fait. –

0

Très similaire au poste de agentp. Vous pouvez utiliser la fonction CHAR() indirectement si vous l'utilisez dans une instruction PARAMETER à la compilation. Vieux-temps, mais cela fonctionne sur openVMS Fortran.

PARAMETER CHAR_120 = CHAR(120) 

CHARACTER*1  X(10) /10*CHAR_120/ 
CHARACTER*10 XX 
EQUIVALENCE (X, XX) 

TYPE *,XX 
+0

J'ai réussi à compiler ceci dans gfortran, mais vous devez déclarer 'CHAR_120' comme' CHARACTER' et vous devez utiliser la syntaxe correcte de Fortran pour les paramètres: 'PARAMETER (CHAR_120 = CHAR (120))'. Les parenthèses ne sont pas facultatives. De plus, le superutilisateur 'TYPE' doit être changé en' PRINT'. –

+0

J'ai aussi oublié de mentionner que ce style d'initialisation variable 'CHARACTER * 1 X (10)/10 * CHAR_120 /' n'est pas non plus standard. Mais gfortran, et vraisemblablement d'autres compilateurs, le compile aussi. –

+0

Ce que j'ai posté a été testé. Le compilateur F77 DEC (openVMS) suppose un type de données sur l'instruction PARAMETER (caractère, nombre entier ou flottant) en fonction de ce que vous avez égalé le paramètre. Il prend également en charge la déclaration séparée et PARAMETER en utilisant des parenthèses comme vous le montrez dans votre commentaire. Je ne savais pas que c'était plus standard. TYPE * est juste une habitude de 30 ans. –