سؤال

وأنا حقا تواجه مشكلة مع مجموعة Allocatable.

ولقد لنسخ جميع المعلومات من ملف إلى مجموعة allocatable. الملف هو من هذا القبيل:

3 
3 5 
2 1 
4 0

و3 هو عدد من النقاط ستة أرقام أخرى تظهر النقاط على الرسم البياني في (س، ص) النموذج. حتى (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

وأيضا حلقة لقراءة البيانات لا معنى له بالنسبة لي. كنت أعتقد أن ذلك بكتابة (لاحظ أن صفائف في فورتران هي على أساس 1 افتراضيا، الصفرية ليس كما في 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

وستحتاج الواضح أن تفعل شيئا لكشف والتعامل مع نهاية حالة ملف كذلك.

وإذا كان عدد من المواقع هو varaible حقا، ثم كنت بحاجة لفعل شيء مثل:

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

نصائح أخرى

ويبدو كما لو كنت تحاول إعطاء صحيحا قيمة عددين. انها شيء من هذا القبيل حاولت القيام = (أو فار = 5،5).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top