Passer une fonction en paramètre

10 views
Skip to first unread message

Philippe Cordel

unread,
Jan 3, 2016, 1:42:43 PM1/3/16
to Groupe des Eiffelistes Francophones
Bonjour
je cherche à développer un petit logiciel en Eiffel qui permet de tester des martingales à la roulette
Je bute sur un problème sans doute simple : passer une fonction en paramètre

Pour tester si les n derniers numéros sont d'un même type de chance simple (rouge, noir, pair impair, passe manque) je pensais faire la routine suivante :

n_derniers_identiques(n: INTEGER;test: FUNCTION[ANY,TUPLE,BOOLEAN]) : BOOLEAN
                --
                -- Vrai si les n derniers numéros sortis sont du même type : n rouge ou n noir ou ........
                --
-- require au_moins_n_sortis: index_premier_libre > n

do
if index_premier_libre > n then
Result := tableau_numeros.subarray(index_premier_libre - n,index_premier_libre -1).for_all (agent test)
else
Result := False
end
end

l'appel se ferait sous la forme trois_derniers_rouges := n_derniers_identiques(3,agent est_rouge)

La permanence (table des numéros sortis) est de type ARRY[NUMERO]
NUMERO fourni les fonctions sur un numéro est_rouge, est_noir, est_passe, est_manque, est_pair, est_impair

Cette formulation provoque une erreur de compilation

Ca doit être tout simple mais je débute

Merci d'avance

Eric Bezault

unread,
Jan 3, 2016, 1:51:04 PM1/3/16
to groupe_eiffelis...@googlegroups.com
On 1/3/2016 19:42, Philippe Cordel wrote:
> Result := tableau_numeros.subarray(index_premier_libre -
> n,index_premier_libre -1).for_all (agent test)

Il ne faut pas mettre 'agent' ici car l'argument `test' est
deja un agent. Juste:

....for_all (test)

Par contre, l'argument de `n_derniers_identiques' doit surement
etre de type:

test: FUNCTION[ANY,TUPLE [NUMERO],BOOLEAN]

--
Eric Bezault
mailto:er...@gobosoft.com
http://www.gobosoft.com

Philippe Cordel

unread,
Jan 3, 2016, 2:15:33 PM1/3/16
to Groupe des Eiffelistes Francophones
Merci Eric pour cette réponse rapide !
J'ai fait les modifs que tu indiques et ça passe à la compil !

Merci !

Philippe Cordel

unread,
Jan 3, 2016, 2:40:41 PM1/3/16
to Groupe des Eiffelistes Francophones
Petite question complémentaire :
Dans la formulation ;test: FUNCTION[ANY,TUPLE,BOOLEAN]
J'avais compris que
 le premier "paramètre' indiquait le type auquel s'applique la fonction
 le deuxième (le TUPLE) indiquait le type des paramètres de la fonction

