Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Sous chaine de caractères

24 views
Skip to first unread message

Olivier

unread,
Feb 24, 2013, 12:31:46 PM2/24/13
to
Bonjour,

Je reviens avec une question.
J'essai de scinder une chaine de caractᅵres sur le caractᅵre espace.
sDate contient "22 fevrier 2013" et je souhaite isoler "fevrier".
[code]
sDate : String (1..30);
sMois : String (1..15);
iJour : Integer;

i := 4;
--WHILE SDate(I) /= ' ' LOOP
-- I := I + 1;
--END LOOP;
for i in sDate'range loop
if sDate(i) = ' '
then indice := i-1 ;
end if ;
end loop ;
put_line("Indice : " & integer'image(indice));
sMois := sDate(4..indice);
Put_Line("Mois : " & sMois);
iJour := Integer'Value(SDate(1..2)); put_line("Jour : "
Integer'Image(iJour));
[/code]
Avec ᅵa j'ai une belle erreur ᅵ l'execution :
raised CONSTRAINT_ERROR : length check failed.
J'ai bien compris que c'est un problᅵme de longeur de ma chaine sDate
mais je ne comprens pas pourquoi il me jete...
Merci de votre aide ᅵ y voir plus clair.
Olivier


Ludovic Brenta

unread,
Feb 24, 2013, 2:22:10 PM2/24/13
to
Olivier writes on fr.comp.lang.ada:
> Bonjour,
>
> Je reviens avec une question.
> J'essai de scinder une chaine de caract�res sur le caract�re espace.
> sDate contient "22 fevrier 2013" et je souhaite isoler "fevrier".
> [code]
> sDate : String (1..30);
> sMois : String (1..15);
> iJour : Integer;
>
> i := 4;
> --WHILE SDate(I) /= ' ' LOOP
> -- I := I + 1;
> --END LOOP;
> for i in sDate'range loop
> if sDate(i) = ' '
> then indice := i-1 ;
> end if ;
> end loop ;
> put_line("Indice : " & integer'image(indice));
> sMois := sDate(4..indice);

Ada requiert que la taille de sMois (15 caract�res) soit exactement la
m�me que celle de sDate (4 .. indice), laquelle est variable.

Essaie avec des Unbounded_String ou, mieux, �vite compl�tement de
recopier des cha�nes si tu peux: ne recopie que les indices.

> Put_Line("Mois : " & sMois);
> iJour := Integer'Value(SDate(1..2)); put_line("Jour : "
> Integer'Image(iJour));
> [/code]
> Avec �a j'ai une belle erreur � l'execution :
> raised CONSTRAINT_ERROR : length check failed.
> J'ai bien compris que c'est un probl�me de longeur de ma chaine sDate
> mais je ne comprens pas pourquoi il me jete...
> Merci de votre aide � y voir plus clair.
> Olivier

--
Ludovic Brenta.

Olivier

unread,
Feb 26, 2013, 1:28:41 PM2/26/13
to
Bonjour et merci pour la rᅵponse mais je ne vois pas comment ne
recopier que les indices.
Un indice ?

Merci

Ludovic Brenta a ᅵmis l'idᅵe suivante :
> Olivier writes on fr.comp.lang.ada:
>> Bonjour,
>>
>> Je reviens avec une question.
>> J'essai de scinder une chaine de caractᅵres sur le caractᅵre espace.
>> sDate contient "22 fevrier 2013" et je souhaite isoler "fevrier".
>> [code]
>> sDate : String (1..30);
>> sMois : String (1..15);
>> iJour : Integer;
>>
>> i := 4;
>> --WHILE SDate(I) /= ' ' LOOP
>> -- I := I + 1;
>> --END LOOP;
>> for i in sDate'range loop
>> if sDate(i) = ' '
>> then indice := i-1 ;
>> end if ;
>> end loop ;
>> put_line("Indice : " & integer'image(indice));
>> sMois := sDate(4..indice);
>
> Ada requiert que la taille de sMois (15 caractᅵres) soit exactement la
> mᅵme que celle de sDate (4 .. indice), laquelle est variable.
>
> Essaie avec des Unbounded_String ou, mieux, ᅵvite complᅵtement de
> recopier des chaᅵnes si tu peux: ne recopie que les indices.
>
>> Put_Line("Mois : " & sMois);
>> iJour := Integer'Value(SDate(1..2)); put_line("Jour : "
>> Integer'Image(iJour));
>> [/code]
>> Avec ᅵa j'ai une belle erreur ᅵ l'execution :
>> raised CONSTRAINT_ERROR : length check failed.
>> J'ai bien compris que c'est un problᅵme de longeur de ma chaine sDate
>> mais je ne comprens pas pourquoi il me jete...
>> Merci de votre aide ᅵ y voir plus clair.
>> Olivier


Ludovic Brenta

unread,
Feb 26, 2013, 3:57:24 PM2/26/13
to
Olivier <prog...@free.fr> writes:
> Bonjour et merci pour la r�ponse mais je ne vois pas comment ne
> recopier que les indices.
> Un indice ?

Quelque chose comme:

type Range is record
First, Last : Natural;
end record;
procedure Split (Date_String : in String; -- format: "dd month yyyy"
Day_Range : out Range;
Month_Range : out Range;
Year_Range : out Range);


ou encore quelque chose d'inspir� d'Ada.Calendars.Formatting (ARM
9.6.1).

--
Ludovic Brenta.

cjps...@gmail.com

unread,
Feb 26, 2013, 5:40:33 PM2/26/13
to
Le mardi 26 février 2013 21:57:24 UTC+1, Ludovic Brenta a écrit :
> Olivier <prog...@free.fr> writes:
>
> > Bonjour et merci pour la r�ponse mais je ne vois pas comment ne
>
> > recopier que les indices.
>
> > Un indice ?
>
>
>
> Quelque chose comme:
>
>
>
> type Range is record
>
> First, Last : Natural;
>
> end record;
>
> procedure Split (Date_String : in String; -- format: "dd month yyyy"
>
> Day_Range : out Range;
>
> Month_Range : out Range;
>
> Year_Range : out Range);
>
>
>
>
>
> ou encore quelque chose d'inspir� d'Ada.Calendars.Formatting (ARM
>
> 9.6.1).
>
>
>
> --
>
> Ludovic Brenta.

Sauf que range est un mot réservé du langage.

Cela serait bien si on pouvait écrire un truc comme :

type Rng is range First..Last of Natural;

R : Rng := (First => i1, Last => i2);

et avoir Mois : String := D (Rng);

Peut-être pour 2017 :-)

Claude Simon

J-P. Rosen

unread,
Feb 27, 2013, 12:23:08 AM2/27/13
to
Le 26/02/2013 23:40, cjps...@gmail.com a �crit :
> Cela serait bien si on pouvait �crire un truc comme :
>
> type Rng is range First..Last of Natural;
>
> R : Rng := (First => i1, Last => i2);
>
> et avoir Mois : String := D (Rng);
>
> Peut-�tre pour 2017 :-)
>
Sorry, je n'ai pas compris ni ce que �a fait, ni l'int�r�t que cela a.
D'abord, si Rng est utilis� pour indexer String, il faut que ce soit un
sous-type de Natural, pas un type diff�rent. Ensuite, c'est quoi First
et Last? Des param�tres? A quoi sert R ?

Tu peux d�tailler?

--
J-P. Rosen
Adalog
2 rue du Docteur Lombard, 92441 Issy-les-Moulineaux CEDEX
Tel: +33 1 45 29 21 52, Fax: +33 1 45 29 25 00
http://www.adalog.fr

cjps...@gmail.com

unread,
Feb 27, 2013, 3:01:55 AM2/27/13
to
Le mercredi 27 février 2013 06:23:08 UTC+1, J-P. Rosen a écrit :
> Le 26/02/2013 23:40, cjps...@gmail.com a �crit :
>
> > Cela serait bien si on pouvait �crire un truc comme :
>
> >
>
> > type Rng is range First..Last of Natural;
>
> >
>
> > R : Rng := (First => i1, Last => i2);
>
> >
>
> > et avoir Mois : String := D (Rng);
>
> >
>
> > Peut-�tre pour 2017 :-)
>
> >
>
> Sorry, je n'ai pas compris ni ce que �a fait, ni l'int�r�t que cela a.
>
> D'abord, si Rng est utilis� pour indexer String, il faut que ce soit un
>
> sous-type de Natural, pas un type diff�rent. Ensuite, c'est quoi First
>
> et Last? Des param�tres? A quoi sert R ?
>
>
>
> Tu peux d�tailler?
>
>
>
> --
>
> J-P. Rosen
>
> Adalog
>
> 2 rue du Docteur Lombard, 92441 Issy-les-Moulineaux CEDEX
>
> Tel: +33 1 45 29 21 52, Fax: +33 1 45 29 25 00
>
> http://www.adalog.fr

