2012-07-05 35 views
-2

我正在做一些我一次又一次的工作,在Fortran 90中將數組設置爲零。但是,出於某種原因,在這種情況下它不起作用,而且我有不知道爲什麼。FORTRAN:將數組設置爲0將不起作用

我分配數組,並使用A = 0.d0但是當我寫出它打印的部件之一,因爲0.4xxx

我的陣列是一個模塊級陣列,如果這有什麼差別,而我內對其進行初始化子程序。

有沒有人知道爲什麼會發生這種情況?

編輯:對不起,我已經離開,因此沒有迴應。這仍然在發生。我正在使用gfortran 4.3。我已經改變了一些東西,看看他們是否會幫助,但他們沒有。注意下面,我將元素設置爲零兩種方式。在循環內,它們肯定被設置爲零,但是在循環之後,至少有一個元素變得非零,原因不明。我知道所有其他元素也是非零的。我將相關數組更改爲本地子程序數組,但這沒有任何作用。以下是給我錯誤輸出的代碼:

subroutine coeff_cube(f, Ng,x_max_8,coeffs) 
    integer, intent(in) :: Ng 
    real(8), intent(in) :: f(Ng,Ng,Ng) 
    real(8), intent(in) :: x_max_8 


    integer    :: i,j,k,ii,jj,kk 

    real(8)    :: Ints(Ng,nmax+1) 
    real(8), intent(out) :: coeffs(nmax+1,nmax+1,nmax+1) 

    call cube_ints(x_max_8,Ng,Ints) 

    write(*,*) "NOW NMAX IS: ", nmax  !Prints '24' 
    coeffs = 0.0d0 
    do i=1,nmax+1 
    do j=1,nmax+1 
     do k=1,nmax+1 
     coeffs(i,j,k) = 0.d0 
     write(*,*) coeffs(i,j,k) !Prints 0.0000000000000000 for all i,j,k 
     end do 
    end do 
    end do 

    write(*,*) coeffs(1,3,28)    !Prints a non-zero number 
    coeffs(1,3,28) = 0.0d0 
    write(*,*) coeffs(1,3,28)    !Prints 0.0000000000000000 

    do k=1,nmax+1 
    i=1 
    j=1 
    if (i+j+k .GT. nmax+1)then 
      exit 
    end if 
    do j=1,nmax+1 
     i=1 
     if (i+j+k .GT. nmax+1)then 
      exit 
     end if 
     do i=1,nmax+1 
     if (i+j+k .GT. nmax+1)then 
      exit 
     end if 
     do kk=1,Ng 
      do jj = 1,Ng 
      do ii = 1,Ng 
       coeffs(i,j,k) = coeffs(i,j,k) + & 
       & f(ii,jj,kk)*Ints(ii,i)*Ints(jj,j)*Ints(kk,k) 
       if(i==1.AND.j==3.AND.k==28)then 
        if (kk==1) then 
        write(*,*) coeffs(i,j,k) 
        end if 
       end if 
      end do 
      end do 
     end do 
     end do 
    end do 
    end do 
    write(*,*) coeffs(1,3,28)   !Prints 0.0000000000000000 
end subroutine 

有沒有人有任何想法? 謝謝。

+3

顯示分配數組的代碼。 –

+2

你確定你試圖寫出的元素實際上在數組的範圍內,即索引不是太小或太大? – pafcu

+0

向我們展示輸出值的代碼,'0.4xxx'是一個非常奇特的輸出形式。 –

回答

2

您是否知道可以使用單個語句初始化整個數組?

coeffs = 0.0d 

將在陣列中的所有元素設置爲0。

+1

你真的讀過代碼嗎?特別是第十行? –

+0

@Jerome - 我知道這一點 - 你會注意到我在第10行的代碼中這樣做。特別是,我用兩種不同的方法(單個語句和循環)初始化整個數組,每個方法都不能最終工作。我也初始化了一個單一的元素,但這隻適用於那個元素。由於通常有超過一百萬個元素,所以我沒有手動初始化每個元素的問題。 – StevenMurray

1

對不起,我已經想通了......

,它實際是設置數組爲零,但由於某種原因,我編寫一個不在數組中的元素(超出範圍)。我希望它給我一個錯誤,而不是寫出任何舊的東西,但我想這只是fortran ...

+1

http://linux.die.net/man/1/gfortran 有一些編譯器選項用於邊界檢查。 – bdforbes

相關問題