簡體   English   中英

錯誤: (1) 處的 DATA 語句中的類型不兼容; 嘗試將 CHARACTER(1) 轉換為 INTEGER(4)

[英]Error: Incompatible types in DATA statement at (1); attempted conversion of CHARACTER(1) to INTEGER(4)

我正在嘗試運行一些舊的 fortran f77 代碼。 在編譯期間,我收到以下錯誤。 我在 64 位 Ubuntu 14.04 系統上使用 gfortran。

unsteadyf4.f:300.71:

 3      IHOL(13)/'8'/, IHOL(14)/'9'/, IHOL(15)/' '/, IHOL(16)/','/, 
                                                                   1
Error: Incompatible types in DATA statement at (1); attempted conversion of CHARACTER(1) to INTEGER(4) 
unsteadyf4.f:300.56:

 3      IHOL(13)/'8'/, IHOL(14)/'9'/, IHOL(15)/' '/, IHOL(16)/','/, 
                                                    1
Error: Incompatible types in DATA statement at (1); attempted conversion of CHARACTER(1) to INTEGER(4)
unsteadyf4.f:300.41:

 3      IHOL(13)/'8'/, IHOL(14)/'9'/, IHOL(15)/' '/, IHOL(16)/','/, 
                                     1
Error: Incompatible types in DATA statement at (1); attempted conversion of CHARACTER(1) to INTEGER(4)
unsteadyf4.f:300.26:

 3      IHOL(13)/'8'/, IHOL(14)/'9'/, IHOL(15)/' '/, IHOL(16)/','/, 
                      1
Error: Incompatible types in DATA statement at (1); attempted conversion of CHARACTER(1) to INTEGER(4)
unsteadyf4.f:299.71:

 2      IHOL( 9)/'4'/, IHOL(10)/'5'/, IHOL(11)/'6'/, IHOL(12)/'7'/, 
                                                                   1
Error: Incompatible types in DATA statement at (1); attempted conversion of CHARACTER(1) to INTEGER(4)
unsteadyf4.f:299.56:

 2      IHOL( 9)/'4'/, IHOL(10)/'5'/, IHOL(11)/'6'/, IHOL(12)/'7'/, 
                                                    1
Error: Incompatible types in DATA statement at (1); attempted conversion of CHARACTER(1) to INTEGER(4)
unsteadyf4.f:299.41:

 2      IHOL( 9)/'4'/, IHOL(10)/'5'/, IHOL(11)/'6'/, IHOL(12)/'7'/, 
                                     1
Error: Incompatible types in DATA statement at (1); attempted conversion of CHARACTER(1) to INTEGER(4)
unsteadyf4.f:299.26:

 2      IHOL( 9)/'4'/, IHOL(10)/'5'/, IHOL(11)/'6'/, IHOL(12)/'7'/, 
                      1
Error: Incompatible types in DATA statement at (1); attempted conversion of CHARACTER(1) to INTEGER(4)
unsteadyf4.f:298.70:

 1      IHOL(5)/'0'/, IHOL( 6)/'1'/, IHOL( 7)/'2'/, IHOL( 8)/'3'/,  
                                                                  1
Error: Incompatible types in DATA statement at (1); attempted conversion of CHARACTER(1) to INTEGER(4)
unsteadyf4.f:298.55:

 1      IHOL(5)/'0'/, IHOL( 6)/'1'/, IHOL( 7)/'2'/, IHOL( 8)/'3'/,  
                                                   1
Error: Incompatible types in DATA statement at (1); attempted conversion of CHARACTER(1) to INTEGER(4)
unsteadyf4.f:298.40:

 1      IHOL(5)/'0'/, IHOL( 6)/'1'/, IHOL( 7)/'2'/, IHOL( 8)/'3'/,  
                                    1
Error: Incompatible types in DATA statement at (1); attempted conversion of CHARACTER(1) to INTEGER(4)
unsteadyf4.f:298.25:

 1      IHOL(5)/'0'/, IHOL( 6)/'1'/, IHOL( 7)/'2'/, IHOL( 8)/'3'/,  
                     1
Error: Incompatible types in DATA statement at (1); attempted conversion of CHARACTER(1) to INTEGER(4)
unsteadyf4.f:297.71:

  DATA  IHOL( 1)/'+'/, IHOL( 2)/'-'/, IHOL( 3)/'.'/, IHOL( 4)/'E'/, 
                                                                   1
Error: Incompatible types in DATA statement at (1); attempted conversion of CHARACTER(1) to INTEGER(4)
unsteadyf4.f:297.56:

  DATA  IHOL( 1)/'+'/, IHOL( 2)/'-'/, IHOL( 3)/'.'/, IHOL( 4)/'E'/, 
                                                    1
Error: Incompatible types in DATA statement at (1); attempted conversion of CHARACTER(1) to INTEGER(4)
unsteadyf4.f:297.41:

  DATA  IHOL( 1)/'+'/, IHOL( 2)/'-'/, IHOL( 3)/'.'/, IHOL( 4)/'E'/, 
                                     1
