2011-08-23 14 views

Odpowiedz

5

Nie widziałem jeden wbudowany, ale Google zwraca kilka:

FLibs: http://flibs.sourceforge.net/

Hash Tables: http://burtleburtle.net/bob/hash/evahash.html i http://www.cris.com/~Ttwang/tech/inthash.htm.

+0

Wielkie dzięki, miałem FLib na radarze, ale jakoś słownik dostarczony przez to, zwrócił moją uwagę. W przeciwnym razie moje poszukiwania zakończyły się głównie sprawami C++, na których tak naprawdę nie chcę polegać ... – haraldkl

+0

@Haraldkl: Mam nadzieję, że znormalizowany może nadejść w przyszłości. – SOUser

+0

Znalazłem również czerwono-czarną implementację drzewa na stronie https://www.myroms.org/blog/ i niektóre implementacje trie na stronie https://github.com/ned14/nedtries, jednak wszystkie one wymagają więcej pracy do wykorzystania ich w Fortranie, szczególnie w moim scenariuszu. Tak więc myślę, że nie ma po prostu użytecznej ogólnej biblioteki. – haraldkl

4

Stworzyłem abstrakcyjny słownik w języku fortran, który może odpowiadać Twoim potrzebom.

Patrz: https://github.com/zerothi/fdict

zasadzie to pozwala zrobić

type(dict) :: dic, dic2 
dic = ('KEY'.kv.1) 
dic = dic //('next'.kv. (/3.,5.,6./)) 
dic = dic //('string'.kv.'Hello world') 
dic2 = ('string2'.kv.'Test') 
dic = dic // ('dic2'.kvp.dic2) 

którym można zapisać wszystkie wewnętrzne typów i może być łatwo rozszerzona zawierać inne dane typy, to domyślnie początkowo zawierać się jako inna wartość. (ostatnia linia zachowuje słownik jako wskaźnik)

Jest to oznaczenie .kv. == key : value, które jest głęboką kopią, oraz .kvp. == key : pointer, która jest kopią referencyjną. W ten sposób można przechowywać ogromne dane bez konieczności duplikowania danych i pobierania wskaźnika w pewnym późniejszym momencie.

Aby rozwinąć pomysł, wszystkie dane są zapisywane jako wskaźniki adresowe za pomocą wywołania transfer z typu pochodnego zawierającego wskaźnik danych. W ten sposób oszukujesz kompilator, by podał ci adres typu pochodzącego z fortranu, ale zmusza go do odzyskania go w dokładnie taki sam sposób.
Przez .kv. wskaźnik typu danych jest przydzielany, a następnie wskazywany przez kontener danych, a następnie przydzielony wskaźnik jest nullify i stracił, zmuszając użytkownika do sprawdzenia, co robi (nie ma śmieci -kolektor w nim;)). Przez .kvp. wskaźnik jest bezpośrednio zapisywany bez duplikowania pamięci.

Fajną rzeczą jest to, że jest zgodna z Fortran90.

+0

To jest prawie odpowiedź tylko link. Czy możesz napisać coś o tym, czego biblioteka może i czego nie może dokonać? Po co to jest? Której wersji Fortran to wymaga? –

+0

Zrobiłem coś podobnego do mojego własnego celu, używając nieograniczonego polimorfizmu. Czy używa to parametrycznego polimorfizmu? Czy to zależy od 'transfer()'? –

+0

Co teraz? Myślę, że wyjaśnienie większej części API jest bez znaczenia? Nie? – zeroth