2009-09-26 4 views
2

Mon plan est de faire une fonction qui récupère l'élément le plus élevé d'un objet, pour ainsi dire, la gamme supérieure d'un tableau.En d'autres termes, j'essaie d'obtenir le code de la fonction High().Comment recréer une fonction récupérant l'élément le plus élevé d'un objet?

Ce que j'ai essayé jusqu'à présent:

function High2(var X):integer; 
begin 
    Result:=Pbyte(Cardinal(@X)-1)^-1; 
end; 

La fonction doit lire au-dessus de la valeur (longueur) avant la position du premier élément de l'objet (tableau/string) et le retourner a diminué de 1. Cependant, il ne récupère pas les résultats corrects sur le type de tableau statique ou dynamique. Comment puis-je recréer la fonction High() en Pascal?

+0

Je n'ai pas la moindre idée de ce que vous voulez réaliser. Pouvez-vous donner un exemple? –

Répondre

4

Vous ne savez pas pourquoi vous voudriez faire cela quand Delphi a déjà une fonction magique de compilateur High() intégrée, mais OK, c'est parti.

Tableaux statiques: impossible à faire. Aucune information de taille n'est stockée à l'exécution car la taille est connue du compilateur et ne peut pas changer. High() laisse simplement tomber le nombre nécessaire dans le code en tant que constante. Tableaux dynamiques: Le compilateur convertit High en un appel à DynArrayHigh dans l'unité System, qui renvoie DynArrayLength - 1. DynArrayLength recule de 4 octets depuis le début du tableau (vous ne faites que reculer de 1) et renvoie le longueur comme un entier au lieu d'un octet.

J'espère que cela vous sera utile. Pourquoi n'utilisez-vous pas simplement High, BTW?

+2

FWIW, dans Delphi 2010, le RTTI étendu stocke effectivement le nombre d'éléments (plats) dans des tableaux statiques, même si le tableau n'est pas de type managé. C'est nécessaire pour le suivi du tas. –

+3

Bien sûr, ces données ne sont pas co-localisées avec les données de tableau statique, donc sans une inférence générique, ou un autre moyen de transmettre le PTypeInfo associé, cela n'aidera pas. –

+0

@Mason Wheeler, je voudrais utiliser dans Turbo pascal, qui est très vieux et je ne suis pas sûr si elle a la fonction High(), c'est pourquoi j'ai demandé. –

5

Les fonctions High() (et Low()) sont appelées «fonctions standard», ce qui signifie qu'elles sont intrinsèques au compilateur. Comme Write et Writeln, ils n'existent pas vraiment comme des déclarations de fonction Pascal normales. Le compilateur s'assure qu'ils sont dans la portée de l'unité "Système" simplement pour des raisons de commodité et pour permettre la fonction du même nom dans d'autres portées. Cela vous permet également de les qualifier en utilisant System.High() pour référencer explicitement la version de l'unité système. Comme ils sont intrinsèques, le compilateur générera automatiquement la séquence de code appropriée pour le type considéré. Cela signifie également qu'il est pratiquement impossible d'en dupliquer toutes les fonctionnalités. Il suffit de coller avec les fonctions standard intrinsèques.

+1

+1 excellente réponse;). – RRUZ

+1

Allen existe-t-il un document qui décrit et détaille les fonctions qui font partie du groupe "magie du compilateur" comme High, Low, Writeln, etc? – RRUZ

+0

Rruz, la documentation Delphi décrit ces fonctions. Cependant, rien ne précise comment ils fonctionnent, car ces informations ne vous concernent pas, elles constituent un détail d'implémentation susceptible de changer avec n'importe quelle version de Delphi. –

Questions connexes