/ Home / software / in_Fortran /

  •  [Go Up]
  •  callbacks.f90
  •  compile
  •  recursion.f90

in Fortran

Fortran Überblick

Dateinamen

Die Namen der Quellcode-Dateien sollten in .f90 enden.

Programmskelett

PROGRAM xyz
  IMPLICIT NONE
  ...
END
... hier kann was stehen, dass NICHT ignoriert wird O_o

Kommentare

! Bis zum Ende der Zeile ignoriert

Kompilation

gfortran -o thing thing.f90
gfortran -o thing thing.f90 -lkernlib -lmathlib

Intrinsische Datentypen

REAL
DOUBLE PRECISION
INTEGER
CHARACTER
LOGICAL

Intrinsische Konstanten

.TRUE.
.FALSE.

Intrinsische Operatoren

+
-
*
/
**
.EQ.
.NE.
.LT.
.LE.
.GT.
.GE.
.EQV.
.NEQV.
.OR.
.AND.
.NOT.

Intrinsische Funktionen

ABS, IABS, SIN, COS, TAN, EXP, LOG, ASIN, ACOS, ATAN, SQRT, NINT, MIN, MAX, AMAX1, AMAX0, MAX0, MAX1, AMIN1, AMIN0, MIN0, MIN1

Eigene Konstanten definieren

PARAMETER (PI=3.141592d0)

Konditional

IF (2 .EQ. 3) THEN
  PRINT *, "the world is ending"
ELSE IF (3 .EQ. 3) THEN
  PRINT *, "everything alright"
ELSE
  PRINT *, "what did you expect?"
END IF
SELECT CASE (i)
  CASE default
    ...
  CASE (1:5)
    ...
  CASE (7)
    ...
END SELECT

Assignabledefinition

INTEGER x
INTEGER :: x

Assigning

x = 5
x = 3
x = 42

Die Schachtel x enthält am Ende 42.

Funktionen

PURE FUNCTION f(x) RESULT (result)
  IMPLICIT NONE
  DOUBLE PRECISION, INTENT(in) :: x
  DOUBLE PRECISION :: result
  result = 42d0
END

Rekursion

RECURSIVE PURE FUNCTION fac(n) RESULT (result)
  IMPLICIT NONE
  INTEGER, INTENT(in) :: n
  INTEGER :: result
  IF (n .EQ. 0) THEN
     result = 1
  ELSE
     result = n*fac(n - 1)
  END IF
END
PROGRAM f
  INTEGER r
  INTEGER fac
  r = fac(10)
  WRITE(*,*) r
END

Subroutinen

SUBROUTINE doStuff(x, y, z)
  IMPLICIT NONE
  REAL x
  REAL y
  REAL z
  READ(*,*) x, y, z
  RETURN
END
PROGRAM f
  REAL a
  REAL b
  REAL c
  CALL doStuff(a, b, c)
END

Funktionale

PROGRAM a
  IMPLICIT NONE
  EXTERNAL f
  EXTERNAL g
  DOUBLE PRECISION f
  DOUBLE PRECISION g
  DOUBLE PRECISION b
  ! Funktional g bekommt f übergeben.
  b = g(f)
  WRITE(*,*) b
END
FUNCTION f(x) RESULT (result)
  IMPLICIT NONE
  DOUBLE PRECISION :: x
  DOUBLE PRECISION :: result
  result = 2.4d0
END
FUNCTION g(callback) RESULT (result)
  IMPLICIT NONE
  DOUBLE PRECISION result
  ! gibt die Schnittstelle (den Prototyp) für callback an:
  INTERFACE
    FUNCTION callback(x)
      DOUBLE PRECISION :: callback
      DOUBLE PRECISION :: x
    END
  END INTERFACE
  result = callback(2.0d0)
END

I/O

Spezielle Nummern, genannt I/O-Channels, repräsentieren die Verbindung zum Zielgerät

* ist der Default Channel

WRITE(*,*) "hello", 42
PRINT *, 42, 43
OPEN(11, FILE="bli", STATUS='REPLACE')
WRITE(11,*) 42
CLOSE(11)
READ(*,*) v

FORMAT existiert.

Operator Precedence

  1. ()
  2. **
  3. * /
  4. + -
  5. .EQ. .NE. .LT. .LE. .GT. .GE.
  6. .NOT.
  7. .AND.
  8. .OR.
  9. .EQV. .NEQV.

Arrays

INTEGER values(5) ! Index fängt bei 1 an
INTEGER values(0:10) ! Endindex INKLUSIVE
DATA values/5,4,3,2,1/

Arrayfilter

SUM(c, mask=c .GT. 0)

Fixgröße-Datentypen

INTEGER*8 ist ein Integer, der 8 Byte groß ist (wenn möglich).

Records

type Student
   character*20 last_name
   character*16 first_name
   character*6 comp_id
   integer id
   real score
   character*2 grade
end type
type (Student) cs(100)
cs(55) = Student('a', 'b', 'c', 2, 1.2, 'A')
cs(i)%score

Modulsystem

MODULE 
END MODULE
USE things

Typkonversion

INT(x)
REAL(x)
DBLE(x)
CMPLX(x,y)

Schleifen

DO WHILE (i .LE. 10)
  ...
END DO
DO i=0,10,1 ! der Endindex 10 ist komischerweise INKLUSIVE.
  ...
  EXIT
  ...
  CYCLE
END DO

Author: Danny (remove the ".nospam" to send)

Last modification on: Sat, 04 May 2024 .