2011-08-23 12 views

risposta

5

non ho visto uno built-in, ma Google restituisce alcuni:

FLIBS: http://flibs.sourceforge.net/

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

+0

Grazie mille, ho avuto il FLib sul radar, ma in qualche modo il dizionario fornito da esso, ha fatto scivolare la mia attenzione. In caso contrario, le mie ricerche si sono concluse con alcune cose in C++, su cui non voglio realmente dipendere ... – haraldkl

+0

@Haraldkl: Spero che uno standard possa venire in futuro. – SOUser

+0

Ho anche trovato un'implementazione albero rosso-nero su https://www.myroms.org/blog/ e qualche implementazione trie su https://github.com/ned14/nedtries, tuttavia hanno tutti bisogno di un po 'di lavoro da usare loro in Fortran e soprattutto nel mio scenario. Quindi penso che non ci sia una libreria generica semplicemente utilizzabile. – haraldkl

4

Ho creato un dizionario astratto in fortran che potrebbe soddisfare le tue esigenze.

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

In sostanza si permette di fare

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) 

Dove è possibile salvare tutti i tipi intrinseci e può essere facilmente esteso per contenere altri tipi di dati, il valore predefinito di contenere inizialmente se stesso come un altro valore (l'ultima riga mantiene un dizionario come puntatore)

Fa denominazione .kv. == key : value che è una copia profonda e .kvp. == key : pointer che è una copia di riferimento. In questo modo è possibile memorizzare enormi dati senza dover duplicare i dati e recuperare il puntatore in un momento successivo.

Per elaborare l'idea, tutti i dati vengono memorizzati come puntatori di indirizzo utilizzando una chiamata transfer da un tipo derivato contenente il puntatore dati. In questo modo induci il compilatore a consegnarti l'indirizzo del tipo derivato fortran, ma ti costringe a recuperarlo nello stesso modo.
Entro il .kv. un puntatore del tipo di dati viene allocato e successivamente indirizzato dal contenitore dati, quindi in seguito il puntatore assegnato è nullify ied e perso costringendo quindi l'utente a sapere cosa stanno facendo (non c'è spazzatura -collettore in esso;)). Entro il .kvp. il puntatore viene salvato direttamente senza duplicare alcuna memoria.

La cosa bella è che è compatibile con fortran90.

+0

Questa è quasi una risposta solo al collegamento. Potresti scrivere qualcosa su ciò che la biblioteca può e non può fare? Cosa serve? Quale versione di Fortran richiede? –

+0

Ho fatto qualcosa di simile per il mio scopo usando un polimorfismo illimitato. Questo usa il polimorfismo parametrico? Dipende da 'transfer()'? –

+0

E adesso? Penso che spiegare una parte più ampia dell'API non abbia senso? No? – zeroth