Fortran에 할당 가능한 배열이 필요합니다
-
03-07-2019 - |
문제
나는 할당 가능한 배열에 정말로 어려움을 겪고 있습니다.
파일에서 모든 정보를 할당 가능한 배열로 복사해야합니다. 파일은 다음과 같습니다.
3
3 5
2 1
4 0
3은 다른 6 개의 숫자가 (x, y) 형식의 그래프의 점을 보여주는 포인트 수입니다. 따라서 (3,5), (2, 1), (4,0)가 포인트입니다. 그러나 나는이 숫자를 쌍으로 만드는 데 문제가 있습니다.
코딩을 시도했는데 여기에 코딩이 있습니다.
PROGRAM practice
IMPLICIT NONE
INTEGER :: astat, ioStatus
INTEGER :: x, y
INTEGER :: num, code1, code2, code3, code4, code5, code6
! num shows number of location. in this case 3
! code 1 to 6 shows x and y variable. and code1 and 2 have to be paired.
! as well as this, code 3 and 4, code 5 and 6 have to be paired
! Declare TYPE
! set 1 to 3 show pair of (x, y)
TYPE Location
INTEGER :: set1, set2, set3
INTEGER :: num_locations
END TYPE
! Array ()
! for number of locations to visit
TYPE(Location), DIMENSION(:) :: numLocationArray(1000)
! allocatable array
! For locations
TYPE(Location), DIMENSION(:, :) :: LocationArray
ALLOCATABLE :: LocationArray
! allocate LocationArray
ALLOCATE(LocationArray(x, y), STAT = astat)
IF (astat < 0) STOP "allocate failed"
! open input file to copy info into array
OPEN (UNIT = 10, File ="input.txt", STATUS = "OLD", ACTION = "READ", &
IOSTAT = ioStatus)
IF (ioStatus < 0) STOP "open failed"
! format of the file
100 FORMAT (I1, /, 2I2, /, 2I2, / 2I2)
! Do loop to set table
DO x = 0, size(LocationArray), 1
READ (UNIT = 10, FMT = 100, IOSTAT = ioStatus) num, code1, code2, &
code3, code4, code5, code6
! check whether program read file correctly (option)
PRINT *, num, code1, code2, code3, code4, code5, code6
IF (x == code1) THEN
DO y = 0, size(LocationArray), 1
IF (y == code2) THEN
LocationArray%set1 = LocationArray(x, y)
! check whether copied correctly
PRINT *, LocationArray(x, y)
PRINT *, LocationArray%set1
END IF
END DO
END IF
END DO
! ==============
! execution part
! ==============
! instructions:
! use pointer to do excecution
! read allocatable array above
! do excecution (distance) ** do not forget to go back to the original place (0,0)
! ** do not forget to try every single possible way
! when get total distance, do distance times 2 and figure out cost
! print all info (cost, distance, and steps)
! (example of output)
! The minimum cost is 36
! The distance travelled is 18
! Step 1: Start at ( 0, 0)
! Step 2: Goes to ( 2, 1)
! Step 3: Goes to ( 3, 5)
! Step 4: Goes to ( 4, 0)
! Step 5: Ends at ( 0, 0)
END PROGRAM
이 프로그램은 작동하지 않습니다 ... 오류가 있습니다.
LocationArray%set1 = LocationArray(x, y)
Error: Can't convert TYPE(location) to INTEGER(4) at (1)
이 오류를 알아 내기 위해 피곤하지만 코딩에 대한 조언이나 제안을 할 수 없었습니까?
내 영어를 용서하고, 나는 일본어입니다.
누군가 내 질문에 대해 질문이 있다면 (더 많은 설명이 필요하다는 것을 의미합니다) 알려주십시오.
고맙습니다. UKA
해결책
유형의 정의에서 Location
, 당신은 set1, set2 및 set3이 정수 변수라고 말한 다음 배열을 할당하려고 시도했습니다. 나는 당신이 원하는 것은 쌍이기 때문에 set1, set2 및 set3을 크기 2의 정수 배열로 사용하는 것입니다.
당신이 바꾸면 어떻게해야합니까? Location
유형 :
TYPE Location
INTEGER, DIMENSION(2) :: set1, set2, set3
INTEGER :: num_locations
END TYPE
또한 데이터를 읽는 루프는 나에게 의미가 없습니다. 나는 그것을 쓸 것 같다 (Fortran의 배열은 기본적으로 기본적으로 1 기반이며 C에서와 같이 0 기반이 아닌 1 기반입니다.
DO x = 1, size(numLocationArray), 1
READ (UNIT = 10, FMT = 100, IOSTAT = ioStatus) num, code1, code2, &
code3, code4, code5, code6
! check whether program read file correctly (option)
PRINT *, num, code1, code2, code3, code4, code5, code6
numLocationArray(x)%num_locations = num
numLocationArray(x)%set1(0) = code1
numLocationArray(x)%set1(1) = code2
numLocationArray(x)%set2(0) = code3
numLocationArray(x)%set2(1) = code4
numLocationArray(x)%set3(0) = code5
numLocationArray(x)%set3(1) = code6
END DO
파일 조건의 끝을 감지하고 처리하기 위해 무언가를해야합니다.
위치 수가 정말로 다양하다면 다음과 같은 작업을 수행해야합니다.
TYPE Coordinate
INTEGER :: x
INTEGER :: y
END TYPE
TYPE Locations
TYPE(Coordinate), DIMENSION(:), ALLOCATABLE :: location
INTEGER :: num_locations
END TYPE
TYPE(Location), DIMENSION(:) :: numLocationArray(1000)
! open input file to copy info into array
OPEN (UNIT = 10, File ="input.txt", STATUS = "OLD", ACTION = "READ", &
IOSTAT = ioStatus)
IF (ioStatus < 0) STOP "open failed"
! format of the file
100 FORMAT (I1 )
200 FORMAT (2I2)
DO n = 1, size(numLocationArray), 1
READ (UNIT = 10, FMT = 100, IOSTAT = iostatus) num
numLocationArray(n)%num_locations = num
ALLOCATE (numLocationArray(n)%locations(num), STAT = astat)
if (astat < 0) STOP 'allocate failed'
DO l = 1, num, 1
READ (UNIT = 10, FMT = 200, IOSTAT = iostatus) x, y
numLocationArray(n)%locations(l)%x = x
numLocationArray(n)%locations(l)%y = y
END DO
END DO
다른 팁
정수에게 두 정수의 가치를 주려고하는 것 같습니다. 당신이하려고하는 것과 같은 것입니다 = (또는 var = 5,5).