Zobrazit příspěvky

Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.


Příspěvky - mikrom

Stran: 1 ... 9 10 [11] 12 13 ... 19
151
Hardware / Re:Nový IBM mainframe Z16
« kdy: 11. 09. 2022, 11:40:56 »
Myslel som ze na to PL/I sa niekto chyti ale zatial ticho  :)
Musel v tom uz niekto z vas programovat ? Ak ano, ake su skusenosti ?

152
Vývoj / Re:Traits ve Fortranu
« kdy: 11. 09. 2022, 11:25:10 »
... viz co psal Ink. Moduly jsou jen jmenné prostory ...
Never nikomu, kym si to sam neoveris.
Dobrá rada, ale vzhledem k tomu, že znám Fortran i ostatní věci, o kterých Ink psal, můžu z fleku říct, že on má pravdu a ty se ukrutně pleteš.
Zial neni to tak, dajme k tomu maly dokaz sporom  ;)
Nech teda su moduly name spaces. Potom ale, ked mam 2 rozne moduly, ktore obsahuju premennu s rovnakym menom, viem jej pouzitie rozlisit na zaklade mena modulu, t.j. takto:
Kód: [Vybrat]
module MA
    character(20) :: foo = 'foo from module A'
end module MA

module MB
    character(20) :: foo = 'foo from module B'
end module MB

program namespaces
    use MA
    use MB
    write(*,*) MA%foo
    write(*,*) MB%foo
end program namespaces
Ked sa vsak pokusim skompilovat to dostanem chybu
Kód: [Vybrat]
$ gfortran namespaces.f95 -o namespaces
namespaces.f95:12:17:

     write(*,*) MA%foo
                 1
Error: Symbol at (1) is not appropriate for an expression
namespaces.f95:13:17:

     write(*,*) MB%foo
                 1
Error: Symbol at (1) is not appropriate for an expression
 
Takuto chybu dostanem aj ked namiesto % pouzijem . alebo => atd.
To znamena, ze na zaklade mena modulu sa neda rozlisit, z ktoreho modulu rovnomenna premenna je.
Z toho vyplyva, ze moduly nie su menne priestory a ty nemas pravdu  8)

Jinak co se týká teorie Idris má většinou pravdu. Proč se s ním hádat  ;)
Ako som hore ukazal - je mi luto ale tentoraz pravdu nema.
Idris nam tu sice dava sebavedome a silne tvrdenia a po teoretickej stranke ma toho iste velmi vela precitane. Ale pripada mi to ako ked studuje v matematike definicie a vety bez praktickych cviceni. Moze sice ostatnych ohurovat ake je v tom eso, ale hlbsie pochopenie prichadza az pri rieseni praktickych uloh.

Moduly vo fortrane nie su namespaces. Fortran nema name spaces.
Namespaces si ale mozes v moduloch vytvorit pomocou derived data types a to takto:
Kód: [Vybrat]
module MA
    type MA_T
        character(20) :: foo = 'foo from module A'
    end type

    type(MA_T) :: A
end module MA

module MB
    type MB_T
        character(20) :: foo = 'foo from module B'
    end type

    type(MB_T) :: B
end module MB

program namespaces
    use MA
    use MB
    write(*,*) A%foo
    write(*,*) B%foo
end program namespaces

Output:
Kód: [Vybrat]
$ gfortran namespaces.f95 -o namespaces
$ ./namespaces
 foo from module A
 foo from module B

153
Vývoj / Re:Traits ve Fortranu
« kdy: 11. 09. 2022, 00:09:22 »
... viz co psal Ink. Moduly jsou jen jmenné prostory ...
Never nikomu, kym si to sam neoveris. Nie su to len name spaces - nainstaluj si gfortran a pozri si moj predosly priklad quaternions_class.f95. Modul tu robi taku istu pracu ako class a ma aj metodu print.

154
Vývoj / Re:Traits ve Fortranu
« kdy: 11. 09. 2022, 00:00:21 »
Este som tie kvaterniony trochu zmenil, teraz nepouzivam overloading assignemt operatora = aby som naplnil kvaternion z pola
a = (/1., 2., 3., 4./)
ale vytvaram ho à la OOP takto:
a = Quaternion(1., 2., 3., 4.)
Takze modul mi sluzi ako class pre kvaternion, dodal som tam aj metodu print ktora sa pouzica tymto sposobom
a%print

quaternions_class.f95
Kód: [Vybrat]
module my_quaternions
  type :: Quaternion
    real :: x, y, z, t
    contains
      procedure :: print => print_quaternion
  end type quaternion

  interface operator(+)
    module procedure add_quaternions
  end interface

  interface operator(-)
    module procedure substract_quaternions
  end interface

  interface operator(*)
    module procedure hamilton_product
  end interface 

contains
  subroutine print_quaternion(this)
    class(Quaternion), intent(in) :: this
    write (*, 10) '(', this%x, ', ', this%y, ', ', this%z, ', ', this%t, ')'
    write (*,*)
    10 format(a, f8.2, a, f8.2, a, f8.2, a, f8.2, a)
  end subroutine print_quaternion

  function add_quaternions(a, b) result(c)
    type(Quaternion), intent(in) :: a
    type(Quaternion), intent(in) :: b
    type(quaternion) :: c
    c%x = a%x + b%x
    c%y = a%y + b%y
    c%z = a%z + b%z
    c%t = a%t + b%t
  end function add_quaternions
 
  function substract_quaternions(a, b) result(c)
    type(quaternion), intent(in) :: a, b
    type(quaternion) :: c
    c%x = a%x - b%x
    c%y = a%y - b%y
    c%z = a%z - b%z
    c%t = a%t - b%t
  end function substract_quaternions

  function hamilton_product(a, b) result(c)
    type(quaternion), intent(in) :: a, b
    type(quaternion) :: c
    c%x = a%x*b%x - a%y*b%y - a%z*b%z - a%t*b%t
    c%y = a%x*b%y + a%y*b%x + a%z*b%t - a%t*b%z
    c%z = a%x*b%z - a%y*b%t + a%z*b%x - a%t*b%y
    c%t = a%x*b%t + a%y*b%z - a%z*b%y + a%t*b%x
  end function hamilton_product

end module my_quaternions

program quaternions
  use my_quaternions
   
  type(Quaternion) :: a, b, c
  b = Quaternion(1., 2., 3., 4.)
  a = Quaternion(5., 6., 7., 8.)
  write(*, '(a)', advance="no") 'a = '
  call a%print()
  write(*, '(a)', advance="no") 'b = '
  call b%print()
 
  write (*,'(a)') 'c = a + b'
  c = a + b
  write(*, '(a)', advance="no") 'c = '
  call c%print

  write (*,'(a)') 'c = a - b'
  c = a - b
  call c%print

  write (*,'(a)') 'c = a * b'
  c = a * b
  call c%print
end program quaternions

Output:
Kód: [Vybrat]
$ gfortran quaternions_class.f95 -o quaternions_class
$ ./quaternions_class
a = (    5.00,     6.00,     7.00,     8.00)

b = (    1.00,     2.00,     3.00,     4.00)

c = a + b
c = (    6.00,     8.00,    10.00,    12.00)

c = a - b
(    4.00,     4.00,     4.00,     4.00)

c = a * b
(  -60.00,    20.00,   -18.00,    32.00)

155
Vývoj / Re:Traits ve Fortranu
« kdy: 10. 09. 2022, 19:53:26 »
ja bych si furt myslel, ze na numericke pocitani ol'good fortran a jeste mpi na cluster.
Pro paralelní zpracování (HPC clustery) má pěkná rozšíření Fortran 2018.
a jak vies ze tie rozsirenia su pekne, ked si povedal ze vo fortrane neprogramujes  :)  btw. ja som asi iba raz v zivote experimentalne pouzil OpenMP

156
Vývoj / Re:Traits ve Fortranu
« kdy: 10. 09. 2022, 19:43:18 »
Napriklad, takto to funguje s tymi quaternionmi:

quaternions.f95
Kód: [Vybrat]
module my_quaternions
  type quaternion
    real :: x, y, z, t
  end type quaternion

  interface assignment(=)
    module procedure quaternion_from_array
  end interface

  interface operator(+)
    module procedure add_quaternions
  end interface 

  interface operator(-)
    module procedure substract_quaternions
  end interface

  interface operator(*)
    module procedure hamilton_product
  end interface 

