2012-01-27 10 views
10

Chciałbym przydzielić tablicy B do tego samego kształtu i mają takie same dolne i górne granice, jak innej tablicy A. Na przykład, można użyćPrzydzielanie tablic o tym samym rozmiarze

allocate(B(lbound(A,1):ubound(A,1), lbound(A,2):ubound(A,2), lbound(A,3):ubound(A,3))) 

Ale nie tylko to jest nieeleganckie, ale również staje się bardzo irytujące dla tablic (parzysty) wyższych wymiarów.

Miałem nadzieję na coś więcej jak

allocate(B(shape(A))) 

który nie działa, a nawet jeśli to nie działa, każdy wymiar rozpocznie się o 1, co jest nie to, co chcę.

Czy ktoś wie, w jaki sposób mogę łatwo przydzielić tablicy mieć taki sam rozmiar i granice, jak innej tablicy łatwo dla dowolnych wymiarów tablicy?

+1

Mogę zapytać, dlaczego trzeba to zrobić. Nie możesz po prostu przydzielić 'B' w tym samym czasie co' A' (lub przynajmniej w tym samym zakresie, kiedy będziesz miał dostęp do parametrów tablicy/kształtu, używanych do alokacji 'A'). Alternatywnie, jeśli przekazujesz 'A' do funkcji lub podprogramu, możesz nie tylko mieć założoną tablicę rozmiarów' B' lokalną dla tej procedury, która przyjmuje kształt 'A'? – Chris

+0

Cóż, chyba nie potrzebuję tego, to po prostu naprawdę nieeleganckie. Tablica 'A' jest przydzielona w innym pliku .f z granicami' A (nlmx-a_offset: nlpx + b_offset, ...) ', zauważysz, że jest to więcej znaków niż użycie l/ubound. – user1173081

+0

Wtedy myślę, że odpowiedź M.S.B. jest prawdopodobnie najlepszym sposobem na zrobienie tego, co próbujesz zrobić. – Chris

Odpowiedz

8

Można też zdefiniować go w dyrektywy preprocesora, ale to będzie ze stałym wymiarowości:

#define DIMS3D(my_array) lbound(my_array,1):ubound(my_array,1),lbound(my_array,2):ubound(my_array,2),lbound(my_array,3):ubound(my_array,3) 

allocate(B(DIMS3D(A))) 

Nie zapomnij skompilować z np -cpp opcja (gfortran)

przypadku korzystania Fortran 2003 lub powyżej, można użyć argumentu źródło:

allocate(B, source=A) 

ale będzie również skopiować elementy A do B.

5

Jeżeli jesteś robiąc to bardzo często i myślę, że to zbyt brzydkie, możesz napisać własny podprogram, żeby się nim zająć, copy_dims (template, new_array), enkapsulując pokazaną linię kodu źródłowego. Można nawet skonfigurować ogólny interfejs, aby mógł obsłużyć tablice o kilku stopniach - patrz how to write wrapper for 'allocate' jako przykład tego pojęcia.

+0

tak, przenoszenie elementów do dedykowanych podprogramów jest bardzo dobre, jeśli będziesz go dużo używać i jeśli potrzebujesz pewnej elastyczności! – steabert

11

Od Fortran 2008, jest obecnie MOLD opcjonalny argument:

ALLOCATE(B, MOLD=A)

formy = specifier działa niemal w taki sam sposób jak Source =. Jeśli podasz MOLD = a source_expr jest zmienną, jej wartość nie musi być zdefiniowana. Ponadto MOLD = nie kopiuje wartości source_expr do zmiennej, która ma zostać przydzielona.

Źródło: IBM Fortran Ref

Powiązane problemy