2013-08-26 19 views
5

Uczę się Fortran, w tym momencie opcjonalne argumenty.opcjonalne argumenty w funkcjach fortra

mogę z nich korzystać z podprogramów z intent(in) i intent(inout), ale z funkcjami opcjonalne argumenty działają tylko z intent(in), prawda? Z intent(inout) otrzymuję błędy segmentacji.

+2

inout powinieneś zobaczyć zobacz tutaj http://stackoverflow.com/questions/3121954/fortran-90-presence-of-optymional-arguments – agentp

+1

Być może segfault pochodzi z nie testowania na obecność argumentu? –

+1

Może powinieneś opublikować minimalny (nie) działający przykład ... – Stefan

Odpowiedz

4

ok znalazłem problem, użyłem zmiennej, nawet jeśli nie ma, tak jak:

real function foo(x, tol) 
    real, intent(in) :: x 
    real, optional, intent(inout) :: tol 
    if(.not. present(tol)) tol = 1e-6 
    !... 
end function foo 

Ale chciałbym z niego korzystać nawet wtedy, gdy nie występuje i ustawić wartość domyślną, jak wtedy, gdy w C++ Robimy coś w tym stylu:

double foo(double x, double tol=1e-6) 

Jak mogę to zrobić? dzięki

+2

Nie możesz zdefiniować/przypisać/użyć opcjonalnego argumentu, który nie jest obecny. Musisz użyć innej zmiennej. Na przykład nazwij opcjonalny var * opt_tol * i zdefiniuj * tol * w swoim programie (* jeśli jest obecny (opt_tol), a następnie tol = opt_tol else tol = wartość domyślna *). Zobacz rozdział 12.4.1.6 standardu [Fortran 2003] (http://www.j3-fortran.org/doc/year/04/04-007.pdf). –

+0

ok I undestood, dzięki @arbautjc – rosilho

+0

http://stackoverflow.com/questions/18302083/fortran-95-present-statement-using-ftn95-and-plato – agentp