声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 5666|回复: 6

[经典算法] 简单的复数输入程序的错误(fortran)

[复制链接]
发表于 2006-3-17 14:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
小程序为:
-----------------------------
program main

implicit none
real :: i,j
complex :: m

i=2.0
j=1.0
write(*,*)'j=', j
write(*,*)'i=', i

m=(i,j)
write(*,*)'m=',m

end
-----------------
调试的报错信息为

Error: A symbol must be a defined parameter in this context. [I]
m=(i,j)
---^
Error executing df.exe.

这个错误具体的指什么?怎样修改可以实现先通过对i、j赋值,然后对复数m进行赋值?
回复
分享到:

使用道具 举报

发表于 2006-3-18 10:46 | 显示全部楼层

回复:(xinshao)简单的复数输入程序的错误(fortran...

似乎complex类型的变量没法在(,),赋值号中使用表达式,
但却可以仅对实部进行表达式赋值。

因为很少用complex type,没遇到过这种问题,
找了不少书,均没说明。

再研究研究^_^


下面的程序可以运行,

program main

implicit none
real(kind=8),parameter::w=1.0,v=8.0
real(kind=8)::r,t
complex(kind=8)::m
r=sqrt(2.0)
t=sqrt(3.0)
write(*,*)'w=', w
write(*,*)'v=', v
m=(w,v)
print *,m
m=r+t
write(*,*)m

end
1.png
发表于 2006-3-18 10:52 | 显示全部楼层
program main
implicit none
real(kind=8),parameter::w=1.0,v=8.0
real(kind=8)::r,t
complex(kind=8)::m
r=sqrt(2.0)
t=sqrt(3.0)
write(*,*)'w=', w
write(*,*)'v=', v
m=(w,v) !改成m=(w+v,v-w),即含表达式,就不行
!如果w,v不声明成parameter,那么m=(w,v)也没法运行。
print *,m
m=r+t !r,t均为实数,这种赋值又可行。
write(*,*)m

end

ps:在compaq visual fortran 6.6C上是这些情况,别的compiler不清楚。
 楼主| 发表于 2006-3-19 16:33 | 显示全部楼层

回复:(linqus)program mainimplicit nonereal(ki...

辛苦了,谢谢!
几次碰到复数的问题,都出问题,晕
发表于 2006-3-21 08:15 | 显示全部楼层
在别的论坛得到解答了,如下:

(1) 仅对确定的数(prameter 类型在编译阶段已经用确定的数代替)可以不用 cmplx;
(2) 对变量,用 cmplx 作构造函数, z = x + i y ==> z = cmplx(x, y)

program main


implicit none
real(kind=8),parameter::w=1.0,v=8.0
real(kind=8)::r,t
complex(kind=8)::m
r=sqrt(2.0)
t=sqrt(3.0)
write(*,*)'w=', w
write(*,*)'v=', v
m=(w,v)
print *,m
m=cmplx(r+t,r-t) !可行了
write(*,*)m

end
发表于 2009-4-22 09:43 | 显示全部楼层

求助

program ex0001
integer n
real x1,x2,x,f1,f2,fx,eps

   real,allocatable::d(,e(
   write(*,*) "lease enter n:"
   read(*,*) n   
   allocate(d(n),e(n-1)) ! d是对角元素,e是非对角元素

eps=1.0E-6
fx=1.0
do j=1,n
d(j)=-2
end do
do j=1,n-1
e(j)=1
end do
!write(*,*) "lease enter array d and e:"
!read(*,*) d,e
a1=d(1)-e(1)
a2=d(1)-2*e(1)
a3=d(1)+e(1)
a4=d(1)+2*e(2)
y1=min(a1,a2)
y2=max(a4,a3)
y=(y2-y1)/n
x1=y1
x2=y1+y
write(*,*)"矩阵的特征值为:"
do m=1,n
temp=x2
10 if(abs(fx)>eps) then
    x=(x1+x2)/2
    f1=MValue(x1,n,d,e)
    f2=MValue(x2,n,d,e)
    fx=MValue(x,n,d,e)

    if (fx*f1>0)  then
       x1=x
    else
       x2=x
    end if

       go to 10      
end if
print*,"--------------------"
write(*,*) x
x1=temp
x2=temp+y
z=(x1+x2)/2
fx=MValue(z,n,d,e)
end do
print*,"--------------------"

contains

real function mValue(x,n,d,e) !对称三对角矩阵多项式展开
Integer  n,i
real x
real d(n),e(n-1),s(n)
S(1)=x-d(1)
S(2)=(x-d(1))*(x-d(2))-e(1)**2
   Do i=3,n
      S(i)=(x-d(i))*s(i-1)-e(i-1)**2*s(i-2)
   End do
mValue=s(n)   
return
End function mValue

end
帮我 解释下 这个程序吧,麻烦各位了
发表于 2014-10-17 09:50 | 显示全部楼层
收益良多..
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-28 13:40 , Processed in 0.111425 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表