writes:Cette dernière paragraphe me semble exactement la définition des
opérateurs &, | et ^ en C++. Y compris la mauvaise précédence:-).
Euh, la precedence des operateurs en Ada ne depend pas des types
utilises.
Et le and booleen ou le and binaire, c'est le meme operateur. Par
contre si j'ai bonne memoire, and et or ont la meme precedence et pas
de priorite (autrement dit les parentheses sont obligatoires quand on
les melange). Mais je parlais des decalages, pas des autres
operations.Il y a aussi un « not » dans §4.5.6, avec des sémantiques (pour un
type « modular ») qui correspond à ! en C++.
Non, le not correspond a ~ (a moins qu'il y en ai aussi un qui
correspond a ! ce qui est possible avec la surcharge sur le type
resultat des fonctions/operateurs mais j'en doute, ce n'est pas
tellement dans la philosophie Ada).
Les types modular ont globalement la meme semantique que les unsigned
en C++ (a part qu'on peut s'amuser a avoir des modular sur autre chose
que les puissances de 2, mais la le comite s'est amuse). Il y a
Natural pour la semantique que certains aimeraient donner a unsigned
:-)
En revanche, je ne trouve pas de décalages, même dans les fonctions
prédéfinies (Appendice A). Mais peut-être je ne sais pas où
chercher.
C'est donc mon souvenir (si j'ai bonne memoire, gnat a des fonctions
intrinseques pour ca et peut-etre meme les rotations, mais ce n'est
pas standard).
Naturellement, un moyen naturel en Ada (le seul disponible en Ada83;
en Ada95 il y a en plus les modular) de manipuler des bits, c'est
d'utiliser des tableaux (compactes) de booleens.
Auquel cas la concatenation de tableaux et l'utilisation d'intervalles
permettent d'exprimer les operations naturellements (et c'est
vraissemblablement des idiomes reconnus pas les compilateurs -- j'ai
jamais verifie en Ada mais les synthetiseurs VHDL le font).
Par exemple
A = A(A'Low) & A(A'Hight .. A'Low+1);
pour une rotation.
(Euh, si on continue comme ca, il va falloir mettre fcla en copie, ne
fut-ce que pour corriger ma memoire.)
kanze@gabi-soft.fr writes:
Cette dernière paragraphe me semble exactement la définition des
opérateurs &, | et ^ en C++. Y compris la mauvaise précédence:-).
Euh, la precedence des operateurs en Ada ne depend pas des types
utilises.
Et le and booleen ou le and binaire, c'est le meme operateur. Par
contre si j'ai bonne memoire, and et or ont la meme precedence et pas
de priorite (autrement dit les parentheses sont obligatoires quand on
les melange). Mais je parlais des decalages, pas des autres
operations.
Il y a aussi un « not » dans §4.5.6, avec des sémantiques (pour un
type « modular ») qui correspond à ! en C++.
Non, le not correspond a ~ (a moins qu'il y en ai aussi un qui
correspond a ! ce qui est possible avec la surcharge sur le type
resultat des fonctions/operateurs mais j'en doute, ce n'est pas
tellement dans la philosophie Ada).
Les types modular ont globalement la meme semantique que les unsigned
en C++ (a part qu'on peut s'amuser a avoir des modular sur autre chose
que les puissances de 2, mais la le comite s'est amuse). Il y a
Natural pour la semantique que certains aimeraient donner a unsigned
:-)
En revanche, je ne trouve pas de décalages, même dans les fonctions
prédéfinies (Appendice A). Mais peut-être je ne sais pas où
chercher.
C'est donc mon souvenir (si j'ai bonne memoire, gnat a des fonctions
intrinseques pour ca et peut-etre meme les rotations, mais ce n'est
pas standard).
Naturellement, un moyen naturel en Ada (le seul disponible en Ada83;
en Ada95 il y a en plus les modular) de manipuler des bits, c'est
d'utiliser des tableaux (compactes) de booleens.
Auquel cas la concatenation de tableaux et l'utilisation d'intervalles
permettent d'exprimer les operations naturellements (et c'est
vraissemblablement des idiomes reconnus pas les compilateurs -- j'ai
jamais verifie en Ada mais les synthetiseurs VHDL le font).
Par exemple
A = A(A'Low) & A(A'Hight .. A'Low+1);
pour une rotation.
(Euh, si on continue comme ca, il va falloir mettre fcla en copie, ne
fut-ce que pour corriger ma memoire.)
writes:Cette dernière paragraphe me semble exactement la définition des
opérateurs &, | et ^ en C++. Y compris la mauvaise précédence:-).
Euh, la precedence des operateurs en Ada ne depend pas des types
utilises.
Et le and booleen ou le and binaire, c'est le meme operateur. Par
contre si j'ai bonne memoire, and et or ont la meme precedence et pas
de priorite (autrement dit les parentheses sont obligatoires quand on
les melange). Mais je parlais des decalages, pas des autres
operations.Il y a aussi un « not » dans §4.5.6, avec des sémantiques (pour un
type « modular ») qui correspond à ! en C++.
Non, le not correspond a ~ (a moins qu'il y en ai aussi un qui
correspond a ! ce qui est possible avec la surcharge sur le type
resultat des fonctions/operateurs mais j'en doute, ce n'est pas
tellement dans la philosophie Ada).
Les types modular ont globalement la meme semantique que les unsigned
en C++ (a part qu'on peut s'amuser a avoir des modular sur autre chose
que les puissances de 2, mais la le comite s'est amuse). Il y a
Natural pour la semantique que certains aimeraient donner a unsigned
:-)
En revanche, je ne trouve pas de décalages, même dans les fonctions
prédéfinies (Appendice A). Mais peut-être je ne sais pas où
chercher.
C'est donc mon souvenir (si j'ai bonne memoire, gnat a des fonctions
intrinseques pour ca et peut-etre meme les rotations, mais ce n'est
pas standard).
Naturellement, un moyen naturel en Ada (le seul disponible en Ada83;
en Ada95 il y a en plus les modular) de manipuler des bits, c'est
d'utiliser des tableaux (compactes) de booleens.
Auquel cas la concatenation de tableaux et l'utilisation d'intervalles
permettent d'exprimer les operations naturellements (et c'est
vraissemblablement des idiomes reconnus pas les compilateurs -- j'ai
jamais verifie en Ada mais les synthetiseurs VHDL le font).
Par exemple
A = A(A'Low) & A(A'Hight .. A'Low+1);
pour une rotation.
(Euh, si on continue comme ca, il va falloir mettre fcla en copie, ne
fut-ce que pour corriger ma memoire.)
Jean-Marc Bourguet wrote in message
news:...writes:
Les types modular ont globalement la meme semantique que les
unsigned en C++ (a part qu'on peut s'amuser a avoir des modular
sur autre chose que les puissances de 2, mais la le comite s'est
amuse). Il y a Natural pour la semantique que certains aimeraient
donner a unsigned :-)
Je crois qu'on peut dire que pour les « petits » types, le système
de types d'Ada est beaucoup plus puissant et plus souple que celui
de C++. Quand on commence à définir des classes, avec comportement,
en revanche, je ne sais pas. Je n'ai pas d'expérience avec Ada pour
dire, mais j'ai du mal à imaginer quelque chose de plus souple que
ce qu'offre le C++.
En revanche, je ne trouve pas de décalages, même dans les
fonctions prédéfinies (Appendice A). Mais peut-être je ne sais
pas où chercher.
C'est donc mon souvenir (si j'ai bonne memoire, gnat a des
fonctions intrinseques pour ca et peut-etre meme les rotations,
mais ce n'est pas standard).
Ce qui m'a un peu étonné. Tous les Pascal et les Modula dont je me
suis servis en avait. L'utilité en était donc bien connue.Naturellement, un moyen naturel en Ada (le seul disponible en
Ada83; en Ada95 il y a en plus les modular) de manipuler des bits,
c'est d'utiliser des tableaux (compactes) de booleens.
D'une part, il ne s'agit pas seulement de manipuler les bits. La
seule utilisation que j'en fais, c'est d'insérer et d'extraire des
champs dans les octets, ou éventuellement des mots, surtout pour
être conforme à un format binaire externe -- protocol de
transmission, etc. C-à-d que dans un octet, je peux être amener à
traiter deux champs de 3 bits, et deux d'un bit. Ou un champs de 4
bits et deux de 2. C'est donc un espèce de struct avec bit fields
dont j'ai besoin.
De l'autre part, la disposition physique m'importe énormement.
Conceptuellement, j'ai exactement ce qu'il me faut avec les bit
fields de C/C++. Dans la pratique, en revanche, le fait que la norme
n'impose aucune disposition physique en mémoire, et que les
compilateurs varient réelement de l'un à l'autre à cet égard, les
rend inutilisable pour cette application.Auquel cas la concatenation de tableaux et l'utilisation
d'intervalles permettent d'exprimer les operations naturellements
(et c'est vraissemblablement des idiomes reconnus pas les
compilateurs -- j'ai jamais verifie en Ada mais les synthetiseurs
VHDL le font).
C-à-d que la spécification d'Ada exige une certaine disposition dans
la mémoire ? Que si j'écris quelque chose comme :
record Header
flag1 : Boolean ;
id1 : mod 8 ;
flag2 : Boolean ;
id2 : mod 8 ;
end record ;
je suis garantie d'avoir une structure d'un octet, avec flag1 sur le
bit 7, id1 sur les bits 6-4, flag2 sur le bit 3 et id2 sur les bits
2-0 ?
Par exemple
A = A(A'Low) & A(A'Hight .. A'Low+1);
pour une rotation.
(Euh, si on continue comme ca, il va falloir mettre fcla en copie, ne
fut-ce que pour corriger ma memoire.)
Tout à fait. Parce que pour commencer, je ne comprends pas du tout ton
Ada. (Probablement parce que je ne connais pas Ada, pour commencer:-).)
Jean-Marc Bourguet <jm@bourguet.org> wrote in message
news:<pxbisd9tlys.fsf@news.bourguet.org>...
kanze@gabi-soft.fr writes:
Les types modular ont globalement la meme semantique que les
unsigned en C++ (a part qu'on peut s'amuser a avoir des modular
sur autre chose que les puissances de 2, mais la le comite s'est
amuse). Il y a Natural pour la semantique que certains aimeraient
donner a unsigned :-)
Je crois qu'on peut dire que pour les « petits » types, le système
de types d'Ada est beaucoup plus puissant et plus souple que celui
de C++. Quand on commence à définir des classes, avec comportement,
en revanche, je ne sais pas. Je n'ai pas d'expérience avec Ada pour
dire, mais j'ai du mal à imaginer quelque chose de plus souple que
ce qu'offre le C++.
En revanche, je ne trouve pas de décalages, même dans les
fonctions prédéfinies (Appendice A). Mais peut-être je ne sais
pas où chercher.
C'est donc mon souvenir (si j'ai bonne memoire, gnat a des
fonctions intrinseques pour ca et peut-etre meme les rotations,
mais ce n'est pas standard).
Ce qui m'a un peu étonné. Tous les Pascal et les Modula dont je me
suis servis en avait. L'utilité en était donc bien connue.
Naturellement, un moyen naturel en Ada (le seul disponible en
Ada83; en Ada95 il y a en plus les modular) de manipuler des bits,
c'est d'utiliser des tableaux (compactes) de booleens.
D'une part, il ne s'agit pas seulement de manipuler les bits. La
seule utilisation que j'en fais, c'est d'insérer et d'extraire des
champs dans les octets, ou éventuellement des mots, surtout pour
être conforme à un format binaire externe -- protocol de
transmission, etc. C-à-d que dans un octet, je peux être amener à
traiter deux champs de 3 bits, et deux d'un bit. Ou un champs de 4
bits et deux de 2. C'est donc un espèce de struct avec bit fields
dont j'ai besoin.
De l'autre part, la disposition physique m'importe énormement.
Conceptuellement, j'ai exactement ce qu'il me faut avec les bit
fields de C/C++. Dans la pratique, en revanche, le fait que la norme
n'impose aucune disposition physique en mémoire, et que les
compilateurs varient réelement de l'un à l'autre à cet égard, les
rend inutilisable pour cette application.
Auquel cas la concatenation de tableaux et l'utilisation
d'intervalles permettent d'exprimer les operations naturellements
(et c'est vraissemblablement des idiomes reconnus pas les
compilateurs -- j'ai jamais verifie en Ada mais les synthetiseurs
VHDL le font).
C-à-d que la spécification d'Ada exige une certaine disposition dans
la mémoire ? Que si j'écris quelque chose comme :
record Header
flag1 : Boolean ;
id1 : mod 8 ;
flag2 : Boolean ;
id2 : mod 8 ;
end record ;
je suis garantie d'avoir une structure d'un octet, avec flag1 sur le
bit 7, id1 sur les bits 6-4, flag2 sur le bit 3 et id2 sur les bits
2-0 ?
Par exemple
A = A(A'Low) & A(A'Hight .. A'Low+1);
pour une rotation.
(Euh, si on continue comme ca, il va falloir mettre fcla en copie, ne
fut-ce que pour corriger ma memoire.)
Tout à fait. Parce que pour commencer, je ne comprends pas du tout ton
Ada. (Probablement parce que je ne connais pas Ada, pour commencer:-).)
Jean-Marc Bourguet wrote in message
news:...writes:
Les types modular ont globalement la meme semantique que les
unsigned en C++ (a part qu'on peut s'amuser a avoir des modular
sur autre chose que les puissances de 2, mais la le comite s'est
amuse). Il y a Natural pour la semantique que certains aimeraient
donner a unsigned :-)
Je crois qu'on peut dire que pour les « petits » types, le système
de types d'Ada est beaucoup plus puissant et plus souple que celui
de C++. Quand on commence à définir des classes, avec comportement,
en revanche, je ne sais pas. Je n'ai pas d'expérience avec Ada pour
dire, mais j'ai du mal à imaginer quelque chose de plus souple que
ce qu'offre le C++.
En revanche, je ne trouve pas de décalages, même dans les
fonctions prédéfinies (Appendice A). Mais peut-être je ne sais
pas où chercher.
C'est donc mon souvenir (si j'ai bonne memoire, gnat a des
fonctions intrinseques pour ca et peut-etre meme les rotations,
mais ce n'est pas standard).
Ce qui m'a un peu étonné. Tous les Pascal et les Modula dont je me
suis servis en avait. L'utilité en était donc bien connue.Naturellement, un moyen naturel en Ada (le seul disponible en
Ada83; en Ada95 il y a en plus les modular) de manipuler des bits,
c'est d'utiliser des tableaux (compactes) de booleens.
D'une part, il ne s'agit pas seulement de manipuler les bits. La
seule utilisation que j'en fais, c'est d'insérer et d'extraire des
champs dans les octets, ou éventuellement des mots, surtout pour
être conforme à un format binaire externe -- protocol de
transmission, etc. C-à-d que dans un octet, je peux être amener à
traiter deux champs de 3 bits, et deux d'un bit. Ou un champs de 4
bits et deux de 2. C'est donc un espèce de struct avec bit fields
dont j'ai besoin.
De l'autre part, la disposition physique m'importe énormement.
Conceptuellement, j'ai exactement ce qu'il me faut avec les bit
fields de C/C++. Dans la pratique, en revanche, le fait que la norme
n'impose aucune disposition physique en mémoire, et que les
compilateurs varient réelement de l'un à l'autre à cet égard, les
rend inutilisable pour cette application.Auquel cas la concatenation de tableaux et l'utilisation
d'intervalles permettent d'exprimer les operations naturellements
(et c'est vraissemblablement des idiomes reconnus pas les
compilateurs -- j'ai jamais verifie en Ada mais les synthetiseurs
VHDL le font).
C-à-d que la spécification d'Ada exige une certaine disposition dans
la mémoire ? Que si j'écris quelque chose comme :
record Header
flag1 : Boolean ;
id1 : mod 8 ;
flag2 : Boolean ;
id2 : mod 8 ;
end record ;
je suis garantie d'avoir une structure d'un octet, avec flag1 sur le
bit 7, id1 sur les bits 6-4, flag2 sur le bit 3 et id2 sur les bits
2-0 ?
Par exemple
A = A(A'Low) & A(A'Hight .. A'Low+1);
pour une rotation.
(Euh, si on continue comme ca, il va falloir mettre fcla en copie, ne
fut-ce que pour corriger ma memoire.)
Tout à fait. Parce que pour commencer, je ne comprends pas du tout ton
Ada. (Probablement parce que je ne connais pas Ada, pour commencer:-).)
A ma connaissance, les seuls points ou C++ a une souplesse
incontestable en plus qu'Ada, c'est la gestion de la genericite
Avec ce que tu as ecrit, la seule garantie c'est que le compilateur
refuse. Avec
type Mod8 is mod 8;
type Header is record
flag1 : Boolean;
id1 : Mod8;
flag2 : Boolean;
id2 : Mod8;
end record;
Par exemple
A = A(A'Low) & A(A'Hight .. A'Low+1);
pour une rotation.
Si je te dis que le & est l'operateur de concatenation en Ada et que
A'Low designe l'indice le plus petit du tableau et A'High l'indice le
plus grand ca suffit?
A ma connaissance, les seuls points ou C++ a une souplesse
incontestable en plus qu'Ada, c'est la gestion de la genericite
Avec ce que tu as ecrit, la seule garantie c'est que le compilateur
refuse. Avec
type Mod8 is mod 8;
type Header is record
flag1 : Boolean;
id1 : Mod8;
flag2 : Boolean;
id2 : Mod8;
end record;
Par exemple
A = A(A'Low) & A(A'Hight .. A'Low+1);
pour une rotation.
Si je te dis que le & est l'operateur de concatenation en Ada et que
A'Low designe l'indice le plus petit du tableau et A'High l'indice le
plus grand ca suffit?
A ma connaissance, les seuls points ou C++ a une souplesse
incontestable en plus qu'Ada, c'est la gestion de la genericite
Avec ce que tu as ecrit, la seule garantie c'est que le compilateur
refuse. Avec
type Mod8 is mod 8;
type Header is record
flag1 : Boolean;
id1 : Mod8;
flag2 : Boolean;
id2 : Mod8;
end record;
Par exemple
A = A(A'Low) & A(A'Hight .. A'Low+1);
pour une rotation.
Si je te dis que le & est l'operateur de concatenation en Ada et que
A'Low designe l'indice le plus petit du tableau et A'High l'indice le
plus grand ca suffit?
C-à-d que la spécification d'Ada exige une certaine disposition dans la
mémoire ? Que si j'écris quelque chose comme :
record Header
flag1 : Boolean ;
id1 : mod 8 ;
flag2 : Boolean ;
id2 : mod 8 ;
end record ;
je suis garantie d'avoir une structure d'un octet, avec flag1 sur le bit
7, id1 sur les bits 6-4, flag2 sur le bit 3 et id2 sur les bits 2-0 ?
C-à-d que la spécification d'Ada exige une certaine disposition dans la
mémoire ? Que si j'écris quelque chose comme :
record Header
flag1 : Boolean ;
id1 : mod 8 ;
flag2 : Boolean ;
id2 : mod 8 ;
end record ;
je suis garantie d'avoir une structure d'un octet, avec flag1 sur le bit
7, id1 sur les bits 6-4, flag2 sur le bit 3 et id2 sur les bits 2-0 ?
C-à-d que la spécification d'Ada exige une certaine disposition dans la
mémoire ? Que si j'écris quelque chose comme :
record Header
flag1 : Boolean ;
id1 : mod 8 ;
flag2 : Boolean ;
id2 : mod 8 ;
end record ;
je suis garantie d'avoir une structure d'un octet, avec flag1 sur le bit
7, id1 sur les bits 6-4, flag2 sur le bit 3 et id2 sur les bits 2-0 ?
C-à-d que la spécification d'Ada exige une certaine disposition dans la
mémoire ? Que si j'écris quelque chose comme :
record Header
flag1 : Boolean ;
id1 : mod 8 ;
flag2 : Boolean ;
id2 : mod 8 ;
end record ;
je suis garantie d'avoir une structure d'un octet, avec flag1 sur le bit
7, id1 sur les bits 6-4, flag2 sur le bit 3 et id2 sur les bits 2-0 ?
C-à-d que la spécification d'Ada exige une certaine disposition dans la
mémoire ? Que si j'écris quelque chose comme :
record Header
flag1 : Boolean ;
id1 : mod 8 ;
flag2 : Boolean ;
id2 : mod 8 ;
end record ;
je suis garantie d'avoir une structure d'un octet, avec flag1 sur le bit
7, id1 sur les bits 6-4, flag2 sur le bit 3 et id2 sur les bits 2-0 ?
C-à-d que la spécification d'Ada exige une certaine disposition dans la
mémoire ? Que si j'écris quelque chose comme :
record Header
flag1 : Boolean ;
id1 : mod 8 ;
flag2 : Boolean ;
id2 : mod 8 ;
end record ;
je suis garantie d'avoir une structure d'un octet, avec flag1 sur le bit
7, id1 sur les bits 6-4, flag2 sur le bit 3 et id2 sur les bits 2-0 ?
writes:Jean-Marc Bourguet wrote in message
news:...writes:
Les types modular ont globalement la meme semantique que les
unsigned en C++ (a part qu'on peut s'amuser a avoir des modular
sur autre chose que les puissances de 2, mais la le comite s'est
amuse). Il y a Natural pour la semantique que certains aimeraient
donner a unsigned :-)
Je crois qu'on peut dire que pour les « petits » types, le système
de types d'Ada est beaucoup plus puissant et plus souple que celui
de C++. Quand on commence à définir des classes, avec comportement,
en revanche, je ne sais pas. Je n'ai pas d'expérience avec Ada pour
dire, mais j'ai du mal à imaginer quelque chose de plus souple que
ce qu'offre le C++.
A ma connaissance, les seuls points ou C++ a une souplesse
incontestable en plus qu'Ada, c'est la gestion de la genericite et
l'heritage multiple. Et je ne suis pas sur que les complications de
l'heritage multiple complet comme en C++ vaillent la peine (un
heritage multiple restreint comme en Java -- disons un ou on ne peux
pas ajouter des membres donnees -- me semble un bon compromis, et
c'etait la voie prise par le comite de normalisation Ada la derniere
fois que j'ai regarde).
Pour le reste c'est ou bien mitige (les deux ont les defaults de leurs
qualites) ou bien a l'avantage d'Ada (taches/threads et programme
distribue totalement hors langage en C++ par exemple).
Auquel cas la concatenation de tableaux et l'utilisation
d'intervalles permettent d'exprimer les operations naturellements
(et c'est vraissemblablement des idiomes reconnus pas les
compilateurs -- j'ai jamais verifie en Ada mais les synthetiseurs
VHDL le font).
C-à-d que la spécification d'Ada exige une certaine disposition dans
la mémoire ? Que si j'écris quelque chose comme :
record Header
flag1 : Boolean ;
id1 : mod 8 ;
flag2 : Boolean ;
id2 : mod 8 ;
end record ;
je suis garantie d'avoir une structure d'un octet, avec flag1 sur le
bit 7, id1 sur les bits 6-4, flag2 sur le bit 3 et id2 sur les bits
2-0 ?
Avec ce que tu as ecrit, la seule garantie c'est que le compilateur
refuse. Avec
type Mod8 is mod 8;
type Header is record
flag1 : Boolean;
id1 : Mod8;
flag2 : Boolean;
id2 : Mod8;
end record;
Tu n'as aucune garantie. Si tu mets en plus un
pragma Packet(Header); -- syntaxe a verifier
tu as le mieux que peut faire le compilateur, vraissemblablement ce
que tu veux.
Tu peux aussi utiliser
for Header'size use 1; -- a nouveau syntaxe a verifier
qui force l'erreur de compilation si le compilateur n'arrive pas a
mettre tout sur 1 byte.
Tu peux etre plus precis en specifiant exactement ce que tu veux, y
compris la presence de bits de padding (recherche "representation
clause", ce qui est la troisieme maniere de faire des manipulations a
ce niveau que j'avais oublie parce qu'elle est implicite).
A ce niveau, il y a une difference entre
- ce que le langage est capable d'exprimer
- ce que les compilateurs acceptent de faire
- ce que la norme exige comme capacite minimale
Autrement dit ce n'est pas toujours portable.
Par exemple
A = A(A'Low) & A(A'Hight .. A'Low+1);
pour une rotation.
(Euh, si on continue comme ca, il va falloir mettre fcla en copie,
ne fut-ce que pour corriger ma memoire.)
Tout à fait. Parce que pour commencer, je ne comprends pas du tout
ton Ada. (Probablement parce que je ne connais pas Ada, pour
commencer:-).)
Si je te dis que le & est l'operateur de concatenation en Ada et que
A'Low designe l'indice le plus petit du tableau et A'High l'indice le
plus grand ca suffit?
kanze@gabi-soft.fr writes:
Jean-Marc Bourguet <jm@bourguet.org> wrote in message
news:<pxbisd9tlys.fsf@news.bourguet.org>...
kanze@gabi-soft.fr writes:
Les types modular ont globalement la meme semantique que les
unsigned en C++ (a part qu'on peut s'amuser a avoir des modular
sur autre chose que les puissances de 2, mais la le comite s'est
amuse). Il y a Natural pour la semantique que certains aimeraient
donner a unsigned :-)
Je crois qu'on peut dire que pour les « petits » types, le système
de types d'Ada est beaucoup plus puissant et plus souple que celui
de C++. Quand on commence à définir des classes, avec comportement,
en revanche, je ne sais pas. Je n'ai pas d'expérience avec Ada pour
dire, mais j'ai du mal à imaginer quelque chose de plus souple que
ce qu'offre le C++.
A ma connaissance, les seuls points ou C++ a une souplesse
incontestable en plus qu'Ada, c'est la gestion de la genericite et
l'heritage multiple. Et je ne suis pas sur que les complications de
l'heritage multiple complet comme en C++ vaillent la peine (un
heritage multiple restreint comme en Java -- disons un ou on ne peux
pas ajouter des membres donnees -- me semble un bon compromis, et
c'etait la voie prise par le comite de normalisation Ada la derniere
fois que j'ai regarde).
Pour le reste c'est ou bien mitige (les deux ont les defaults de leurs
qualites) ou bien a l'avantage d'Ada (taches/threads et programme
distribue totalement hors langage en C++ par exemple).
Auquel cas la concatenation de tableaux et l'utilisation
d'intervalles permettent d'exprimer les operations naturellements
(et c'est vraissemblablement des idiomes reconnus pas les
compilateurs -- j'ai jamais verifie en Ada mais les synthetiseurs
VHDL le font).
C-à-d que la spécification d'Ada exige une certaine disposition dans
la mémoire ? Que si j'écris quelque chose comme :
record Header
flag1 : Boolean ;
id1 : mod 8 ;
flag2 : Boolean ;
id2 : mod 8 ;
end record ;
je suis garantie d'avoir une structure d'un octet, avec flag1 sur le
bit 7, id1 sur les bits 6-4, flag2 sur le bit 3 et id2 sur les bits
2-0 ?
Avec ce que tu as ecrit, la seule garantie c'est que le compilateur
refuse. Avec
type Mod8 is mod 8;
type Header is record
flag1 : Boolean;
id1 : Mod8;
flag2 : Boolean;
id2 : Mod8;
end record;
Tu n'as aucune garantie. Si tu mets en plus un
pragma Packet(Header); -- syntaxe a verifier
tu as le mieux que peut faire le compilateur, vraissemblablement ce
que tu veux.
Tu peux aussi utiliser
for Header'size use 1; -- a nouveau syntaxe a verifier
qui force l'erreur de compilation si le compilateur n'arrive pas a
mettre tout sur 1 byte.
Tu peux etre plus precis en specifiant exactement ce que tu veux, y
compris la presence de bits de padding (recherche "representation
clause", ce qui est la troisieme maniere de faire des manipulations a
ce niveau que j'avais oublie parce qu'elle est implicite).
A ce niveau, il y a une difference entre
- ce que le langage est capable d'exprimer
- ce que les compilateurs acceptent de faire
- ce que la norme exige comme capacite minimale
Autrement dit ce n'est pas toujours portable.
Par exemple
A = A(A'Low) & A(A'Hight .. A'Low+1);
pour une rotation.
(Euh, si on continue comme ca, il va falloir mettre fcla en copie,
ne fut-ce que pour corriger ma memoire.)
Tout à fait. Parce que pour commencer, je ne comprends pas du tout
ton Ada. (Probablement parce que je ne connais pas Ada, pour
commencer:-).)
Si je te dis que le & est l'operateur de concatenation en Ada et que
A'Low designe l'indice le plus petit du tableau et A'High l'indice le
plus grand ca suffit?
writes:Jean-Marc Bourguet wrote in message
news:...writes:
Les types modular ont globalement la meme semantique que les
unsigned en C++ (a part qu'on peut s'amuser a avoir des modular
sur autre chose que les puissances de 2, mais la le comite s'est
amuse). Il y a Natural pour la semantique que certains aimeraient
donner a unsigned :-)
Je crois qu'on peut dire que pour les « petits » types, le système
de types d'Ada est beaucoup plus puissant et plus souple que celui
de C++. Quand on commence à définir des classes, avec comportement,
en revanche, je ne sais pas. Je n'ai pas d'expérience avec Ada pour
dire, mais j'ai du mal à imaginer quelque chose de plus souple que
ce qu'offre le C++.
A ma connaissance, les seuls points ou C++ a une souplesse
incontestable en plus qu'Ada, c'est la gestion de la genericite et
l'heritage multiple. Et je ne suis pas sur que les complications de
l'heritage multiple complet comme en C++ vaillent la peine (un
heritage multiple restreint comme en Java -- disons un ou on ne peux
pas ajouter des membres donnees -- me semble un bon compromis, et
c'etait la voie prise par le comite de normalisation Ada la derniere
fois que j'ai regarde).
Pour le reste c'est ou bien mitige (les deux ont les defaults de leurs
qualites) ou bien a l'avantage d'Ada (taches/threads et programme
distribue totalement hors langage en C++ par exemple).
Auquel cas la concatenation de tableaux et l'utilisation
d'intervalles permettent d'exprimer les operations naturellements
(et c'est vraissemblablement des idiomes reconnus pas les
compilateurs -- j'ai jamais verifie en Ada mais les synthetiseurs
VHDL le font).
C-à-d que la spécification d'Ada exige une certaine disposition dans
la mémoire ? Que si j'écris quelque chose comme :
record Header
flag1 : Boolean ;
id1 : mod 8 ;
flag2 : Boolean ;
id2 : mod 8 ;
end record ;
je suis garantie d'avoir une structure d'un octet, avec flag1 sur le
bit 7, id1 sur les bits 6-4, flag2 sur le bit 3 et id2 sur les bits
2-0 ?
Avec ce que tu as ecrit, la seule garantie c'est que le compilateur
refuse. Avec
type Mod8 is mod 8;
type Header is record
flag1 : Boolean;
id1 : Mod8;
flag2 : Boolean;
id2 : Mod8;
end record;
Tu n'as aucune garantie. Si tu mets en plus un
pragma Packet(Header); -- syntaxe a verifier
tu as le mieux que peut faire le compilateur, vraissemblablement ce
que tu veux.
Tu peux aussi utiliser
for Header'size use 1; -- a nouveau syntaxe a verifier
qui force l'erreur de compilation si le compilateur n'arrive pas a
mettre tout sur 1 byte.
Tu peux etre plus precis en specifiant exactement ce que tu veux, y
compris la presence de bits de padding (recherche "representation
clause", ce qui est la troisieme maniere de faire des manipulations a
ce niveau que j'avais oublie parce qu'elle est implicite).
A ce niveau, il y a une difference entre
- ce que le langage est capable d'exprimer
- ce que les compilateurs acceptent de faire
- ce que la norme exige comme capacite minimale
Autrement dit ce n'est pas toujours portable.
Par exemple
A = A(A'Low) & A(A'Hight .. A'Low+1);
pour une rotation.
(Euh, si on continue comme ca, il va falloir mettre fcla en copie,
ne fut-ce que pour corriger ma memoire.)
Tout à fait. Parce que pour commencer, je ne comprends pas du tout
ton Ada. (Probablement parce que je ne connais pas Ada, pour
commencer:-).)
Si je te dis que le & est l'operateur de concatenation en Ada et que
A'Low designe l'indice le plus petit du tableau et A'High l'indice le
plus grand ca suffit?
Jean-Marc Bourguet wrote in message
news:...Pour le reste c'est ou bien mitige (les deux ont les defaults de leurs
qualites) ou bien a l'avantage d'Ada (taches/threads et programme
distribue totalement hors langage en C++ par exemple).
Les taches et les threads jouent sur le typage ?
Tu n'as aucune garantie. Si tu mets en plus un
pragma Packet(Header); -- syntaxe a verifier
tu as le mieux que peut faire le compilateur, vraissemblablement ce
que tu veux.
Est-ce que j'ai une garantie en ce qui concerne l'ordre dans le mot.
Tu peux aussi utiliser
for Header'size use 1; -- a nouveau syntaxe a verifier
qui force l'erreur de compilation si le compilateur n'arrive pas a
mettre tout sur 1 byte.
Il faut non seulement que ça tient sur un octet, il faut que l'ordre des
bits correspond.
Tu peux etre plus precis en specifiant exactement ce que tu veux, y
compris la presence de bits de padding (recherche "representation
clause", ce qui est la troisieme maniere de faire des manipulations a
ce niveau que j'avais oublie parce qu'elle est implicite).
A ce niveau, il y a une difference entre
- ce que le langage est capable d'exprimer
- ce que les compilateurs acceptent de faire
- ce que la norme exige comme capacite minimale
Autrement dit ce n'est pas toujours portable.
Mais si ça compile, j'ai ce que je veux:-).
Par exemple
A = A(A'Low) & A(A'Hight .. A'Low+1);
pour une rotation.
(Euh, si on continue comme ca, il va falloir mettre fcla en copie,
ne fut-ce que pour corriger ma memoire.)
Tout à fait. Parce que pour commencer, je ne comprends pas du tout
ton Ada. (Probablement parce que je ne connais pas Ada, pour
commencer:-).)
Si je te dis que le & est l'operateur de concatenation en Ada et que
A'Low designe l'indice le plus petit du tableau et A'High l'indice le
plus grand ca suffit?
Oui. Pour ce cas-ci, en tout cas. Mon expérience avec les langages de la
famille Pascal ne me permet pas à déviner ce que signifie l'opérateur '.
Jean-Marc Bourguet <jm@bourguet.org> wrote in message
news:<pxbhdssrrhs.fsf@news.bourguet.org>...
Pour le reste c'est ou bien mitige (les deux ont les defaults de leurs
qualites) ou bien a l'avantage d'Ada (taches/threads et programme
distribue totalement hors langage en C++ par exemple).
Les taches et les threads jouent sur le typage ?
Tu n'as aucune garantie. Si tu mets en plus un
pragma Packet(Header); -- syntaxe a verifier
tu as le mieux que peut faire le compilateur, vraissemblablement ce
que tu veux.
Est-ce que j'ai une garantie en ce qui concerne l'ordre dans le mot.
Tu peux aussi utiliser
for Header'size use 1; -- a nouveau syntaxe a verifier
qui force l'erreur de compilation si le compilateur n'arrive pas a
mettre tout sur 1 byte.
Il faut non seulement que ça tient sur un octet, il faut que l'ordre des
bits correspond.
Tu peux etre plus precis en specifiant exactement ce que tu veux, y
compris la presence de bits de padding (recherche "representation
clause", ce qui est la troisieme maniere de faire des manipulations a
ce niveau que j'avais oublie parce qu'elle est implicite).
A ce niveau, il y a une difference entre
- ce que le langage est capable d'exprimer
- ce que les compilateurs acceptent de faire
- ce que la norme exige comme capacite minimale
Autrement dit ce n'est pas toujours portable.
Mais si ça compile, j'ai ce que je veux:-).
Par exemple
A = A(A'Low) & A(A'Hight .. A'Low+1);
pour une rotation.
(Euh, si on continue comme ca, il va falloir mettre fcla en copie,
ne fut-ce que pour corriger ma memoire.)
Tout à fait. Parce que pour commencer, je ne comprends pas du tout
ton Ada. (Probablement parce que je ne connais pas Ada, pour
commencer:-).)
Si je te dis que le & est l'operateur de concatenation en Ada et que
A'Low designe l'indice le plus petit du tableau et A'High l'indice le
plus grand ca suffit?
Oui. Pour ce cas-ci, en tout cas. Mon expérience avec les langages de la
famille Pascal ne me permet pas à déviner ce que signifie l'opérateur '.
Jean-Marc Bourguet wrote in message
news:...Pour le reste c'est ou bien mitige (les deux ont les defaults de leurs
qualites) ou bien a l'avantage d'Ada (taches/threads et programme
distribue totalement hors langage en C++ par exemple).
Les taches et les threads jouent sur le typage ?
Tu n'as aucune garantie. Si tu mets en plus un
pragma Packet(Header); -- syntaxe a verifier
tu as le mieux que peut faire le compilateur, vraissemblablement ce
que tu veux.
Est-ce que j'ai une garantie en ce qui concerne l'ordre dans le mot.
Tu peux aussi utiliser
for Header'size use 1; -- a nouveau syntaxe a verifier
qui force l'erreur de compilation si le compilateur n'arrive pas a
mettre tout sur 1 byte.
Il faut non seulement que ça tient sur un octet, il faut que l'ordre des
bits correspond.
Tu peux etre plus precis en specifiant exactement ce que tu veux, y
compris la presence de bits de padding (recherche "representation
clause", ce qui est la troisieme maniere de faire des manipulations a
ce niveau que j'avais oublie parce qu'elle est implicite).
A ce niveau, il y a une difference entre
- ce que le langage est capable d'exprimer
- ce que les compilateurs acceptent de faire
- ce que la norme exige comme capacite minimale
Autrement dit ce n'est pas toujours portable.
Mais si ça compile, j'ai ce que je veux:-).
Par exemple
A = A(A'Low) & A(A'Hight .. A'Low+1);
pour une rotation.
(Euh, si on continue comme ca, il va falloir mettre fcla en copie,
ne fut-ce que pour corriger ma memoire.)
Tout à fait. Parce que pour commencer, je ne comprends pas du tout
ton Ada. (Probablement parce que je ne connais pas Ada, pour
commencer:-).)
Si je te dis que le & est l'operateur de concatenation en Ada et que
A'Low designe l'indice le plus petit du tableau et A'High l'indice le
plus grand ca suffit?
Oui. Pour ce cas-ci, en tout cas. Mon expérience avec les langages de la
famille Pascal ne me permet pas à déviner ce que signifie l'opérateur '.
Alexandre BACQUART wrote in message
news:<40e0516c$0$29365$...C'est aussi une manière de
ne pas faire confiance au compilateur pour optimiser des
multiplications/divisions par des puissances de 2 en invoquant
soi-même l'opération de décalage (souvent un mnémonique dédiée
du processeur).
Sauf qu'il y a des processeurs où la multiplication est plus
rapide que le décalage, et où ce n'est pas le cas, le
compilateur en général sait mieux faire que toi.
On ne s'en sert jamais pour l'optimisation.
Alexandre BACQUART <tek512@hotmail.com> wrote in message
news:<40e0516c$0$29365$626a14ce@news.free.fr>...
C'est aussi une manière de
ne pas faire confiance au compilateur pour optimiser des
multiplications/divisions par des puissances de 2 en invoquant
soi-même l'opération de décalage (souvent un mnémonique dédiée
du processeur).
Sauf qu'il y a des processeurs où la multiplication est plus
rapide que le décalage, et où ce n'est pas le cas, le
compilateur en général sait mieux faire que toi.
On ne s'en sert jamais pour l'optimisation.
Alexandre BACQUART wrote in message
news:<40e0516c$0$29365$...C'est aussi une manière de
ne pas faire confiance au compilateur pour optimiser des
multiplications/divisions par des puissances de 2 en invoquant
soi-même l'opération de décalage (souvent un mnémonique dédiée
du processeur).
Sauf qu'il y a des processeurs où la multiplication est plus
rapide que le décalage, et où ce n'est pas le cas, le
compilateur en général sait mieux faire que toi.
On ne s'en sert jamais pour l'optimisation.