Je me suis trompé en rédigeant il fallait écrire :

Mois : String := D (R); au lieu de : Mois : String := D (Rng);

où D est un tableau par exemple un String avec un type d'indice correspondant au range, ici Rnd.

Le but est de fournir un objet représentant un range de manière à pouvoir accéder à une tranche de tableau sans avoir à écrire :

Mois : String := D (R.First .. R.Last);

C'est juste une simplification dans l'écriture.

Mais ce n'est pas de l'Ada.

Claude Simon

Pascal Obry

unread,
Feb 27, 2013, 3:36:16 AM2/27/13
to cjps...@gmail.com
Le 26/02/2013 23:40, cjps...@gmail.com a �crit :
> Sauf que range est un mot r�serv� du langage.
>
> Cela serait bien si on pouvait �crire un truc comme :
>
> type Rng is range First..Last of Natural;
>
> R : Rng := (First => i1, Last => i2);
>
> et avoir Mois : String := D (Rng);
>
> Peut-�tre pour 2017 :-)

Non, c'est pour 1983 :)

subtype Day_Range is positive range 1 .. 2;
subtype Month_Range is positive range 4 .. 5;
subtype Year_Range is positive range 7 .. 10;

Day : String := D (Day_Range);
Month : String := D (Month_Range);
Year : String := D (Year_Range);

