2017-06-06 2 views
2

Ich versuche, eine Klassenprozedur zu schreiben, die ein neues Zeichen zu einem Array von Zeichen hinzufügt, aber stolpern über "unterschiedliche Zeichenlänge in Array-Konstruktor" -Fehler (kompilieren mit GFortran), auch wenn die Zeichenlängen, soweit ich sehen kann, gleich sind.Hinzufügen zu einem Array von Zeichen in Fortran

Hier ist meine Funktion:

subroutine addToArray(this, newElement) 
    class(MyClass), intent(inout) :: this 
    character(len=*), intent(in) :: newElement 
    character(len=256) :: tempElement 
    character(len=256), dimension(:), allocatable :: temp 

    tempElement = newElement    ! Needed otherwise newElement is of the wrong size 
    allocate(temp(size(this%charArray)+1) ! Make the char array bigger by 1 
    temp = [this%charArray, tempElement] 
    call move_alloc(from=temp, to=this%charArray) 
end subroutine 

Dies führt zu dem Fehler Fortran runtime error: Different CHARACTER lengths (538976288/256) in array constructor. Wenn ich jedoch len(this%charArray) oder len(tempElement) drucke, sind beide 256 Zeichen lang. Wo kommt der 538976288 her?

Ich rufe normalerweise diese Prozedur mit etwas wie myObject%addToArray('hello'). this%charArray wird in der Typdefinition als character(len=256), dimension(:), allocatable :: charArray deklariert und mit allocate(this%charArray(0)) zugewiesen.

+0

Es könnte sich um einen Compiler-Fehler handeln. Welche gfortran Version? Beachten Sie, dass wir die Deklaration der charArray-Komponente von MyClass erraten. Beachten Sie, dass Fortran 2003 erlaubt 'this% charArray = [this% charArray, tmpElement]' – IanH

+0

Es gibt sehr viele Fehler wie diese in verschiedenen Versionen wenn gfortran. Suchen Sie einfach in der Fehlerdatenbank. Eine Möglichkeit, diese Fehler zu begrenzen, besteht darin, eine feste Zeichenlänge zu verwenden. –

+0

GFortran Version 6.30. charArray wird wie folgt deklariert: 'character (len = 256), dimension (:), allocatable :: charArray' und es wird mit' allocate (this% charArray (0)) 'zugewiesen (in Frage erklärt). –

Antwort

0

Es scheint es ist ein Fehler, den ich berichtete vor mehr als einem Jahr auf GCC https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70231

dieses Problem umgehen, mit Optimierungen mindestens -O1 zu kompilieren.

Wenn es sich nicht um denselben Fehler handelt, ist ein genauer Reproduktionsfall erforderlich, einschließlich der Kompilierungsflags und aller relevanten Details.

+0

Danke Vladimir, mit '-O1' wurde der Fehler für mich beseitigt. –

Verwandte Themen