Sapete che ci sono modi "complicati" per fare ciò che volete. Piuttosto che indirizzare quelli, risponderò ai tuoi primi due "perché?" S.
Diversamente dall'assegnazione intrinseca, un'istruzione read
non ha la variabile di destinazione assegnata per la prima volta ai parametri di dimensione e tipo corretti per la cosa in arrivo (se non è già così). In effetti, è necessario che gli elementi in una lista di input vengano allocati. Fortran 2008, 9.6.3, afferma chiaramente:
Se un elemento di input o un elemento di output è assegnabile, deve essere assegnato.
Questo è il caso se la variabile assegnabile è un carattere con lunghezza differita, una variabile con altri parametri di tipo lunghezza differita o una matrice.
C'è un altro modo per dichiarare un carattere con lunghezza differita: assegnando l'attributo pointer
. Questo non ti aiuta, anche se, come vediamo anche
Se un elemento di input è un puntatore, esso deve essere associato ad un obiettivo definibile ...
Perché non hai uscita dal la tua istruzione write
è correlata al motivo per cui vedi che la variabile di carattere non è allocata: non hai seguito i requisiti di Fortran e quindi non puoi aspettarti il comportamento che non è specificato.
Mi chiedo perché questa restrizione è qui. Vedo due modi ovvi per rilassare la restrizione
- consentire l'assegnazione automatica in generale;
- consente l'allocazione di un carattere di lunghezza differita.
Il secondo caso sarebbe facile:
Se un elemento di ingresso o un elemento di uscita è allocabile, essa è ripartita meno che sia una variabile di carattere scalare con lunghezza differita.
Questo, tuttavia, è maldestro e tali casi speciali sembrano contrari all'etica dello standard nel suo insieme. Avremmo anche bisogno di una regola attentamente studiata sull'allocazione per questo caso speciale.
Se andiamo per il caso generale di assegnazione, avremmo presumibilmente richiedono che l'oggetto non allocato efficace è l'elemento efficace finale nella lista:
integer, allocatable :: a(:), b(:)
character(7) :: ifile = '1 2 3 4'
read(ifile,*) a, b
e poi ci si deve preoccupare
type aaargh(len)
integer, len :: len
integer, dimension(len) :: a, b
end type
type(aaargh), allocatable :: a(:)
character(9) :: ifile = '1 2 3 4 5'
read(ifile,*) a
Diventa abbastanza caotico molto rapidamente.Che sembra un sacco di problemi da risolvere dove ci sono modi, di diversa difficoltà, di risolvere il problema di lettura.
Infine, noterò anche che l'allocazione è possibile durante un'istruzione di trasferimento dati. Sebbene una variabile debba essere allocata (come le regole sono ora) quando appare nei componenti dell'elenco di input di una variabile allocata di tipo derivato needn't be se quell'elemento efficace viene elaborato dall'input definito.
Vero, ma vale la pena notare che la riassegnazione sull'assegnazione semplifica molte cose. In particolare, il tuo expo C++ è ugualmente semplice in Fortran. Il compilatore potrebbe persino optoimizzarlo per chiamare 'realloc()' sotto il cofano, ma non so se lo faccia. –