2011-08-23 7 views

Respuesta

5

no he visto uno incorporado, pero Google devuelve algunos:

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

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

+0

Muchas gracias, tenía FLib en el radar, pero de alguna manera el diccionario proporcionado por él, me llamó la atención. De lo contrario, mis búsquedas en su mayoría terminaron con algunas cosas de C++, de las que realmente no quiero depender ... – haraldkl

+0

@Haraldkl: Espero que una versión estandarizada pueda venir en el futuro. – SOUser

+0

También encontré una implementación de árbol rojo-negro en https://www.myroms.org/blog/ y alguna implementación de trie en https://github.com/ned14/nedtries, sin embargo, todos necesitan más trabajo para usar ellos en Fortran y especialmente en mi escenario. Por lo tanto, creo que no hay una biblioteca genérica simplemente utilizable. – haraldkl

4

He creado un diccionario abstraída en FORTRAN que podría satisfacer sus necesidades.

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

Básicamente se le permite hacer

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) 

donde puede guardar todos los tipos intrínsecos y que se puede ampliar fácilmente para contener otros tipos de datos, el valor predeterminado para contener inicialmente como otro valor (la última línea conserva un diccionario como puntero)

Tiene una designación .kv. == key : value que es una copia profunda, y .kvp. == key : pointer que es una copia de referencia. De esta manera puede almacenar datos enormes sin tener que duplicar datos y recuperar el puntero en algún momento posterior.

Para profundizar en la idea, todos los datos se almacenan como punteros de dirección utilizando una llamada transfer de un tipo derivado que contiene el puntero de datos. De esta forma, engañas al compilador para que te proporcione la dirección del tipo fortran derivado, pero te obliga a recuperarlo de la misma manera.
Por .kv. un puntero del tipo de datos se ha asignado y, posteriormente, apuntado por el contenedor de datos, a continuación, después el puntero asignado es nullify IED y perdió lo que obliga al usuario a saber lo que están haciendo (no hay basura -collector en él;)). Por .kvp. el puntero se guarda directamente sin duplicar ninguna memoria.

Lo bueno es que es compatible con Fortran90.

+0

Esta es casi una respuesta de solo enlace. ¿Podría escribir algo sobre lo que la biblioteca puede y no puede hacer? ¿Para qué sirve? ¿Qué versión de Fortran requiere? –

+0

Hice algo similar para mi propio propósito usando polimorfismo ilimitado. ¿Utiliza esto el polimorfismo paramétrico? ¿Depende de 'transfer()'? –

+0

¿Qué tal ahora? Creo que explicar una parte más grande de la API no tiene sentido? ¿No? – zeroth

Cuestiones relacionadas