Faites chauffer les neurones

Résolu
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
-
Messages postés
1727
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
6 novembre 2021
-
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

Messages postés
600
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
6 avril 2010
1
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é)
Messages postés
3827
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
16 décembre 2021
46
ben je crois qu'il a tout bon ...


et le teste effectué le prouve















@+















Cirec
Messages postés
304
Date d'inscription
lundi 30 décembre 2002
Statut
Membre
Dernière intervention
10 mars 2012

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.
Messages postés
1727
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
6 novembre 2021
8
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 !      
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
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.
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
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.
Messages postés
1727
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
6 novembre 2021
8
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 ?)
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
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.
Messages postés
600
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
6 avril 2010
1
Bon ça a pas marché et j'ai tout fait planter! Désolé pour mon dernier message...

On gagne quoi pour avoir trouvé, alors!?
Messages postés
3827
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
16 décembre 2021
46
ç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
Messages postés
1727
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
6 novembre 2021
8
A mon tour :

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

Amusez-vous bien...