2017-03-03 3 views
0

Ich versuche ein Programm zu schreiben, das viele andere if-Anweisungen enthält. Ich kann jedoch nicht verstehen, woher dieser Fehler kommt. Jede Hilfe wäre willkommen.Unerwarteter Müll nach else-Anweisung: (i == 1 .AND. 1 <j <L)

Unten ist der Block, wenn ich derzeit haben:

if (i == 1 .AND. j==1) then 
     E = E + A(i+1,j) + A(i,j+1) + A(L,j) + A(i,L) 

    else if (i == 1 .AND. j==L) then 
     E = E + A(i,j-1) + A(i+1,j) + A(i,1) + A(L,j) 

    else if (i == L .AND. j == 1) then 
     E = E + A(i,j+1) + A(i-1,j) + A(1,j) + A(i,L) 

    else if (i == L .AND. j == L) then 
     E = E + A(i,j-1) + A(i-1,j) + A(1,j) + A(i,1) 

    else if (i == 1 .AND. 1 < j < L) then 
     E = E + A(i+1,j) + A(i,j+1) + A(i,j-1) + A(L,j) 

    else if (i == L .AND. 1 < j < L) then 
     E = E + A(i-1,j) + A(i,j+1) + A(i,j-1) + A(1,j) 

    else if (1 < i < L .AND. j == 1) then 
     E = E + A(i-1,j) + A(i+1,j) + A(i,j+1) + A(i,L) 

    else if (1 < i < L .AND. j == L) then 
     E = E + A(i-1,j) + A(i+1,j) + A(i,j-1) + A(i,1) 
    else 
     E = E + A(i-1,j) + A(i+1,j) + A(i,j-1) + A(i,j+1) 
    end if 

Der Fehler, ist kommen immer wieder:

Ising.f90:56:15: 

    else if (i == 1 .AND. 1 < j < L) then 
      1 
Error: Unexpected junk after ELSE statement at (1) 
Ising.f90:59:15: 

    else if (i == L .AND. 1 < j < L) then 
      1 
Error: Unexpected junk after ELSE statement at (1) 
Ising.f90:62:15: 

    else if (1 < i < L .AND. j == 1) then 
      1 
Error: Unexpected junk after ELSE statement at (1) 
Ising.f90:65:15: 

    else if (1 < i < L .AND. j == L) then 
      1 
Error: Unexpected junk after ELSE statement at (1) 
+0

Auch passieren, wenn Sie eine Erweiterung verwenden, die einen Vergleich zwischen logischen akzeptiert und integer es doesn‘ Mach was du denkst. Wenn Sie 1 tim18

Antwort

1

Sie können keine Ausdrücke wie 1 < i < L verwenden, um festzustellen, ob i innerhalb der fällt Bereich 1 bis L. Sie müssen den Schnittpunkt von zwei Ungleichheitstests verwenden. Dies wäre ein bisschen leichter auf den Augen so etwas wie

else if (1 < i .AND. i < L .AND. j == L) then

+0

Dies wäre ein bisschen einfacher für die Augen mit SELECTED CASE oder WO und anderswo. Oder mache ich, wenn ich die j-Tests strukturiere und danach eingib. – Holmz

+1

Oder, wenn es wie periodische Randbedingungen aussieht, mache die i- und j-Schleifen, die mit ziemlicher Sicherheit da sind, von 2 nach j und setze die Ausnahmefälle außerhalb der Schleife, einfach unter Umgehung der if/case/was auch immer alles zusammen –

-1

Verwendung mit ausgewähltem Fall oder wo und anderen Ländern. Oder mache ich, wenn ich die j-Tests strukturiere und danach eingib.

, ohne den Rest des Codes zu sehen, kann ich nur vermuten, dass dies zu einem gewissen Interpolation ähnlich sein könnte ...

Etwas, wo man dies auf einer einzigen Mathe-Anweisung Linie tun könnte, wenn das Array wurde indiexed aus (0: n + 1).

+0

Wie geht das? Beantworte die Frage nach dem Fehler? Soll es ein Kommentar sein? Wie würdest du das mit WHERE umschreiben? Ich habe viel Zeit damit verbracht, das zu betrachten, und ich habe immer noch keine Ahnung. Wie können Sie überhaupt wissen, dass das Ergebnis einem Array zugewiesen ist? –

0

@VladimirF Nun, wie ich erwähnte es wie eine Interpolation sieht ...

@Ianbush erwähnt auch einige gute Punkte.

vielleicht ... Es ist etwas glatter/Interpolator?

Glatter Beispiel:

L = UBOUND(OldThing, 1) !assumes it is square! 
ALLOCATE(newthing(0:L+1, 0:L+1)) 
DO I = 1, L 
    DO J = 1, L 
    NewThing(I,j) = OldThing(I,j) 
    ENDDO 
ENDDO 

! Probably a derivative to extrapolate the outliers is better... 
! Kindergarten example below is for simplicity. 
DO I= 1, L 
    NewThing(0,(I))= OldThing(1,I) 
    NewThing(0,(I))= OldThing(1,I) 
    NewThing(0,(I))= OldThing(1,I) 
    NewThing(0,(I))= OldThing(1,I) 
ENDDO 

NewThing(0 , 0) = OldThing(1,1) 
NewThing(0, L+1) = OldThing(1,L) 
NewThing(L+1, 0) = OldThing(L,1) 
NewThing(L+1,L+1) = OldThing(L,L) 

!then one is always within the bounds... And the normal case is executed. 
E = E + NewThing(I-1,j) + NewThing(i+1,j) + NewThing(i,j-1) + NewThing(i,j+1) 

Wahrscheinlich eine Rückkehr von NewThing (1: L, 1: L) muss

+0

Bitte posten Sie keine neuen Antworten als Reaktion, Sie können die aktuelle bearbeiten, wenn es sich um das gleiche Thema handelt. Und deine Verwendung von 'WHERE' ist sehr seltsam. 'WHERE' ist für ** Array ** -Ausdrücke. –

Verwandte Themen