我正在学习如何使用fortran进行一些数据分析。我正在通过以下示例:
program linalg
implicit none
real :: v1(3), v2(3), m(3,3)
integer :: i,j
v1(1) = 0.25
v1(2) = 1.2
v1(3) = 0.2
! use nested do loops to initialise the matrix
! to the unit matrix
do i=1,3
do j=1,3
m(i,j) = 0.0
end do
m(i,j) = 1.0
end do
! do a matrix multiplicationof a vector equivalent to v2i = mij v1j
do i = 1,3
v2(i) = 0.0
do j = 1,3
v2(i) = v2(i) + m(i,j)*v1(j)
end do
end do
write(*,*) 'v2 = ', v2
end program linalg
我用
执行f95 -o linalg linalg.f90
./linalg
但是,我在终端中收到以下消息:
Bus error
我在网上关注的一些链接表明这与未预先定义变量有关,但我确信我在此脚本中无法找到错误的来源。还有另一个原因我会得到这个错误吗?
答案 0 :(得分:6)
你的错误就在这里
do i=1,3
do j=1,3
m(i,j) = 0.0
end do
m(i,j) = 1.0 ! here be a dragon
end do
Fortran明确指出,在循环结束后,索引变量的值比循环的最后一次迭代时的值大1。因此,在这种情况下,语句m(i,j) = 1.0
将尝试在第一轮处理m(1,4)
,然后m(2,4)
,等等。
有时候你很幸运#39;尝试在数组的边界外写入,写入保留在您正在处理的进程的地址空间内。' Lucky'从某种意义上说,你的程序是错误的但不会崩溃 - 这种崩溃是一个更好的情况。bus error
表明编译器生成了一个写入的地址,位于禁区内任何过程。
您可以通过启用“运行时限制检查”来自行找到此信息。用你的编译器。您的编译器文档或其他Q和As在此处将告诉您如何执行此操作。
我会留下你按照自己的意愿解决这个问题,你现在知道规则就能显示出能够弄明白的每一个迹象。