Faites chauffer les neurones

Résolu
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 - 11 août 2006 à 17:54
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 - 12 août 2006 à 15:43
Hello every body !

Alors qu'on nous avait annoncé une nouvelle canicule pour cet été, une grande partie de la France est bien en dessous des températures habituelles.
Alors, pourquoi ne pas en profiter pour se trouver quelques distractions avec notre langage favori. Cela vous changera du sudoku tellement devenu à la mode que c'est tristement banal.

Je vous propose donc un petit exercice dont voici l'énoncé :
Soit la fonction suivante :

function SumAnything(const Args: arrayofconst): extended;
var
  i: integer;

begin
  Result :=  0;
   for  i : = Low(Args)  to  High(Args)  do
    case Args[i].VType  of
      vtInteger:
        Result :=  Result + Args[i].VInteger;
      vtBoolean:
        Result := Result + integer(Args[i].VBoolean);
      vtChar:
        Result := Result + Ord(Args[i].VChar);
      vtCurrency:
        Result := Result + Args[i].VCurrency^;
      vtExtended:
        Result := Result + Args[i].VExtended^;
      vtString :
        Result := Result + StrToIntDef(Args[i].VString^, 0);
      vtAnsiString :
        Result := Result + StrToIntDef( String (PChar(Args[i].VAnsiString)), 0);
      vtPointer:
        Result : = Result + integer(Args[i].VPointer^);
      vtVariant:
        Result :=  Result + Args[i].VVariant^;
      vtInt64:
        Result := Result + Args[i].VInt64^;
     end ;
end;

Qui sera le premier (attention, pas de tricherie ) à pouvoir donner le résultat exact de l'appel suivant :

X : = SumAnyThing([@a, a, a * b, 'CodeS-SourceS', 'D', True, 5.2, '2006']);

Sachant que a, b sont déclarés de type entier et X de type extended.

Top chrono et que le meilleur gagne

Ah oui, j'allais oublier : il n'y a rien à gagner si ce n'est notre considération. Quant aux tricheurs, ils seront démasqués et montrés du doigt sur la place publique. Qu'on se le dise !

NB : ce petit exercice a aussi pour vocation de vous faire découvrir que la surcharge de méthodes ou de fonctions n'est pas la seule réponse au traitement de variables de nature aussi diverses qu'une chaine, un entier ou une interface.

May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.

11 réponses

cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
11 août 2006 à 18:51
Si on prend les termes de l'addition 1 par 1:
- @a : type vtPointer est évalué en Integer((@a)^) c'est à dire a
- a : type vtInteger est évalué en a
- a*b : type vtInteger est évalué en a*b
- 'CodeS-SourceS' : type vtString est évalué en StrToIntDef('CodeS-SourceS',0) c'est à dire 0 puisque 'CodeS-SourceS' n'est la représentation d'aucun nombre entier
- 'D' : type vtChar est évalué en Ord('D') c'est à dire 0x44 selon la table ASCII soit 16*4+4=68
- True : type vtBoolean est évalué en Integer(True) c'est à dire 1
- 5.2 : type vtExtended est évalué en 5.2
- '2006' : type vtString est évalué en StrToIntDef('2006',0), c'est à dire 2006

Le résultat devrait être:
a+a+a*b+68+1+5.2+2006=2*a+a*b+2080.2
à condition que a et b soient dans des intervalles raisonnables (de façon à ce qu'aucune des opérations énoncées ci-dessus ne provoque de débordement de capacité)
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
11 août 2006 à 19:54
ben je crois qu'il a tout bon ...


et le teste effectué le prouve















@+















Cirec
0
cs_shining Messages postés 304 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 10 mars 2012
11 août 2006 à 20:30
Salut,

je rejoins l'analyse de Forman, néanmoins je reste perplexe à un quelconque resultat puisque en effet à premiere vue le compilateur va s'arrêter sur

function SumAnything(const Args: arrayofconst): extended; puisque en effet "arrayofconst" n'existe pas tel quel dans les mots clés !!! mais "array of const", je suppose que c'est un vilain tour de notre DelphiProg ;), ensuite en toute logique un integer peut ne pas être initialisé néamoins le resultat risque d'être aléatoire ... mais il est en tout autre pour les variables de type "Extended" qui eux si elles ne sont pas initialisées risque de provoquer une erreur de type virgule flotante !!!

donc moi je dirais qu'à moins de me tromper !!! le code tel quel n'est pas compilable pour les raisons citées ci-dessus !!!

Maintenant admettons que 'array of const' est une erreur de frappe !! et que l'ont initialise A & B par
A 1.0 et B 2.0 (pourquoi faire compliquer quand on peut faire simple :p)

Celà nous donne effectivement :
a + a + (a * b) + IntDef('CodeS Source') + Ord('D') + Integer(True) + 5.2 + 2006
1.0 + 1.0 + (1.0 * 2.0) + 0 + 68 + 1 + 5.2 + 2006 = 2084.2

@+

Shining-Freeman.
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
11 août 2006 à 21:03
Bonsoir,

J'en arrive (très laborieusement) à la même conclusion que Forman, avec la même réserve exprimée par Shining quand à arrayofconst, mais je pense qu'il s'agit d'une erreur de saisie.

Confirmé par le test...

And the winner is...        Forman !      
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
12 août 2006 à 09:44
Non, "Array of Const" n'est pas une erreur et vous l'avez surement déjà utilisé bon nombre de fois en appelant la fonction bien connue Format dont je rappelle la signature :
function Format(const Format:string;const Args: array of const):string;overload;
En revanche, et je pense que votre doute provient de là, la mise en page de ce site fait que les tois mots apparaissent accolés. Il fallait donc bien lire "Array of Const" et non ArrayOfConst. Cela se produit quand on fait un copier/coller d'un code déjà mise en forme et colorié.

Errare humanum est

En tous cas, félicitations à Forman pour sa rapidité et ses explications qui seront surement utiles aux personnes désireuses d'en savoir plus sur l'utilisation des tableaux ouverts.

Delphi vobis cum (comme dirait Japee )


<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
12 août 2006 à 09:49
Arf, j'ai oublié ...

May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
12 août 2006 à 09:50
Et cum spiritu tuo, Delphiprog  


Et pour ceux qui n'ont jamais fait de latin, May Delphi be with you, pour paraphraser DelphiProg (c'est pas un peu récursif, tout ça ?)
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
12 août 2006 à 11:27
Vous êtes les meilleurs, la preuve ici 

Yessss !
May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
cs_Forman Messages postés 600 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 6 avril 2010 1
12 août 2006 à 12:48
Bon ça a pas marché et j'ai tout fait planter! Désolé pour mon dernier message...

On gagne quoi pour avoir trouvé, alors!?
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
12 août 2006 à 13:08
ça a presque fonctionné
Tu n'as qu'une seul ligne de décalage

Mais c'est quand même bien fait ... bravo quelle créativité

celui-ci devrait s'afficher correctement

(Auteur : FORMAN)

@+
Cirec
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
12 août 2006 à 15:43
A mon tour :

Générateur d'énigmes - d'après Werber

Amusez-vous bien... 
0
Rejoignez-nous