contains
  subroutine quaternion_from_array(q, v)
    ! construct quaternion Q from an array V
    ! Q = V
    real, dimension(4), intent(in) :: v
    type(quaternion), intent(out) :: q
    q%x = v(1)
    q%y = v(2)
    q%z = v(3)
    q%t = v(4)
  end subroutine quaternion_from_array

  subroutine print_quaternion(q, q_name)
    type(quaternion), intent(in) :: q
    character(*), intent(in) :: q_name
    write (*, 10) q_name,' = (', q%x, ', ', q%y, ', ', q%z, ', ', q%t, ')'
    write (*,*)
    10 format(a, a, f8.2, a, f8.2, a, f8.2, a, f8.2, a)
  end subroutine print_quaternion

  function add_quaternions(a, b) result(c)
    type(quaternion), intent(in) :: a
    type(quaternion), intent(in) :: b
    type(quaternion) :: c
    c%x = a%x + b%x
    c%y = a%y + b%y
    c%z = a%z + b%z
    c%t = a%t + b%t
  end function add_quaternions

  function substract_quaternions(a, b) result(c)
    type(quaternion), intent(in) :: a, b
    type(quaternion) :: c
    c%x = a%x - b%x
    c%y = a%y - b%y
    c%z = a%z - b%z
    c%t = a%t - b%t
  end function substract_quaternions

  function hamilton_product(a, b) result(c)
    type(quaternion), intent(in) :: a, b
    type(quaternion) :: c
    c%x = a%x*b%x - a%y*b%y - a%z*b%z - a%t*b%t
    c%y = a%x*b%y + a%y*b%x + a%z*b%t - a%t*b%z
    c%z = a%x*b%z - a%y*b%t + a%z*b%x - a%t*b%y
    c%t = a%x*b%t + a%y*b%z - a%z*b%y + a%t*b%x
  end function hamilton_product

end module my_quaternions

program quaternions
  use my_quaternions
  type(quaternion) :: a, b, c

  write (*,'(a)') 'Quaternions example:'
  b = (/1., 2., 3., 4./)
  a = (/5., 6., 7., 8./)
  call print_quaternion(a, 'a')
  call print_quaternion(b, 'b')

  write (*,'(a)') 'c = a + b'
  c = a + b
  call print_quaternion(c, 'c')
 
  write (*,'(a)') 'c = a - b'
  c = a - b
  call print_quaternion(c, 'c')

  write (*,'(a)') 'c = a * b'
  c = a * b
  call print_quaternion(c, 'c')
end program quaternions

Output:
Kód: [Vybrat]
$ gfortran quaternions.f95 -o quaternions
$ ./quaternions
Quaternions example:
a = (    5.00,     6.00,     7.00,     8.00)

b = (    1.00,     2.00,     3.00,     4.00)

c = a + b
c = (    6.00,     8.00,    10.00,    12.00)

c = a - b
c = (    4.00,     4.00,     4.00,     4.00)

c = a * b
c = (  -60.00,    20.00,   -18.00,    32.00)

157
Vývoj / Re:Traits ve Fortranu
« kdy: 10. 09. 2022, 19:36:04 »
Tak s tymi Quaternionmi to samozrejme vo Fortrane ide.
Nadefinujes si vlastny typ Queternion a k nemu overloadujes operatory + - *
To sa urobi zase cez moduly 8), ziadne traity nie su treba.

158
Vývoj / Re:Traits ve Fortranu
« kdy: 10. 09. 2022, 17:33:38 »
veortranu bych ocekaval praci s vektory, maticemi, na co specialni typ pro kvaterniony.
fortran to umoznuje

proto to pisu, ze fortran je na numeriku a traits a oop jsou v nem zbytecne.
suhlasim s tebou na 100%, ze OOP je vo fortrane zbytocne

159
Vývoj / Re:Traits ve Fortranu
« kdy: 10. 09. 2022, 17:25:57 »
veortranu bych ocekaval praci s vektory, maticemi, na co specialni typ pro kvaterniony.
fortran to umoznuje

160
Vývoj / Re:Traits ve Fortranu
« kdy: 10. 09. 2022, 14:38:21 »
No to som trochu sklamany
To mě mrzí. Slibuji, že až bude chvilka času, nainstaluju si GNU Fortran a napíšu příklad. Ovšem vzhledem k charakteru OOP ve Fortranu ten kód bude hnusný a jako příklad spíše negativní :)
;D tak to radsej ani nedavaj.
Uzavrime tuto diskusiu s tym, ze na podobny ucel, na ktory sa pouzivaju v inych jazykoch traity sa vo fortrane daju pouzit moduly.

161
Vývoj / Re:Traits ve Fortranu
« kdy: 10. 09. 2022, 14:27:34 »
Tak preco neurobis syntaktickou omáčkou male demo traitu vo fortrane ?
Nech je to funkcne, da sa skompilovat v gfortrane a ma zmysluplne pouzitie ..
Protože to nepotřebuju a navíc to je triviální a úplně stejné jako třeba v Javě bez rozhraní (její úplně prvotní verze, asi ještě pre-v1.0, je ostatně neměla). Napsat něco jako rustí std::io::Read nebo io.Reader (Go) bez použití traitů/rozhraní a bez vícenásobné dědičnosti bývá oblíbená otázka u zkoušek z úvodu do “OOP”.
No to som trochu sklamany, myslel som ze ked je to pre Teba trivialne, tak sem das aspon nejaky kusok fungujuceho kodu, aby sa aj ostatni od teba nieco priucili. Ja som sem dal 2 analogicke priklady:
1) s pouzitim modulov vo fortrane
2) s pouzitim traitov v jave (s trochou syntaktickeho cukru)

162
Vývoj / Re:Traits ve Fortranu
« kdy: 10. 09. 2022, 14:14:08 »
Moduly vo fortrane (90+) maju podobny ucel ako traity v inych jazykoch. Sluzia na organizaciu a znovupouzitie kodu.

Možná jsem něco nepochopil, ale co jsi demonstroval ve svém příkladu, jsou funkce uspořádané do nějakých namespaces. Traity slouží k implementaci nějakého rozhraní napříč různými typy (třídami). Možná tam někde nějaký průnik vidíš, ale nepřijde mi, že by tam byla nějaká zásadní podobnost nebo zastupitelnost.
Žádný průnik tam není.

Ale je tam analogia - pozri:
Kód: [Vybrat]
class Main implements my_mod {
static void main(String[] args) {
Main m = new Main();
println("main calls:")
m.t11()
m.t12()
m.t2()
m.s()
}
}

trait tmp_mod1 {
void t11() {
println("t11");
}
void t12() {
println("t12 calls:")
t11()
}
}

trait tmp_mod2 {
void t2() {
println("t2")
}
}

trait my_mod implements tmp_mod1, tmp_mod2 {
void s() {
println("s calls:")
t11()
t12()
t2()
}
}

output:
Kód: [Vybrat]
main calls:
t11
t12 calls:
t11
t2
s calls:
t11
t12 calls:
t11
t2

163
Vývoj / Re:Traits ve Fortranu
« kdy: 10. 09. 2022, 12:06:11 »
Ty traity se dají udělat syntaktickou omáčkou
Tak preco neurobis syntaktickou omáčkou male demo traitu vo fortrane ?
Nech je to funkcne, da sa skompilovat v gfortrane a ma zmysluplne pouzitie ..

164
Vývoj / Re:Traits ve Fortranu
« kdy: 09. 09. 2022, 19:03:41 »
Moduly vo fortrane (90+) maju podobny ucel ako traity v inych jazykoch. Sluzia na organizaciu a znovupouzitie kodu.

Možná jsem něco nepochopil, ale co jsi demonstroval ve svém příkladu, jsou funkce uspořádané do nějakých namespaces. Traity slouží k implementaci nějakého rozhraní napříč různými typy (třídami). Možná tam někde nějaký průnik vidíš, ale nepřijde mi, že by tam byla nějaká zásadní podobnost nebo zastupitelnost.

No ano, OP sa pytal ci Má moderní Fortran něco jak trait v Rustu, ale nepovedal nam na co to vlastne potrebuje, co potrebuje docielit. Fortran nie moc OOP, takze take veci zatial nema ale myslim si, ze na docielenie podobnych veci ako sa robia s pouzitim traitu v inych jazykoch by mohol vo fortrane pouzit akurat tak tie moduly.

165
Hardware / Re:Nový IBM mainframe Z16
« kdy: 09. 09. 2022, 18:59:05 »
jako decko jsem vyhrabal kdovikde knizku algol-cobol-fortran a co jsem videl jsem nechapal, ale obdivoval to jako magii. no ve fortranu jsem si uz zaprogramoval, ty dva ostatni me minuly. delam v c++.

https://knihobot.cz/g/497729

No páni! Taky jsem se podle ní učil programovat. To je let, odhaduju 1978..
Ale hlavně z tohoto ..
https://www.databazeknih.cz/knihy/fel-fortran-prirucka-uzivatele-423628
Doc. Koníček , FEL Fortran

Fortran som mal tiez este na skole, COBOL potom v praci na IBM i. Uz mi chyba len PL/I, ten zije hlavne na mainframe. Jediny dostupny kompilator ktory som si vyskusal na linuxe je http://www.iron-spring.com/


Stran: 1 ... 9 10 [11] 12 13 ... 19