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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top