j'avais d'abord écrit FUNCTION[NUMERO,TUPLE[],BOOLEAN

Ai-je commis une erreur de compréhension ?


Le dimanche 3 janvier 2016 19:51:04 UTC+1, Eric Bezault a écrit :

Eric Bezault

unread,
Jan 4, 2016, 3:04:55 AM1/4/16
to groupe_eiffelis...@googlegroups.com
On 1/3/2016 20:40, Philippe Cordel wrote:
> Petite question complémentaire :
> Dans la formulation ;test: FUNCTION[ANY,TUPLE,BOOLEAN]
> J'avais compris que
> le premier "paramètre' indiquait le type auquel s'applique la fonction
> le deuxième (le TUPLE) indiquait le type des paramètres de la fonction
>
> j'avais d'abord écrit FUNCTION[NUMERO,TUPLE[],BOOLEAN
>
> Ai-je commis une erreur de compréhension ?

Le premier paramètre est en effet sensé représenter le type
auquel s'applique la fonction. Mais il n'est pas utilisé,
c'est pour ca qu'on met ANY la plus part du temps. Et
d'ailleurs ISE a décidé de supprimer ce paramètre dans
EiffelStudio 15.12.

Par contre, il n'empèche que cet objet, en plus d'être l'objet
auquel s'applique la fonction, est aussi un paramètre ouvert
de l'agent. Donc le type doit aussi est listé dans le TUPLE.

Philippe Cordel

unread,
Jan 4, 2016, 3:55:36 AM1/4/16
to groupe_eiffelis...@googlegroups.com
OK ! Tout s'éclaire
Merci

http://www.gobosoft.com

--
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes Groupe des Eiffelistes Francophones.
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse groupe_eiffelistes_fr...@googlegroups.com.
Pour plus d'options, visitez le site https://groups.google.com/d/optout .

Philippe Cordel

unread,
Jan 5, 2016, 10:15:06 AM1/5/16
to Groupe des Eiffelistes Francophones
Désolé c'est encore moi avec le même problème côté appelant cette fois

le code de la classe PERMANENCE


n_derniers_identiques(n: INTEGER;test: FUNCTION[ANY,TUPLE[NUMERO],BOOLEAN]) : BOOLEAN
-- require au_moins_n_sortis: index_premier_libre > n
do
if index_premier_libre > n then
Result := tableau_numeros.subarray(index_premier_libre - n,index_premier_libre -1).for_all (test)
else
Result := False
end
end

n_derniers_rouges(n: INTEGER): BOOLEAN
do
Result:= n_derniers_identiques(n,{NUMERO}.est_rouge)
end


Dans NUMERO la fonction

est_rouge: BOOLEAN
-- indique si le numero est rouge
do
Result := ((valeur < 10) and (valeur \\ 2 = 1)) or else -- impair inférieur à 10
((valeur > 11) and (valeur <19) and (valeur \\ 2 = 0)) or else -- pairs de 12 à 18
((valeur > 18) and (valeur <28) and (valeur \\ 2 = 1)) or else -- impairs de 19 à 27
((valeur > 29) and (valeur \\ 2 = 0)) -- pairs de 30 à 36
end

L'erreur de compilation

VSTA(2): Feature is not available for static access. 
  Error code: VSTA(2)

Error: feature is not available for static access.
What to do: make sure that feature is either a C external routine without assertions, a .NET static external or a constant.

Class: PERMANENCE Feature: n_derniers_rouges Not valid for static call: est_rouge from NUMERO Line: 39 do -> Result:= n_derniers_identiques(n,{NUMERO}.est_rouge) end    

Même si le concept est théoriquement très clair pour moi c'est mon premier cas pratique !

Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse groupe_eiffelistes_francophones+unsubscribe@googlegroups.com.

Eric Bezault

unread,
Jan 5, 2016, 10:21:10 AM1/5/16
to groupe_eiffelis...@googlegroups.com
On 1/5/2016 16:15, Philippe Cordel wrote:
> Désolé c'est encore moi avec le même problème côté appelant cette fois
>
> n_derniers_rouges(n: INTEGER): BOOLEAN
> do
> Result:= n_derniers_identiques(n,{NUMERO}.est_rouge)
> end

Il manque le mot cle 'agent':

Result:= n_derniers_identiques(n, agent {NUMERO}.est_rouge)

Philippe Cordel

unread,
Jan 5, 2016, 10:25:15 AM1/5/16
to Groupe des Eiffelistes Francophones
Oops j'aurais du y penser !!!
Merci

Jocelyn Fiat

unread,
Jan 5, 2016, 11:54:22 AM1/5/16
to groupe_eiffelis...@googlegroups.com
Pour info, le "static access", c'est principalement pour les constants

par exemple avec:
class CONST
feature -- Access
     one: STRING = "one"
     two: STRING = "two"

     one_value: INTEGER = 1
     two_value: INTEGER = 2
end

On peut utiliser dans du code Eiffel

      print ({CONST}.one)
      print (" is same as ")
      print ({CONST}.one_value)

C'est une alternative à la solution d'hériter de CONST et d'utiliser les constantes héritées (ce qui peut vite polluer les interfaces si on a besoin de beaucoup de constantes..)

-- Jocelyn


--
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes "Groupe des Eiffelistes Francophones".
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse groupe_eiffelistes_fr...@googlegroups.com.
Pour obtenir davantage d'options, consultez la page https://groups.google.com/d/optout.

Philippe Cordel

unread,
Jan 5, 2016, 12:26:14 PM1/5/16
to Groupe des Eiffelistes Francophones
Bien noté ! Merci !
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse groupe_eiffelistes_francophones+unsubscribe@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages