2012-03-26 20 views
11

Chciałbym mieć sformułowanie zapisu Fortran sformatowane w zależności od pewnej zmiennej. Na przykład, mógłbym napisać:Łańcuch formatu dla wyjścia zależnego od zmiennej

write(*,'(3f15.3,3f9.2)') x,y,z,(var(i),i=1,nvari) 

gdzie nvari = 3. Ale co, jeśli, w niektórych przypadkach, faktycznie mam 4 zmienne (tj. nvari = 4). Chciałbym napisać coś takiego:

write(*,'(3f15.3,nvari(f9.2))') x,y,z,(var(i),i=1,nvari) 

Teraz nvari może być cokolwiek, a wyjście będzie działać jak lubię. Jak mogę zrobić coś takiego?

+1

Czy '3' i' 4' jedyne wybory? A może szukasz czegoś, co poradzi sobie z dowolnym numerem? – sarnold

+1

OP określona jako "nvari może być wszystkim". – patrickvacek

Odpowiedz

14

Jeśli używasz Intel Fortran ma zastrzeżonych przedłużenie tego - można m.in. istniejąca zmienna w nawiasach kątowych działać jako specyfikacją:

write(*,'(3f15.3,<nvari>f9.2)') x,y,z,(var(i),i=1,nvari) 
+0

Och, spoko. Dziękuję za tę odpowiedź. Dokładnie tego chciałem. –

+0

jest sposób na wykonanie pewnych operacji matematycznych na ''? np. - '' lub '3 * ' lub ' ** 2' w instrukcji formatu? Próbowałem z nawiasami ... to nie działało! EDYCJA: obejście, którego teraz używam, to zdefiniowanie innej zmiennej liczbowej 'nfmt' i użycie jej zamiast' nvari' –

+0

Czy istnieje sposób na użycie formatu "A " przy użyciu kompilatora gfortran? – Chris

10

Jeśli kompilator wspiera go, '(3f15.3, *(f9.2))'

Jeśli masz starszą kompilator, wystarczy użyć większej liczby niż masz przedmiotów do wyjścia, na przykład, '(3f15.3, 999(f9.2))'. Nie musisz zużywać formatu.

Dla najbardziej skomplikowanych przypadkach można napisać formatu na ciąg i użyć jej jako format:

write (string, '("(3f15.3, ", I4, "(f9.2))")') nvari 
write (*, string) x,y,z, (array(i), i=1,nvari) 

ze zrozumieniem formatach, w tym w formacie rewersji, stosowanie formatów smyczkowych jest rzadko konieczne.

+0

Cool. Dzięki.Używam kompilatora Intel Fortran, który, jak sądzę, jest całkiem nowy. Ale tak czy inaczej, nie robi tego "(3f15.3, * (f9.2)), więc używam drugiego rozwiązania. BTW, co masz na myśli przez "powrót formatu"? Zrobiłem trochę googlowania, ale nie wymyśliłem zbyt wiele. –

8

Zamiast zapisywać format bezpośrednio w instrukcji zapisu, można również użyć zmiennej znakowej.

character(len=32) :: my_fmt 
my_fmt = '(3f15.3,3f9.2)' 
write(*, my_fmt) x, y, z, (var(i), i = 1, nvari) 

Teraz możliwe jest manipulować zmienną znaków zawierać żądaną liczbę powtórzeń przed stwierdzeniem zapisu, przy użyciu tzw zapis wewnętrznego, lub zapisać do pliku wewnętrznego.

write(my_fmt, '(a, i0, a)') '(3f15.3,', nvari, 'f9.2)' 

(. Wystarczy upewnić się, deklarowana długość my_fmt jest wystarczająco długi, aby zawierać cały ciąg znaków)

+1

Lub, używając ostatniego (nawiasowego) polecenia, użyj zmiennej długości zmiennej, którą można alokować. –

+0

@HighPerformanceMark: Oczywiście, jeśli twój kompilator ją obsługuje, byłoby to najlepsze rozwiązanie. – eriktous

+1

Dla tych, którzy używają kompilatora gfortran, to rozwiązanie jest zalecanym rozwiązaniem w dokumentacji gfortran. Zobacz "Zmienne wyrażenia FORMATU" w dokumentacji (rozdział 6.2.3 dla gfortran 4, gfortran 5, rozdział 6.2.2 dla gfortran 6). –

4

chciałeś napisać coś takiego:

write(*,'(3f15.3,nvari(f9.2))') x, y, z, (var(i), i=1,nvari) 

W rzeczywistości nie jest to stary trik w Fortran standardu, który pozwala pominąć nvari, a więc:

write(*,'(3f15.3,(f9.2))') x, y, z, (var(i), i=1,nvari) 

lub nawet tak:

write(*,'(3f15.3,f9.2)') x, y, z, (var(i), i=1,nvari) 

Norma mówi, że ostatniego deskryptorze w formacie jest powtarzany tak często, jak jest to konieczne, aby pomieścić wszystkie zmienne na liście. To ostatni deskryptor 'mogą być umieszczone w nawiasach, tak że ostatni grupa deskryptorów jest niejawnie powtórzony, na przykład:

write(*,'(3f15.3,(2x,f9.2))') x, y, z, (var(i), i=1,nvari) 
Powiązane problemy