Динамическая хеш-подобная структура данных в Фортране - PullRequest
10 голосов
/ 23 августа 2011

Есть ли в Фортране библиотека, которая позволяет использовать разреженные динамические массивы (например, хэш / словарь), кроме массивов Джуди ?

Ответы [ 2 ]

5 голосов
/ 24 августа 2011

Не видел одного встроенного, но гугл возвращает несколько:

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

Хеш-таблицы: http://burtleburtle.net/bob/hash/evahash.html и http://www.cris.com/~Ttwang/tech/inthash.htm.

4 голосов
/ 02 июня 2015

Я создал абстрактный словарь на фортране, который может удовлетворить ваши потребности.

См .: https://github.com/zerothi/fdict

В основном это позволяет вам

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)

Там, где вы можете сохранить все внутренние типы, и его можно легко расширить, чтобы он содержал другие типы данных, он по умолчанию изначально содержит себя в качестве другого значения. (последняя строка сохраняет словарь в качестве указателя)

Это обозначает .kv. == key : value, что является глубокой копией, и .kvp. == key : pointer, который является справочной копией. Таким образом, вы можете хранить огромные данные без необходимости дублировать данные и извлекать указатель на более позднем этапе.

Чтобы развить эту идею, все данные хранятся в виде адресных указателей с использованием вызова transfer из производного типа, содержащего указатель данных. Таким образом, вы обманываете компилятор, чтобы передать вам адрес производного типа от fortran, но вынуждает его получать его точно таким же образом.
С помощью .kv. указатель типа данных выделяется и впоследствии указывается контейнером данных, после чего назначенный указатель nullify определяется и теряется , что вынуждает пользователя знать, что они делаю (в нем нет сборщика мусора;)). По .kvp. указатель сохраняется напрямую, без дублирования памяти.

Приятно то, что он совместим с fortran90.

...