2010-09-30 11 views
18

Rozumiem, że możesz zwrócić tablicę z funkcji w Fortranie, ale z jakiegoś powodu mój kod zwraca tylko pierwszą wartość w tablicy, którą prosi, aby ją zwrócić. Jest to funkcja:Funkcja Zwracanie tablicy w Fortranie

function polynomialMult(npts,x,y) 
    integer npts 
    double precision x(npts), results(npts + 1), y(npts,npts) 

    polynomialMult = x(1:npts) + 1 

end function 

i to gdzie ja dzwonię go

C(1:numPoints) = polynomialMult(numPoints,x,f) 

print *, C(1:numPoints)` 

teraz nie zrobić coś pożytecznego, bo staram się zrozumieć składnię przed piszę logikę . Widziałem pewne rzeczy dotyczące określania typów funkcji, ale kiedy piszę lub cokolwiek, otrzymuję błąd kompilacji.

Odpowiedz

25

Aby zdefiniować funkcję, która zwraca tablicę zawierać deklarację funkcji wewnątrz funkcji, na przykład:

function polynomialMult(npts,x,y) 
    integer npts 
    double precision x(npts), results(npts + 1), y(npts,npts) 

! Change the next line to whatever you want 
    double precision, dimension(npts) :: polynomialMult 

    polynomialMult = x(1:npts) + 1 

end function 

Twój deklaracji

integer function polynomialMult(npts,x,y) 

deklaruje, że funkcja zwraca liczbę całkowitą. Liczba całkowita, a nie tablica liczb całkowitych. Nie sądzę, aby standard dopuszczał deklaracje funkcji, takie jak:

integer, dimension(10) function polynomialMult(npts,x,y) 

, ale mogę się mylić. Zawsze używam formularza, który pokazałem ci powyżej.

Jeśli masz aktualny kompilator Fortran, możesz robić sprytne rzeczy, takie jak zwrócenie przydzielonej tablicy. I sugeruję, żebyś wymyślił składnię tablicową. Na przykład, stwierdzenie:

polynomialMult = x(1:npts) + 1 

mógłby bardziej zwięźle być napisane:

polynomialMult = x + 1 

od Fortran będzie mapować skalarnego dodatek do wszystkich elementów tablicy x, które zostały zadeklarowane mieć tylko npts elementy.

Podawanie rozmiarów tablic do podprogramów jest bardzo FORTRAN77 i prawie zawsze niepotrzebne. Zwykle chcesz operować na każdym elemencie tablicy (jak w przykładzie składni tablicy) lub powinieneś pozwolić programowi określić rozmiar macierzy, z którą ma do czynienia.

+1

Dzięki za pomoc. Jak możesz prawdopodobnie powiedzieć, jestem nowy w Fortran. – Statler

3

zgadzam się z poprzednim odpowiadającego że następujące utwory:

polynomialMult = x + 1 

Jednak bez wiedząc, że polynomialMult i x są tablice, można przypuszczać, że jest to operacja skalarne. Wolę być oczywiste i zrobić to w ten sposób:

polynomialMult(:) = x(:) + 1 

Mam nawet twierdził, że programiści w mojej grupie zrobić to w ten sposób. Nie lubię ciężko pracować, aby zrozumieć czyjś kod - chcę, żeby było jasne, co robią.

+2

Haha, powrócił na to pytanie, gdy uzyskał jeszcze jeden głos.Z tą odpowiedzią jest subtelny "problem": "wielomian" to tablica, a "wielomian" ("to") to sekcja tablicowa, a te dwa nie zawsze są wymienne, chociaż są tutaj. –

+0

@HighPerformanceMark: Powiedziałbym coś takiego jak "wielomian" (1: npts) = x (1: npts) + 1 ". Wtedy nie ma wątpliwości, prawda? – jvriesem

+1

@jvriesem, to zależy od tego, jak ustawione są indeksy 'polynomialMult'. Czasami istnieją dobre powody, aby używać niestandardowych indeksów, takich jak 'double precision polynomialMult (0: npts-1)'. W takim przypadku ryzykujesz błędy z 'polynomialMult (0: npts-1) = x (0: npts-1) + 1', ponieważ możesz przypadkowo pomylić wskaźniki w wyrażeniu. – astay13

Powiązane problemy