dbx コマンドによるデバッグ

配列の操作

dbx が配列を認識し、配列を出力します。

Arraysdbx.f


demo% dbx a.out
a.out の読み込み中
ld.so.1 の読み込み中
 ......
(dbx) list
    2              DO 90 I = 1,4
    3                      DO 20 J = 1,4
    4                              IARR(I,J) = (I*10) + J
    5      20              CONTINUE
    6      90      CONTINUE
    7              END
(dbx) stop at 7
(2) stop at "Arraysdbx.f":7
(dbx) run
実行中: a.out
(プロセス id 23495)
mb.so.1 の読み込み中
wcwidth.so.1 の読み込み中
MAIN で停止しました 行番号 7  ファイル "Arraysdbx.f"
    7              END
(dbx) print IARR
iarr =
    (1,1)       11
    (2,1)       21
    (3,1)       31
    (4,1)       41
    (1,2)       12
    (2,2)       22
    (3,2)       32
    (4,2)       42
    (1,3)       13
    (2,3)       23
    (3,3)       33
    (4,3)       43
    (1,4)       14
    (2,4)       24
    (3,4)       34
    (4,4)       44
(dbx) print IARR(2,3)
iarr(2, 3) = 23
(dbx) quit

Fortran 90 割り当て可能配列

次の例は、dbx で割り当て済み配列を処理する方法を示しています。


demo% f90 -g Alloc.f90
demo% dbx a.out
a.out の読み込み中
ld.so.1 の読み込み中
  ......   (注 1)
(dbx) list 1,$
    1   PROGRAM TestAlocate
    2   INTEGER n, status
    3   INTEGER, ALLOCATABLE :: buffer(:)
    4           PRINT *, `Size?'
    5           READ *, n
    6           ALLOCATE (buffer(n), STAT=status)
    7           IF (status /= 0) STOP `cannot allocate buffer'
    8           buffer(n)=n
    9           PRINT *,buffer(n)
   10           DEALLOCATE (buffer, STAT = status)
   11   END
(dbx) stop at 6
(2) stop at "Alloc.f90":6
(dbx) stop at 9
(3) stop at "Alloc.f90":9
(dbx) run
実行中: a.out
(プロセス id 23512)
 Size?
1000
MAIN で停止しました 行番号 6  ファイル "Alloc.f90"  (注 2)
    6           ALLOCATE (buffer(n), STAT=status)
(dbx) whatis buffer
INTEGER*4 , allocatable::buffer(:)
(dbx) next
MAIN で停止しました 行番号 7  ファイル "Alloc.f90"
    7           IF (status /= 0) STOP `cannot allocate buffer'
(dbx) whatis buffer
INTEGER*4  buffer(1:1000)
(dbx) cont
MAIN で停止しました 行番号 9  ファイル "Alloc.f90"  (注 3)
    9           PRINT *,buffer(n)
(dbx) print n
n = 1000
(dbx) print buffer(n)
buffer(n) = 1000   (注 4)

注 1: Alloc.f90

注 2: 行番号 6 ではサイズは未知

注 3: 行番号 9 ではサイズは未知

注 4: buffer (1000)

配列のスライス

Fortran 配列スライスの構文は次のとおりです。


print arr-exp(first-exp
:last-exp:stride-exp
)

表 17-1 配列スライスの変数

変数 

説明 

デフォルト 

arr-exp

1 つの配列型に評価される式 

 

first-exp

出力される最初の要素 

配列の下限 

last-exp

出力される最後の要素 

配列の上限 

stride-exp

刻み幅 

行と列を指定します。


demo% f77 -g -silent ShoSli.f
demo% dbx a.out
a.out の読み込み中
ld.so.1 の読み込み中
  ......
(dbx) list 1,12
    1                integer*4  A(3,4), col, row
    2                do row = 1,3
    3                   do col = 1,4
    4                        A(row,col) = (row*10) + col
    5                   end do
    6                end do
    7                do row = 1, 3
    8                write(*,'(4I3)') (A(row,col),col=1,4)
    9                end do
   10                end
(dbx) stop at 7
(2) stop at "ShoSli.f":7
(dbx) run
実行中: a.out
(プロセス id 23521)
mb.so.1 の読み込み中
wcwidth.so.1 の読み込み中
MAIN で停止しました 行番号 7  ファイル "ShoSli.f"
    7                           do row = 1, 3
(dbx)

行 3 を出力


(dbx) print a(3:3,1:4)
a(3:3, 1:4) = 
       (3,1)   31 
       (3,2)   32 
       (3,3)   33 
       (3,4)   34
(dbx)

列 4 を出力


(dbx) print a(1:3,4:4)
a(3:3, 1:4) = 
       (1,4)   14 
       (2,4)   24 
       (3,4)   34
(dbx)