3 votes

Comment définir et utiliser correctement les variables globales dans le module en Julia ?

En Fortran, nous savons que nous pouvons, dans un module, définir une variable globale (utiliser la propriété private), de sorte que nous pouvons utiliser les sous-routines du module pour définir ou modifier les valeurs de cette variable. Voir ci-dessous,

module Mod
integer, parameter :: r8=selected_real_kind(15,9)
real(kind=r8), private, save :: var
contains
subroutine f(x)
real(kind=r8) :: x
var = 2.0_r8*x
end subroutine f
end

Comme nous pouvons le voir, nous pouvons appeler f(x) et définir la var dans le module comme étant 2x.

Maintenant, à Julia, on dirait que c'est en dessous,

module Mod
global var
function f(x::Float64)
global var = 2.0*x
return nothing
end
  1. Je veux dire que, dans la fonction, si var est à gauche, dois-je spécifier le mot clé "global" à chaque fois ?

  2. J'ai également essayé de donner un type à la variable globale, par exemple

    global var::Float64

Mais cela me donne une erreur

syntax: type declarations on global variables are not yet supported

Il semble que je ne puisse faire que soit ne rien spécifier, comme juste

global var

ou lui donner une valeur tout en définissant son type,

global var=0.0::Float64

N'est-il pas préférable de donner un type à la variable globale avant de l'utiliser ?

2voto

Bogumił Kamiński Points 15639

C'est un moyen de faire ce que vous voulez et de le rendre efficace :

julia> const x = Ref(0)
Base.RefValue{Int64}(0)

julia> function f(y)
           x[] = y
       end

f (generic function with 1 method)

julia> x[]
0

julia> f(10)
10

julia> x[]
10

julia> f("10")
ERROR: MethodError: Cannot `convert` an object of type String to an object of type Int64

julia> f(5.0)
5.0

julia> x[]
5

Commentaires :

  1. Je fais x a const ce qui garantit que le compilateur connaîtra son type (afin de pouvoir optimiser le code).
  2. Je fais x a Ref pour permettre la mutabilité de son contenu et pour qu'il soit clair plus tard dans la x[] = y déclaration selon laquelle x[] fait référence à une variable globale (comme la variable x n'est pas défini dans une portée locale de f )
  3. Comme vous pouvez le constater dans l'exemple, je n'ai pas pu utiliser "10" dans l'appel de f car il n'a pas de type correspondant. Notez cependant que je pourrais utiliser 5.0 (un flottant) car il peut être converti en un nombre entier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X