sotos_ubu έγραψε:Και εγώ στο πανεπιστήμιο διδάχθηκα στο πρώτο εξάμηνο Fortran και στο δεύτερο C. Θυμάμαι ότι ο καθηγητής στο μάθημα αλλά και οι διδακτορικοί φοιτητές στο εργαστήριο (στα πρώτα μαθήματα) μας εξήγησαν τι είναι και τι κάνουν ακριβώς αυτά (compiler, linker, IDE, πρότυπα της Fortran). Απλά το αναφέρω επειδή διαβάζοντας αυτό το θέμα, μου δημιουργήθηκε μια αίσθηση μηδενισμού κάποιων καταστάσεων..
Off topic:Φυσικά προσωπικές εμπειρίες περιγράφω. Απλά είμαι λιγάκι απογοητευμένος με την ελληνική εκπαίδευση. Τουλάχιστον προσπαθώ να τη διορθώση με τον τρόπο μου (δες στο link που έδωσα παραπάνω) Και λίγη εποικοδομητική κριτική δε βλάπτει. Και μιας και λέμε για εποικοδομητική ριξτε μια ματιά σ'αυτό όσοι ενδιαφέρονται για fortran: Στη fortran 90/95 υποστηρίζονται δομές ή νέοι τύποι δεδομένων και υπερφόρτωση τελεστών. Ας δούμε μια απλή εφαρμογή τους. Από quaternions πώς τα πάμε; Quaternions είναι η επέκταση των μιγαδικών στις 4 διαστάσεις (Σημείωση ότι δεν ορίζονται τριαδικοί αριθμοί όσο κι αν προσπάθησε ο καημένος ο Hamilton) Επίσης οι τετραδικοί αριθμοί δεν είναι αντιμεταθετικοί! Για περισσότερες λεπτομέρειες σχετικά με το πώς ορίζονται οι πράξεις μπορείτε να βρείτε εδώ 
http://en.wikipedia.org/wiki/Quaternion Οι τετραδικοί αριθμοί όσο παράξενοι κι αν φαίνεται κάνουν τις περιστροφές στις 3 διαστάσεις πολύ πιο γρήγορα απ'ότι οι γωνίες Euler (logari81, αυτό ίσως είναι για σένα. Μια συνάδελφος τους εφάρμοσε στις περιστροφές του πλέγματός της.)
Επί της ουσίας. Ένα μικρό παράδειγμα που μας επιτρέπει να γράψουμε q = w + v, όπου όλοι είναι τετραδικοί. Το module που κάνει τη δουλειά:
- Κώδικας: Επιλογή όλων
  module structure
 implicit none
	
	intrinsic :: conjg, abs
	
	private
	public :: quaternion_print
	public :: operator(+), operator(-), operator(*)
	public :: conjg, abs
!###########################################################################################################
	
	type, public :: quaternion
		real(8) :: t
		real(8) :: x
		real(8) :: y
		real(8) :: z
	end type quaternion
!###########################################################################################################
	interface operator(+)
		module procedure quat_add, quat_integer_add, quat_real_add, quat_real8_add
	end interface
	interface operator(-)
		module procedure quat_subt
	end interface
	
	interface operator(*)
		module procedure quat_integer_left_mult, quat_real_left_mult, quat_real8_left_mult, &
						quat_integer_right_mult, quat_real_right_mult, quat_real8_right_mult, &
						quat_mult
	end interface
	
	interface conjg
		module procedure quat_conjg
	end interface
	
	interface abs
		module procedure quat_abs
	end interface
!###########################################################################################################
 contains
!###########################################################################################################
	subroutine quaternion_print(q)
		type(quaternion), intent(in) :: q
		real :: tp, xp, yp, zp
		tp = q % t
		xp = q % x
		yp = q % y
		zp = q % z
		print "(a1, 4f32.12, a1)", "(", tp, xp, yp, zp, ")"
		print *
	end subroutine quaternion_print
!###########################################################################################################
	type(quaternion) function quat_add(a,b) result (res)
		type(quaternion), intent(in) :: a, b
		!type(quaternion) :: res
		res % t = a % t + b % t
		res % x = a % x + b % x
		res % y = a % y + b % y
		res % z = a % z + b % z
	end function quat_add
	
	type(quaternion) function quat_integer_add(i,q) result (res)
		integer, intent(in) :: i
		type(quaternion), intent(in) :: q
		!type(quaternion) :: res
		res % t = q % t + i
		res % x = q % x 
		res % y = q % y 
		res % z = q % z 
	end function quat_integer_add
	
	type(quaternion) function quat_real_add(r,q) result (res)
		real, intent(in) :: r
		type(quaternion), intent(in) :: q
		!type(quaternion) :: res
		res % t = q % t + r
		res % x = q % x 
		res % y = q % y 
		res % z = q % z 
	end function quat_real_add
	
	type(quaternion) function quat_real8_add(r,q) result (res)
		real(8), intent(in) :: r
		type(quaternion), intent(in) :: q
		!type(quaternion) :: res
		res % t = q % t + r
		res % x = q % x 
		res % y = q % y 
		res % z = q % z 
	end function quat_real8_add
