如何在fortran中诊断总线错误
我正在学习如何使用fortran进行数据分析。我正在处理以下示例:如何在fortran中诊断总线错误,fortran,Fortran,我正在学习如何使用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
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
我在网上看到的一些链接表明,这与没有预先定义变量有关,但我确信我在这个脚本中找到了,并且找不到错误的来源。我会犯这个错误还有其他原因吗 你的错误就在这里
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)
,依此类推
有时,如果您试图在数组边界之外进行写操作,就会得到“幸运”,而写操作会停留在您正在处理的进程的地址空间内幸运的是,你的程序是错误的,但没有崩溃——这次崩溃的情况要好得多。总线错误
表明编译器生成了一个地址,该地址位于任何进程的禁止区域
通过启用编译器的“运行时边界检查”,您可以自己发现这一点。您的编译器文档,或其他Qs,以及这里的Qs,将告诉您如何做到这一点
我会让你按照你的意愿来解决这个问题,现在你知道规则了,你会表现出一切能够解决问题的迹象