Bonjour
Dernièrement je me suis m´y au Pascal avec Delphi. J´ai trouvé d´excellent tutoriel sur le wouaibe mais j´ai encore quelque question. ^^
Dans l´exemple suivant(en fait pas juste dans l´exemle) tiré d´un tuto je n´arrive pas à comprendre la fonction Ord :
procedure TForm1.Button1Click(Sender: TObject);
type
TTypeSupport = ( tsDisq35, tsDisqueDur, tsCDRom, tsDVDRom, tsZIP);
var
Supp1: TTypeSupport;
begin
Supp1 := Low(TTypeSupport);
ShowMessage(IntToStr(Ord(Supp1)));
Inc(Supp1);
ShowMessage(IntToStr(Ord(Supp1)));
Dec(Supp1);
ShowMessage(IntToStr(Ord(Supp1)));
end;
Si vous pouviez m´éclairer un peu se serai sympa. ^^
Merci
«psy
Ok ok je crois avoir compris...
Fait Ctrl-F1 sur le mot ord pour obtenir de l´aide sur cette fonction. L´aide de Delphi est en général très bien faite !
Le tableau commence par intervalle donc on est pas obliger de commencer par 0 comme dans le C/C++ ?
Tu peux définir comme tu veux les indice min et max des tableaux.
Ex. :
array[1..10] of . ..
array[-30..60] of . ..
array[40..250] of . ..
array[´a´..´z´] of . ..
même [´a´ . . ´z´] ? chouette ^^ le tableau avec Delphi sont beaucoup plus qu´avec le C ou on commence avec le 0 ( souvent les débutants font des erreurs avec ça.)
merci
«psy
tu peux même faire un truc comme ça, mais je ne me souvient plus très bien :
Type
Couleurs = orange, vert, bleu, violet, rose;
array[orange.. rose] of . ..
Dès que je peux, je reteste ça et je te tiens au courant !
c´est d´ailleur étrange, c´était une focntion du VB où on pouvait déclaré des tableau :
dim tableau(5 to 48) as . ..
mais avec le . NET, on est repasser au genre C avec des tableau de base 0. Bizarre de viré ce genre de chose.
Surtout que c´est bien pratique !
Je ne sais pas ce qu´il en est pour Delphi 8 . net !
Est ce que selon les normes c´est mieux de commencer par 0 ? ( lisibilité etc . ..)
" Est ce que selon les normes c´est mieux de commencer par 0 ? ( lisibilité etc . . .)"
Si tu veux savoir d´où vient l´indexage de zéro...
Indexer à partir du zéro ne vient pas vraiment d´une norme mais d´un simple raisonnement mathématique, découlant du déférençage:
Adresse du i-eme élément = b + i*t, où:
b est l´adresse de base;
i est l´index;
t est la taille des objets du tableau.
Ainsi, b pointe vers le début du tableau, soit le premier élément. Pour accéder au deuxième, il faut aller à l´adresse de la base, plus la taille d´un de ces éléments.
Soit un tableau de 4 éléments de, disons, 4 bytes chaqu´un.
. ... < 4 bytes, représentés par 4 points
[1 ][2 ][3 ][4 ]
^...^
b...x?
ici, pour accéder au 2e élément,[2 ], il faut donc partir du premier élément, pointé par b, et y additionner 1*4 bytes, pour passer le premier élément du tableau, [1 ].
Pour accéder au 3e, il faut faire le même principe, mais y additionner 8 bytes au lieu de quatre, pour passer et [1 ] ET [2 ]. Donc, en suivant la logique, on obtient:
b+i*t, avec i qui part de 0 ( pour le premier élément, i vaut 0)
Remarquez ici en C ( Je suis désolé de ne pas parler directement de Delphi ni de VB, pourtant le sujet direct de ce topic):
type Tableau[Taille];
Et pour déférencer:
Tableau[Index];
Mais en fait, c´est directement importé de la logique mathématique!
En effet, Tableau est un pointeur, n´oublions pas, et on a donc:
b + i*t
Tableau + Index*sizeof(type)
! !!
le sizeof(type) est sous entendu, pour alléger. On a donc une forme ainsi:
b[i].
C´est simple, non?
Donc voilà pourquoi à la base, on commençait les indices de 0.
Maintenant, de nos jours, cela n´a plus vraiment de rapport, avec les languages modernes. Disons que l´on peut les garder par norme, oui, aussi pour ne pas mélanger les programmeurs vétérans habitués à la vielle syntaxe d´index qui part de 0 se formant à un nouveau language. Du moins c´est cela que j´imagine.
Kelios
---------
Dans ton exemple TTypeSupport n´est pas un tableau c´est type enumérer.
Un type tableau se déclare avec set of.
par exemple :
Type
TTypeSupport = ( tsDisq35, tsDisqueDur, tsCDRom, tsDVDRom, tsZIP);
TTabSupport = set of TTypeSupport;
Ton exemple fonctionnerait aussi comme ça(je ne reprend pas les déclarations) :
Supp1 := tsDisq35;
ShowMessage(IntToStr(Ord(Supp1)));
Supp1 := tsDisqueDur;
ShowMessage(IntToStr(Ord(Supp1)));
Supp1 := tsDisq35;
ShowMessage(IntToStr(Ord(Supp1)));
ou alors :
ShowMessage(IntToStr(Ord(tsDisq35)));
ShowMessage(IntToStr(Ord(tsDisqueDur)));
ShowMessage(IntToStr(Ord(tsDisq35)));
donne le même résultat.
Salut Lord & salut à tous les autres.
Globalement, la fonction ORD renvoie l´indice d´un élément d´un tableau ou d´une liste énumérée.
Si tu prends les caractères ASCII par exemple qui forment un tableau de 255 éléments, la fonction ORD(´A´) te renverra 65 sachant que la lettre ´A´ est la 65ème dans ce tableau.
Dans ce cas précis, ORD et l´inverse de CHR qui elle te donne la valeur de l´index dans le tableau et donc CHR(65) te renverra ´A´.
J´espère que ça t´aidera un peu et surtout, une très bonne continuation.
Petit complément sur le post précédent.
Lord, en Delphi il existe plusieurs types de chaînes de caractères dont les STRINGS et les PCHAR qui sont les chaînes AZT ( à zero terminal - Elles se terminent par CHR(0)).
Je voulais donc dire que le tableau ASCII comportent 256 éléments de 0 à 255.
Ce qui est amusant c´est de modifier ( très déconseillé) de faire varier la valeur de Str[0] pour Str: String;
Ca revient à faire un Copy(Str, 1, Valeur de Str[0]).
Allé, @+
Up anti flood
Laisse courrir, il se fatiguera tout seul !
Ca ne mérite pas de réponse !
Merci de vaux explication. Pour les PCAHR je savais pas alors c´est utile.
amicalement,
«psy
Bon d´accord. Idée : développer un bot. C´est quand même dingue que sur un forum Programmation on doive tout faire à la main...
Lol ^^ oui se serais sympa. Mais avec les truc anti-flood je crois pas que ce sois possible . ...
ET CONNARD T´ARRETE DE ME FAIRE CHIER