2015-04-19 4 views
1

я получаю следующее сообщение об ошибке при попытке компиляции:двойной точности ошибка при использовании DISLIN

call qplot (Z, B, m + 1) 
      1 
Error: Type mismatch in argument 'x' at (1); passed REAL(8) to REAL(4) 

Все вроде бы в двойной точности, так что я не могу помочь, но думаю, что это ошибка DISLIN, особенно с учетом того, что он появляется со ссылкой на заявление Дислина. Что я делаю не так? Мой код выглядит следующим образом:

program test 

use dislin 

integer :: i 
integer, parameter :: n = 2 
integer, parameter :: m = 5000 
real (kind = 8) :: X(n + 1), Z(0:m), B(0:m) 

X(1) = 1.D0 
X(2) = 0.D0 
X(3) = 2.D0 

do i = 0, m 
    Z(i) = -1.D0 + (2.D0*i)/m 
    B(i) = f(Z(i)) 
end do 

call qplot (Z, B, m + 1) 

    read(*,*) 

contains 

real (kind = 8) function f(t)   
    implicit none 
    real (kind = 8), intent(in) :: t 
     real (kind = 8), parameter :: pi = Atan(1.D0)*4.D0 
      f = cos(pi*t) 
end function f 

end program 
+0

Я думаю, что с вашим компилятором вида = 8 не является двойной точностью. Попробуйте использовать двойную точность или процедуру выбора вида. – albert

+0

Это gfortran. Я написал другие программы с двойной точностью с kind = 8. Я пробовал использовать другие операторы, и я получаю ту же ошибку. – Steve

+0

Спасибо за все ответы. Он работает и компилируется. – Steve

ответ

1

Из DISLIN manual я прочитал, что qplot требует (одинарной точности) поплавки:

QPLOT connects data points with lines. 

The call is: CALL QPLOT (XRAY, YRAY, N) level 0, 1 
or:  void qplot (const float *xray, const float *yray, int n); 

XRAY, YRAY are arrays that contain X- and Y-coordinates. 
N is the number of data points. 

Так что вам нужно преобразовать Z и B в real:

call qplot (real(Z), real(B), m + 1) 

Вместо использования фиксированных чисел для чисел (которые различаются между компиляторами) , пожалуйста, рассмотрите возможность использования модуля ISO_Fortran_env и предопределенных констант REAL32 и REAL64.

1

Для обычной работы qplot требуется реальное значение по умолчанию. Вы можете конвертировать ваши данные

call qplot(real(Z), real(B), m + 1) 

Я второй замечание с kind = 8, это очень некрасиво, если вы настаиваете на 8, по крайней мере объявить константу

integer, parameter :: rp = 8 

и использовать

real(rp) :: 
1

Как объясняют первые два ответа, стандартные версии процедур dislin требуют аргументов с одной точностью. Я считаю наиболее удобным использовать их, поскольку у меня могут быть одиночные или двойные аргументы, используя метод real для преобразования типа двойных переменных. Кажется маловероятным, что потерянная точность будет заметна на графике. Однако, если вы хотите работать исключительно в двойной точности, существует альтернативный набор подпрограмм. Они имеют одинаковые имена, но принимают аргументы с двойной точностью. Чтобы получить их, перейдите в библиотеку «dislin_d».