--
Pascal Obry / Magny Les Hameaux (78)

The best way to travel is by means of imagination

http://v2p.fr.eu.org
http://www.obry.net

gpg --keyserver keys.gnupg.net --recv-key F949BD3B

cjps...@gmail.com

unread,
Feb 27, 2013, 4:29:52 AM2/27/13
to cjps...@gmail.com
Le mercredi 27 février 2013 09:36:16 UTC+1, Pascal Obry a écrit :
> Le 26/02/2013 23:40, cjps...@gmail.com a �crit :
>
> > Sauf que range est un mot r�serv� du langage.
>
> >
>
> > Cela serait bien si on pouvait �crire un truc comme :
>
> >
>
> > type Rng is range First..Last of Natural;
>
> >
>
> > R : Rng := (First => i1, Last => i2);
>
> >
>
> > et avoir Mois : String := D (Rng);
>
> >
>
> > Peut-�tre pour 2017 :-)
>
>
>
> Non, c'est pour 1983 :)
>
>
>
> subtype Day_Range is positive range 1 .. 2;
>
> subtype Month_Range is positive range 4 .. 5;
>
> subtype Year_Range is positive range 7 .. 10;
>
>
>
> Day : String := D (Day_Range);
>
> Month : String := D (Month_Range);
>
> Year : String := D (Year_Range);
>
>
Oui mais on ne peut pas retourner un sous-type par un appel de procédure.
Un sous-type n'est pas un objet...
Ou bien j'ai manqué quelque chose pendant 30 ans... :-(

Yannick Duchêne (Hibou57)

unread,
Mar 5, 2013, 8:11:20 AM3/5/13
to
Le Tue, 26 Feb 2013 23:40:33 +0100, cjps...@gmail.com
<cjps...@gmail.com> a écrit:
>
> Sauf que range est un mot réservé du langage.
>

Oui, c’est un « problème » qui revient souvent. En Ada, les noms des
choses et les noms des types, appartiennent au même espace de nom. Une
solution simple est d’avoir une convention pour les noms des types, par
exemple leur donner le suffixe “_Type”. Tu peux par exemple définir “type
Range_Type is record … end record;”.

