Advertisement
Guest User

Untitled

a guest
Mar 15th, 2024
16
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2.  
  3.     program main
  4.         type intt
  5.             integer, pointer :: int
  6.         end type intt
  7.         type ptrt
  8.             class(*), pointer :: ptr
  9.         end type ptrt
  10.  
  11.         type len1t(n_01)
  12.             integer, len :: n_01 = transfer("A", 1_1)
  13.             character(8) :: p = "start"
  14.             character(n_01) :: c_01
  15.             character(8) :: end = "end"
  16.         end type len1t
  17.  
  18.         type len2t(n_01, n_02)
  19.             integer, len :: n_01 = transfer("A", 1_1)
  20.             integer, len :: n_02 = transfer("B", 1_1)
  21.             character(8) :: p = "start"
  22.             character(n_01) :: c_01
  23.             character(n_02) :: c_02
  24.             character(8) :: end = "end"
  25.         end type len2t
  26.  
  27.         type len3t(n_01, n_02, n_03)
  28.             integer, len :: n_01 = transfer("A", 1_1)
  29.             integer, len :: n_02 = transfer("B", 1_1)
  30.             integer, len :: n_03 = transfer("C", 1_1)
  31.             character(8) :: p = "start"
  32.             character(n_01) :: c_01
  33.             character(n_02) :: c_02
  34.             character(n_03) :: c_03
  35.             character(8) :: end = "end"
  36.         end type len3t
  37.  
  38.         type(intt) intval
  39.         type(ptrt) ptrval
  40.         type(len1t), TARGET :: len1val
  41.         type(len2t), TARGET :: len2val
  42.         type(len3t), TARGET :: len3val
  43.         integer, target :: a
  44.         a = transfer("abcd", 1)
  45.         intval%int => a
  46.         ptrval%ptr => len3val
  47.         len1val%c_01 = 'aAaA'
  48.         len2val%c_01 = 'aAaA'
  49.         len2val%c_02 = 'bBbB'
  50.         len3val%c_01 = 'aAaA'
  51.         len3val%c_02 = 'bBbB'
  52.         len3val%c_03 = 'cCcC'
  53.  
  54.  
  55.         print '("type(intt)  size: ",I0)' ,sizeof(intval)
  56.         print '("type(ptrt)  size: ",I0)', sizeof(ptrval)
  57.         print '("type(len1t) size: ",I0)', sizeof(len1val)
  58.         print '("type(len2t) size: ",I0)', sizeof(len2val)
  59.         print '("type(len3t) size: ",I0)', sizeof(len3val)
  60.  
  61.         print '(/"type(intt)  bin dump (@ indicates zero byte):")'
  62.         CALL dumpBinary(intval)
  63.         print '(/"type(ptrt)  bin dump (@ indicates zero byte):")'
  64.         CALL dumpBinary(ptrval)
  65.         print '(/"type(len1t) bin dump (@ indicates zero byte):")'
  66.         CALL dumpBinary(len1val)
  67.         print '(/"type(len2t) bin dump (@ indicates zero byte):")'
  68.         CALL dumpBinary(len2val)
  69.         print '(/"type(len3t) bin dump (@ indicates zero byte):")'
  70.         CALL dumpBinary(len3val)
  71.  
  72.     contains
  73.  
  74.         subroutine dumpBinary(val)
  75.             class(*), intent(in) :: val
  76.             character(1) :: bytes(sizeof(val)/sizeof("."))
  77.             integer :: index, nRows, iStart, iStop
  78.             integer, parameter :: nCols = 16
  79.  
  80.             bytes(:) = transfer(val, ".", sizeof(val)/sizeof("."))
  81.             nRows = (size(bytes)+nCols-1)/nCols
  82.             do iStart = 1, size(bytes), nCols
  83.                 iStop = iStart + nCols - 1
  84.                 write(*, '(I3.3,"-",I3.3,2x)', advance='no') iStart, iStop
  85.                 do index = iStart, iStop
  86.                     if(index .le. size(bytes)) then
  87.                         write(*, '(1x, Z2.2)', advance='no') bytes(index)
  88.                     else
  89.                         write(*, '(3x)', advance='no')
  90.                     end if
  91.                 end do
  92.                 write(*, '(2x)', advance='no')
  93.                 do index = iStart, iStop
  94.                     if(index .le. size(bytes)) then
  95.                         ! Restrict character output to printable characters.
  96.                         if(bytes(index) .ge. " " .and. bytes(index) .le. "~") then
  97.                             write(*, '(A)', advance='no') bytes(index)
  98.                         else if (bytes(index) .eq. (transfer(0, "."))) then
  99.                             write(*, '("@")', advance='no')
  100.                         else
  101.                             write(*, '(".")', advance='no')
  102.                         end if
  103.                     else
  104.                         write(*, '(1x)', advance='no')
  105.                     end if
  106.                 end do
  107.                 write(*,'("")')
  108.             end do
  109.  
  110.         end subroutine dumpBinary
  111.  
  112.     end program main
  113.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement