Hilfe benötigen Zuordnungsbare Array in Fortran
-
03-07-2019 - |
Frage
Ich habe wirklich Probleme mit Zuordnungsbare Array.
Ich habe alle Informationen aus einer Datei in zuweisbaren Array kopieren. Die Datei ist wie folgt:
3
3 5
2 1
4 0
3 ist die Anzahl der Punkte andere sechs Zahlen zeigen Punkte auf dem Graphen in (x, y) bilden. So (3,5), (2, 1), (4,0) sind die Punkte. Aber ich habe ein Problem, diese Zahl als ein Paar zu machen.
Ich habe versucht, Code, und hier ist meine Codierung:
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
Dieses Programm funktioniert nicht ... Ich habe einen Fehler:
LocationArray%set1 = LocationArray(x, y)
Error: Can't convert TYPE(location) to INTEGER(4) at (1)
ich müde diesen Fehler, um herauszufinden, aber ich kann nicht Hat jemand einen Rat oder einen Vorschlag über meine Codierung?
Vergib mein Englisch, ich bin Japaner.
Wenn jemand Fragen über meine Frage hat (meine ich mehr Erklärung braucht), lassen Sie es mich wissen.
Danke. Uka
Lösung
In der Definition des Typs Location
, haben Sie gesagt, dass set1, set2 und set3 Integer-Variablen sind, dann versuchen Sie ein Array, um es zuzuweisen. Ich denke, was Sie wollen, da diese Paare sind, ist set1, set2 zu haben, und set3 eine ganze Reihe von Größe 2 sein.
Was passiert, wenn Sie den Location
Typen verändern werden:
TYPE Location
INTEGER, DIMENSION(2) :: set1, set2, set3
INTEGER :: num_locations
END TYPE
Auch die Schleife die Daten zu lesen, macht keinen Sinn für mich. Ich glaube, ich es schreiben würde als (beachten Sie, dass Arrays in Fortran sind 1-basiert standardmäßig nicht auf Null basierende wie in C):
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
Sie werden natürlich müssen etwas tun, wie auch das Ende der Datei Zustand zu erkennen und zu behandeln.
Wenn die Anzahl der Stellen wirklich varaible ist, dann würden Sie brauchen so etwas wie zu tun:
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
Andere Tipps
Sieht aus wie Sie eine ganze Zahl zu geben, den Wert von zwei ganzen Zahlen versuchen. Es ist so etwas wie Sie versuchen, = (oder var = 5,5) zu tun.