cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 2013
-
11 août 2006 à 17:54
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDerniè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.
cs_Forman
Messages postés600Date d'inscriptionsamedi 8 juin 2002StatutMembreDernière intervention 6 avril 20101 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é)
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 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
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 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 !
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 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.