2014-09-24 3 views
0

Как конвертировать Julia Int/Bool Array/Vector в массив Fortran LOGICAL для использования в ccall от Julia?Как преобразовать массив Julia Bool в логический массив Fortran

Я попытался передать его как Array {Bool} в https://gist.github.com/axsk/28f297e2207365a7f4e8/, но код работает некорректно, и я вполне уверен, что проблема заключается в преобразовании Bool-Logical.

+0

в http://julia.readthedocs.org/ru/latest/manual/types/#bits-types написано, что даже тип bool имеет 8 бит. вероятно, это проблема, но как я могу ее решить? – axsk

ответ

1

Я не слишком много знаю о вызове Fortran кода, но в соответствии с this

Фортран стандарт не определяет, как представляются переменные логического типа , за требуя, чтобы ЛОГИЧЕСКИЕ переменные по умолчанию вида имеют тот же размер хранилища, что и переменные INTEGER и REAL по умолчанию. Внутреннее представление GNU Fortran выглядит следующим образом.

А ЛОГИЧЕСКАЯ (KIND = N) переменная представлена ​​как переменная INTEGER (KIND = N) , однако имеет только два допустимых значения: 1 для .TRUE. и 0 для. FALSE. Любое другое целочисленное значение приводит к неопределенному поведению.

Так что я хотел бы сделать что-то вроде следующего

julia_array = rand(Bool, 1:10) 
fort_array = Int[x?1:0 for x in julia_array] 

fort_array Затем используйте в качестве входных данных. Какой компилятор Fortran вы используете?

EDIT: Оказывается, разработчики Julia уже определили тип, который будет работать со связанным BLAS/LAPACK, Base.BLAS.BlasInt, который будет использовать правильный вариант Int для системы.

+0

Я сам не компилирую код Fortran, но использую библиотеку LAPACK Fortran, которая поставляется с Julia. Но спасибо до сих пор, я попробую это, когда вернусь домой. – axsk

+0

Если это вытекает из этого соглашения, я думаю, вам повезет. Если это не сработает, попробуйте сделать массив типа CInt – IainDunning

+0

Итак, похоже, что это решило вашу проблему? (переход на https://groups.google.com/forum/#!topic/julia-dev/Bn1c5npwGzo) – IainDunning

0

Как уже сообщалось ранее, Fortran представляет Logical переменные как Integers. К сожалению, представление типа Integer варьируется от платформы к платформе. В то время как у меня был успех с использованием Int на Windows и Cint на Linux/MacOS, в конце я использовал BlasInt, который принимает в зависимости от платформы.

+0

для самого кода см. https://github.com/JuliaLang/julia/pull/8467 – axsk

+0

Казалось бы, против SO этикет, чтобы принять мой ответ, а затем переключиться на свой собственный позже, в основном используя информацию из моего собственного. Я думаю, было бы более уместно обновить мой ответ финальной частью головоломки (BlasInt). В любом случае, рад, что это сработало. – IainDunning

+0

извините, не был уверен в этом сам. вот так :) – axsk