> Cela serait bien si on pouvait écrire un truc comme :
>
> type Rng is range First..Last of Natural;
>
> R : Rng := (First => i1, Last => i2);
>
> et avoir Mois : String := D (Rng);
>
> Peut-être pour 2017 :-)

Je vois ce que tu veux dire, je me suis déjà dit aussi que ce serait bien,
mais le langage est ce qu’il est, les intervalles n’existent pas en temps
qu’objets indépendant (*), ils n’existent que comme attribut des objets
auxquels ils s’appliquent (les tableaux).

Mais après tout, définir un type enregistrement qui fait la même chose, ne
présente pas de difficulté et n’est source d’aucun blocage pratique, alors
il n’y rien d’impérieux à ajouter quelque chose au langage, s’il propose
déjà ce qu’il faut pour le faire.

(*) Sauf sous une forme fixe, quand tu défini un type intervalle. Mais tu
peux pas changer les bornes, et ici, tu veux quelque chose qui serait une
variable intervalle.

--
“Syntactic sugar causes cancer of the semi-colons.” [1]
“Structured Programming supports the law of the excluded muddle.” [1]
[1]: Epigrams on Programming — Alan J. — P. Yale University

Yannick Duchêne (Hibou57)

unread,
Mar 5, 2013, 8:27:00 AM3/5/13
to
Le Tue, 05 Mar 2013 14:11:20 +0100, Yannick Duchêne (Hibou57)
<yannick...@yahoo.fr> a écrit:
> (*) Sauf sous une forme fixe, quand tu défini un type intervalle. Mais
> tu peux pas changer les bornes, et ici, tu veux quelque chose qui serait
> une variable intervalle.

Oops, j’ai cliqué sur « Envoyer » un peu trop vite.

Une note très importante : « fixe », en Ada, ne signifie pas la même chose
que dans les autres langages. Une chose peut être *localement* fixe. Même
si tu ne peux pas modifier les bornes d’un type intervalle après sa
définition, ce type intervalle, peut tout à fait être variable au cours de
l’exécution d’un programme, même s’il est localement fixe pendant
l’exécution locale.

Explication par un exemple concret, ce sera beaucoup plus clair, et ça te
permettra de mieux comprendre ce que voulais dire Pascal (Pascal Obry, pas
le langage :-P ). Essaie ça pour comprendre :


with Ada.Text_IO;
use Ada.Text_IO;

procedure Test
is

function Sous_Chaine
(S : String;
I : Positive;
J : Positive)
return String
is
subtype Range_Type
is Positive
range I .. J;
begin
return S (Range_Type);
end Sous_Chaine;

Chaine_Source :
constant String :=
"22 fevrier 2013";
begin

Put_Line
(Sous_Chaine
(S => Chaine_Source,
I => 1,
J => 2));

Put_Line
(Sous_Chaine
(S => Chaine_Source,
I => 4,
J => 10));

Put_Line
(Sous_Chaine
(S => Chaine_Source,
I => 12,
J => 15));

end Test;


Oh, c’est magique, à l’intérieur de la fonction `Sous_Chaine`, le type
`Range_Type` ne peut plus être modifié une fois qu’il a été défini, mais
il peut être différent à chaque exécution de la fonction `Sous_Chaine`, il
est redéfini à chaque exécution de celle‑ci ;-)

Tu comprends ?

cjps...@gmail.com

unread,
Mar 5, 2013, 9:08:27 AM3/5/13
to
> est redéfini à chaque exécution de celle-ci ;-)
>
>
>
> Tu comprends ?
>
>
>
>
>
> --
>
> "Syntactic sugar causes cancer of the semi-colons." [1]
>
> "Structured Programming supports the law of the excluded muddle." [1]
>
> [1]: Epigrams on Programming -- Alan J. -- P. Yale University

Oui, je connais très bien tout cela.

J'aurais juste souhaité, il y a très longtemps de cela, ce petit allégement syntaxique qui évite d'écrire les intervalles à chaque fois quand on manipule des tranches de tableaux de même sous-type d'indice.

CLaude Simon
0 new messages