!###########################################################################################################
	type(quaternion) function quat_subt(a,b) result (res)
		type(quaternion), intent(in) :: a, b
		!type(quaternion) :: res
		res % t = a % t - b % t
		res % x = a % x - b % x
		res % y = a % y - b % y
		res % z = a % z - b % z
	end function quat_subt
!###########################################################################################################
	
	type(quaternion) function quat_integer_left_mult(r,a) result (res)
		integer, intent(in) :: r
		type(quaternion), intent(in) :: a
		!type(quaternion) :: res
		res % t = r * a % t
		res % x = r * a % x
		res % y = r * a % y
		res % z = r * a % z
	end function quat_integer_left_mult
	
	type(quaternion) function quat_real_left_mult(r,a) result (res)
		real, intent(in) :: r
		type(quaternion), intent(in) :: a
		!type(quaternion) :: res
		res % t = r * a % t
		res % x = r * a % x
		res % y = r * a % y
		res % z = r * a % z
	end function quat_real_left_mult	
	type(quaternion) function quat_real8_left_mult(r,a) result (res)
		real(8), intent(in) :: r
		type(quaternion), intent(in) :: a
		!type(quaternion) :: res
		res % t = r * a % t
		res % x = r * a % x
		res % y = r * a % y
		res % z = r * a % z
	end function quat_real8_left_mult		
	type(quaternion) function quat_integer_right_mult(a,r) result (res)
		integer, intent(in) :: r
		type(quaternion), intent(in) :: a
		!type(quaternion) :: res
		res % t = r * a % t
		res % x = r * a % x
		res % y = r * a % y
		res % z = r * a % z
	end function quat_integer_right_mult
		
	type(quaternion) function quat_real_right_mult(a,r) result (res)
		real, intent(in) :: r
		type(quaternion), intent(in) :: a
		!type(quaternion) :: res
		res % t = r * a % t
		res % x = r * a % x
		res % y = r * a % y
		res % z = r * a % z
	end function quat_real_right_mult	
	type(quaternion) function quat_real8_right_mult(a,r) result (res)
		real(8), intent(in) :: r
		type(quaternion), intent(in) :: a
		!type(quaternion) :: res
		res % t = r * a % t
		res % x = r * a % x
		res % y = r * a % y
		res % z = r * a % z
	end function quat_real8_right_mult
	
	type(quaternion) function quat_mult(u,v) result (res)
		type(quaternion), intent(in) :: u, v
		!type(quaternion) :: res
		res % t = u % t * v % t - u % x * v % x - u % y * v % y - u % z * v % z 
		res % x = u % t * v % x + u % x * v % t + u % y * v % z - u % z * v % y
		res % y = u % t * v % y + u % y * v % t + u % z * v % x - u % x * v % z
		res % z = u % t * v % z + u % z * v % t + u % x * v % y - u % y * v % x
	end function quat_mult
!###########################################################################################################
	
	type(quaternion) function quat_conjg(u) result (res)
		type(quaternion), intent(in) :: u
		!type(quaternion) :: res
		res % t = u % t
		res % x = - (u % x)
		res % y = - (u % y)
		res % z = - (u % z)
	end function quat_conjg
!###########################################################################################################
	
	function quat_abs(u) result (res)
		type(quaternion), intent(in) :: u
		real(8) :: res
		res = sqrt((u % t) **2 + (u % x) **2 + (u % y) **2 + (u % z) **2)
	end function quat_abs
	
!###########################################################################################################
		
 end module
 
και το πρόγραμμα που το χρησιμοποιεί:
- Κώδικας: Επιλογή όλων
 program main
	use structure 
	type (quaternion) :: u, v, w	
	integer :: i
	integer :: a
	real :: b
	real(8) :: c
	complex :: z
	
!	open(10,file="outpout")	
	a = 5
	b = 0.35
	c = -176.0987	
	u = quaternion(1,2,3,4)
	v = quaternion(5,6,7,8)
	
	w=u+v
	call quaternion_print(w)
	w=u-v
	call quaternion_print(w)
	w = a * u
	call quaternion_print(w)
	w = b * u
	call quaternion_print(w)
	w = c * u
	call quaternion_print(w)
	w = u * a
	call quaternion_print(w)
	w = u * b
	call quaternion_print(w)
	w = u * c
	call quaternion_print(w)
	w = u * v
	call quaternion_print(w)
	w = v * u
	call quaternion_print(w)
	
	z = (1,2)
	print *,z
	print *, abs(z)
	print *, abs(w)
	print*, conjg(w)
	
	w = c + w
	call quaternion_print(w)
end program