2015-04-24 4 views
1

Я пытаюсь скомпилировать программу, написанную в FORTRAN, которая графически отображает графики с использованием библиотек DISLIN, но все данные имеют двойную точность. Я не могу потерять эту точность, поэтому переход к простой точности - это не вариант. При попытке установить связь с библиотеками двойной точности (_d), я все еще получаю следующее сообщение об ошибке, я бы ожидать, если бы я связан с простой точностью библиотек:Библиотеки с двойной точностью DISLIN

call graf(-1.D0, 1.D0, -1.D0, 2.D0/10.D0, -1.D0, 1.D0, -1.D0, 2.D0/10.) 
     (1) 
ERROR: Type mismatch in argument 'ax' at (1); passed from REAL(8) to REAL(4). 

Я также получить другие подобные ошибки во все планировавшем заявлении. Моя команда компиляции (gfortran):

gfortran modulename.f95 progname.f95 C:\dislin\disgf_d.a -luser32 -lgdi32 -lopengl32 

Обратите внимание, что disgf_d ссылается на библиотеки двойной точности. Кто-нибудь есть идеи здесь?

Соответствующий код:

call metafl("XWIN") 
call disini() 
call graf(-1.D0, 1.D0, -1.D0, 2.D0/10.D0, -1.D0, 1.D0, -1.D0, 2.D0/10.D0) 
do i = 0, m 
    Z(i) = -1.D0 + (2.D0*i)/m 
    Y_Z(i) = Int_g(Z(i)) 
end do 
call curve (Z, Y_Z, m + 1) 
do i = 0, m 
    Y_Z(i) = g(Z(i)) 
end do 
call curve (Z, Y_Z, m + 1) 
call endgrf() 
call disfin() 
+0

Эта ошибка говорит вам, что конкретный аргумент - * не * двойная точность. Вам необходимо изучить документы пакета (или исходный код), чтобы убедиться, что вы используете правильный тип для каждого аргумента. – agentp

+0

Я бы предположил, что '-ldislin_d' является ссылкой для библиотек с двойной точностью. –

ответ

0

Я нашел, что решение было в файле .MOD с машинным кодом. Естественно, этот объектный файл должен соответствовать библиотекам двойной точности, а по умолчанию после установки DISLIN для файла .MOD ссылаться на простые библиотеки точности. В папке с именем real64 есть еще один файл dislin.MOD, который соответствует файлам с двойной точностью, однако это обычно не работает, поскольку он был скомпилирован на другой машине. Необходимо скомпилировать файл dislin.f90 в реальном 64 папку в основной каталог DISLIN, заменив файл на .mod по умолчанию, используя gfortran команду:

gfortran -c dislin.f90 

-с указывает, что файл f.90 выиграл» t быть скомпилированным в exectuable, но в объектный файл. Поскольку это модуль .f90, это будет .MOD вместо .o.

Затем, используя «use dislin» и ту же команду, что и в исходном посте, все может быть скомпилировано правильно, связавшись с библиотеками двойной точности.

+0

Это не то, как работают файлы .mod. Они зависят от компилятора, но содержат более или менее только интерфейсы и описание переменных, определенных в модуле. Кроме того, одна команда, как вы показали, может создавать много файлов '.mod', по одному для каждого модуля, присутствующего в исходном файле. Некоторые компиляторы не создают никаких файлов '.mod', но gfortran делает то, что я написал. Для вашей команды, показанной выше, файл '.o' также должен быть сгенерирован. –

0

Попробуйте скомпилировать программу с линией изменен

call graf(-1.E0, 1.E0, -1.E0, 2.E0/10.E0, -1.E0, 1.E0, -1.E0, 2.E0/10.) 

1.0E0 и 1.0D0 являются одинарной и двойной точности константы соответственно.

 Смежные вопросы

  • Нет связанных вопросов^_^