2016-06-19 10 views
1

Ich versuche, ein Unterprogramm zu konstruieren Speicher für einen typunabhängigen zuweisbaren Array wie folgt neu zu verteilen:Typ-unabhängige Speicher Neuzuteilung in Fortran

subroutine reallocate(vector, num) 
implicit none 
class(*), dimension(:), allocatable, intent(inout) :: vector 
integer :: num 

class(*), dimension(:), allocatable :: tmp 
integer :: lb, ub, ii_ 

if (allocated(vector)) then 
    ub = max(ubound(vector, 1), ub) 
    lb = min(lbound(vector, 1), lb) 

    if (ub .GT. ubound(vector, 1) .OR. lb .LT. lbound(vector, 1)) then 
     allocate(tmp(ub:lb), source=vector) 

     tmp(lbound(vector,1):ubound(vector,1)) = vector 

     call move_alloc(tmp, vector) 
    else 
     return 
    end if 
else 
    allocate(vector(num:num), source=vector) 
    return 
end if 

return 
end subroutine 

Zum Beispiel lassen Sie uns sagen, ich habe einen Typ (Typ1), zuweisbaren :: v innerhalb der Indizes -1 und 4 zugewiesen, und ich rufe neu zuweisen (v, 6). Danach möchte ich v zwischen -1 und 6 zugewiesen werden.

So kommt das Problem hier, wenn Vektor bereits zugewiesen ist, und ich möchte die Informationen bereits im Vektor gespeichert, indem Sie es in eine neu neu zugewiesenen temporalen Array kopieren (Zeile, die tmp liest (lbound (Vektor, 1): ubound (Vektor, 1)) = Vektor). gfortran beschwert sich: "Fehler: Nonallocatable Variable darf nicht polymorph in der intrinsischen Zuweisung bei (1) sein - überprüfen, dass es eine passende spezifische Subroutine für '=' Operator gibt."

Ist was ich in Fortran 2003 Standard erlaubt? Was wäre der Weg dies zu tun?

+0

http://stackoverflow.com/q/27165854/577108 könnte auf diese Frage hilfreich sein. – haraldkl

Antwort

0

Es gibt keine Möglichkeit, eine solche Art Agnostiker Neuzuteilung Verfahren in Fortran 2003 oder Fortran 2008

Ihre Optionen sind zu schreiben:

  • Push die, dass die (Wieder-) tun zuteilen Aussagen Zuordnung, Sicherung in den Bereich, in dem der Typ bekannt ist, Code für jede Neuzuweisung effektiv wiederholen;

  • explizit die Reallokation für jeden Typ von Interesse neu schreiben; oder

  • Schreiben Sie den Quellcode für die Neuzuweisung einmal generisch, aber verwenden Sie dann INCLUDE-Tricks oder ähnliches, um die Prozedur für jede Art von Interesse explizit zu instanziieren.

CLASS (*) ist normalerweise nicht als generische Programmiereinrichtung geeignet. Selbst wenn es möglich ist, den Körper dieses Verfahrens zu schreiben, ist es unmöglich, zweckdienlich zu nennen.

(Beachten Sie, dass der Beispielcode Referenzen undefiniert und möglicherweise nicht zugewiesenen Variablen gezeigt.)

+0

Tatsächlich war die Unmöglichkeit, das Unterprogramm mit allgemeinen Klassen (*) - Argumenten aufzurufen, etwas, worüber ich nicht nachgedacht hatte. Letztlich habe ich die Probleme gelöst, indem ich die Prozedur für alle Datentypen, die neu zugewiesen werden können, überlastet habe. – jip