Error: Incompatible types in DATA statement at (1); attempted conversion of CHARACTER(1) to INTEGER(4)
unsteadyf4.f:297.26:

  DATA  IHOL( 1)/'+'/, IHOL( 2)/'-'/, IHOL( 3)/'.'/, IHOL( 4)/'E'/, 
                      1
Error: Incompatible types in DATA statement at (1); attempted conversion of CHARACTER(1) to INTEGER(4)
unsteadyf4.f:297.10:

  DATA  IHOL( 1)/'+'/, IHOL( 2)/'-'/, IHOL( 3)/'.'/, IHOL( 4)/'E'/, 
      1
Error: Incompatible types in DATA statement at (1); attempted conversion of CHARACTER(1) to INTEGER(4)

所有錯誤都是從代碼的以下部分生成的。

    SUBROUTINE INTCOD (IS,NC,ICODE,NERR)
    IMPLICIT DOUBLE PRECISION (A-H,O-Z)
    DIMENSION IS(*),ICODE(*),IHOL(18)
    DATA NSYMB/18/
    DATA  IHOL( 1)/'+'/, IHOL( 2)/'-'/, IHOL( 3)/'.'/, IHOL( 4)/'E'/,
   1      IHOL(5)/'0'/, IHOL( 6)/'1'/, IHOL( 7)/'2'/, IHOL( 8)/'3'/,
   2      IHOL( 9)/'4'/, IHOL(10)/'5'/, IHOL(11)/'6'/, IHOL(12)/'7'/,
   3      IHOL(13)/'8'/, IHOL(14)/'9'/, IHOL(15)/' '/, IHOL(16)/','/,
   4      IHOL(17)/'('/
    NERR = NERR
    DO 200 I=1,NC
    DO 100 J=1,NSYMB
    IF (IS(I) .NE. IHOL(J)) GO TO 100
    ICODE(I)=J
    GO TO 200
100 CONTINUE
    ICODE(I) = 99

我搜索了類似的錯誤, link-1link-2 ,並將DIMENSION IS(*),ICODE(*),IHOL(18)行編輯為DIMENSION IS(*),ICODE(*),4HIHOL(18)

現在我收到以下錯誤,

unsteadyf4.f:295.32:
    DIMENSION IS(*),ICODE(*),4HIHOL(18)                               
                            1
Error: Invalid character in name at (1)
unsteadyf4.f:297.16:
    DATA  IHOL( 1)/'+'/, IHOL( 2)/'-'/, IHOL( 3)/'.'/, IHOL( 4)/'E'/, 
            1
Error: Syntax error in DATA statement at (1)
unsteadyf4.f:306.6:

    ICODE(I)=J                                                        
    1
Error: Unclassifiable statement at (1)
unsteadyf4.f:309.6:

    ICODE(I) = 99                                                     
    1
Error: Unclassifiable statement at (1)

對不起,很長的帖子,我知道最小的復制示例,但是代碼非常大,很難簡化。

任何幫助,將不勝感激。

在 integer 變量中存儲“字符”數據(並進行相應操作)在 Fortran 77 或任何更高版本中無效。 但是,它是編譯器提供的通用擴展。

使用類似的代碼

  integer i
  data i/'a'/

end program

您將需要使用支持該非標准形式的編譯器。 您使用的編譯器沒有(至少不是您使用的選項)。

如果您不更改編譯器(或其選項),您將需要更改您的代碼。

如何更改代碼取決於代碼的 rest。 You can change the DATA statement so that integer values are provided to the integer variable (although note that the form DATA IHOL( 1)/iachar('+')/ in Vladimir F's answer is no more allowed by the Fortran standards and perhaps fewer編譯器接受它作為非標准擴展),或者您可以將給定字符值的變量更改為字符。 無論哪種方式,您都極有可能需要更改代碼的其他部分。

孩子們:非標准擴展並不酷。

我們無法看到這些數據到底做了什么。 我們甚至看不到確切的數據類型(字節寬度)。 但是,如果您需要將字符數據存儲為 integer 值,則必須使用轉換,如ichar()iachar()

DATA  IHOL( 1)/iachar('+')/, IHOL( 2)/iachar('-')/, IHOL( 3)/iachar('.')/, IHOL( 4)/iachar('E')/,

DATA語句的要求更嚴格,因此這些 function 表達式不允許在DATA語句中。

您可以改用數組構造函數。 這是 Fortran 90 或 2003 功能,但這在 2022 年並不重要。

INTEGER, DIMENSION(18) :: IHOL = iachar(['+','-','.','-',  ... ])

您可能需要不同的 integer 類型,即 1 字節長。 與否,我們不知道您的代碼示例太短。 或者,如果您的代碼中使用了INTEGER*1語法,作為快速修復,您也可以在此處使用它。

當然不要將IHOL重命名為4HIHOL ,這既非法又毫無意義。 在嘗試某些答案之前,請始終嘗試了解它的作用。 這些 Hollerith 常量用於表達式而不是字符串,因此它們出現在賦值的右側。 4HIHOL 用於將字符“IHOL”分配給某些 integer。

也可能有一種方法如何使用字符串進行初始化,例如在隱含的 do 中。 或者也許可以在運行時設置該值。 我們確實沒有看到足夠的上下文,您顯示的代碼太不完整。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM