2015-10-19 62 views
2

我正在學習如何使用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 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 

說我有些鏈接我跟隨在線表明這是爲了不預先定義一個變量,但我相信我在這個腳本中找不到錯誤來自哪裏。是否有另一個原因,我會得到這個錯誤?

回答

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)等等。

有時你會得到'幸運',試圖在數組邊界之外進行書寫,並且寫入停留在您正在處理的進程的地址空間中。'幸運'表示您的程序錯誤,但不會不會崩潰 - 這種崩潰是一個更好的情況。bus error暗示編譯器已經生成了一個寫入地址,該地址位於任何進程的禁止區域。

您可以通過使用編譯器啓用「運行時邊界檢查」來自己找到它。你的編譯器的文檔或者其他的Q和As在這裏將告訴你如何做到這一點。

我會留下來給你解決這個問題,你會發現所有跡象表明現在你知道了規則。