2015-02-12 5 views
0

Я пытаюсь скомпилировать файлы LAPACK Fortran с компилятором LF Fortran в Visual STudio 2013 для создания .NET DLL.Неверная операция Ошибка при компиляции файлов Lapack Fortran с LF Fortran в VS2013

Я успешно скомпилировал пакет BLAS, который является зависимостью для LAPACK.

Но при составлении LaPack файлов, я получаю «Недопустимая операция» для утверждения:

CALL CLA_GBRFSX_EXTENDED(PREC_TYPE, TRANS_TYPE, N, KL, KU, 
$   NRHS, AB, LDAB, AFB, LDAFB, IPIV, COLEQU, C, B, 
$   LDB, X, LDX, BERR, N_NORMS, ERR_BNDS_NORM, 
$   ERR_BNDS_COMP, WORK, RWORK, WORK(N+1), 
$   TRANSFER (RWORK(1:2*N), (/ (ZERO, ZERO) /), N), 
$   RCOND, ITHRESH, RTHRESH, UNSTABLE_THRESH, IGNORE_CWISE, 
$   INFO) 

Я проверил типы аргументов с теми, в подпрограмме CLA_GBRFSX_EXTENDED. Все они одинаковы, но кроме возвращаемого значения оператора «TRANSFER (RWORK (1: 2 * N), (/ (ZERO, ZERO) /), N)».

У меня есть определить переменную как

COMPLEX Y_TAIL_ATE(1:2*N) 

и наполнили его как

Y_TAIL_ATE = TRANSFER (RWORK(1:2*N), (/ (ZERO, ZERO) /), N) 

И называется подпрограммой как

CALL CLA_GBRFSX_EXTENDED(PREC_TYPE, TRANS_TYPE, N, KL, KU, 
$   NRHS, AB, LDAB, AFB, LDAFB, IPIV, COLEQU, C, B, 
$   LDB, X, LDX, BERR, N_NORMS, ERR_BNDS_NORM, 
$   ERR_BNDS_COMP, WORK, RWORK, WORK(N+1), 
$   Y_TAIL_ATE, 
$   RCOND, ITHRESH, RTHRESH, UNSTABLE_THRESH, IGNORE_CWISE, 
$   INFO) 

Теперь компилятор дает ту же ошибку для

Y_TAIL_ATE = TRANSFER (RWORK(1:2*N), (/ (ZERO, ZERO) /), N) 

я понял, что проблема заключается в

TRANSFER (RWORK(1:2*N), (/ (ZERO, ZERO) /), N) 

Поскольку мои знания о C#, я не могу понять решение. Но мой код C# должен использовать LAPACK, и я должен решить эту проблему.

Есть ли идея решения?

Спасибо заранее ...

+0

Как точно выглядит код, который вы компилируете, и как выглядит сообщение об ошибке? –

+0

Захват экрана проекта в VS2013 и сообщения об ошибках по этой ссылке: https://drive.google.ком/файл/d/0B2lAUX8zuUudMllqVGxURV9TTXc/вид? УСП = обмен –

ответ

0

Одна из проблем состоит в том, что выражение

TRANSFER (RWORK(1:2*N), (/ (ZERO, ZERO) /), N) 

возвращает ранг-1 массив комплексных чисел с N элементов - это то, что аргумент N указывает. Затем назначение

Y_TAIL_ATE = TRANSFER (RWORK(1:2*N), (/ (ZERO, ZERO) /), N) 

попытки присвоить массив N элемента в массив 2*N элемента и Fortran не будет этого делать. Тот факт, что RWORK имеет 2*N (реальные) элементы, не имеет отношения к размеру результата TRANSFER, когда размер (N) предоставляется так, как он есть.

Fortran назначит скаляр массиву и выполнит однопозиционное назначение двух массивов одинаковой формы. Но это не позволит вам написать назначение с различными формами массивов на левой и правой сторонах.

Я ничего не знаю о CLA_GBRFSX_EXTENDED, и я просто предполагаю, что компилятор также обнаруживает несоответствие фиктивных и фактических аргументов в первая версия вашего кода.