Re: Initialiser une chaine de taille contrainte.
Maurice Assouline <[email protected]>
| Newsgroups | gmane.comp.lang.ada.france |
|---|---|
| Message-ID | <0A8EC0B51E0DF24ABA8FDD12B70773D40B6CC59E@ATEGO-MAIL-01.atego.local> |
Bonjour,
Effectivement un agrégat comme ('$', "toto", '$') me parait naturel aussi, mais comme "toto" est une forme d'agrégat, l'autoriser signifierait qu'on autorise des agrégats hétérogènes en termes de typage, avec certains termes de l'agrégat qui sont des composants, et d'autres qui sont eux-mêmes des agrégats ou des tranches de tableau.
Oui mais pourquoi pas des agrégats hétérogènes, ou des agrégats avec des sous-agrégats ?
D'une part cette hétérogénéité/permissivité du typage ne serait pas vraiment dans l'esprit d'Ada, qui tend à interdire les tournures dans lesquelles les intentions du programmeur ne sont pas hyper claires, même quand ce qu'il a écrit est légal.
D'autre part dans certains cas le type de l'agrégat pourrait être ambigu (bien que le contexte permette en général de lever l'ambigüité). Par exemple :
subtype String8 is String(1..8);
type Deux_Dimensions is array (1..8, 1..4) of Character;
Si ce qui suit était légal :
S: String8 := (1..4 => "toto", 5..8 => "titi");
alors, le type de l'agrégat (1..4 => "toto", 5..8 => "titi") serait ambigu, ce type pourrait être String8 ou bien Deux_Dimensions, ou encore un type tel que :
type Huit_Strings is array (1..8) of String(1..4);
Question commodité d'écriture, bien qu'on ne puisse pas mettre un littéral chaine dans un agrégat chaine (c'est-à-dire un agrégat chaine dans un agrégat chaine), on peut à la place utiliser une concaténation d'agrégats. Par exemple :
S: string(1..8) := (1..3 => '$') & "toto" & (1 =>'$'); Ou bien :
S: string(1..8) := (1..3 => '$') & "toto" & '$';
Dommage que ceci ne soit pas accepté (du moins en Ada 95, je ne sais pas en Ada 2005) :
S: string(1..8) := "toto" & (others =>' ');
Cordialement,
Maurice Assouline
-----Message d'origine-----
De : [email protected]<mailto:[email protected]> [mailto:[email protected]]<mailto:[mailto:[email protected]]> De la part de Pascal Envoyé : vendredi 30 décembre 2011 10:37 À : Ludovic Brenta; liste ada-france Objet : Re: [ada-france] Initialiser une chaine de taille contrainte.
Bonjour Ludovic, merci pour ta réponse.
C'est effectivement un des contournements possibles auquel je préfère utiliser Unbounded_String, quoi que...
Bref, ma question voulait surtout illustrer qu'Ada ne permet pas de mettre un littéral chaine dans un agrégat chaine (!) :
toto : constant String := ('$', "toto", '$'); -- erreur sur "toto"
Pourtant cette construction ne me choque pas outre mesure.
Pourquoi n'est-elle pas légale ?
Cordialement, Pascal.
http://blady.pagesperso-orange.fr
Le 29 déc. 2011 à 12:50, Ludovic Brenta a écrit :
> Pascal <[email protected]<mailto:[email protected]>> writes:
>> Bonjour,
>>
>> Voici une question somme toute basique voire pour "débutant" mais les réponses trouvées ne me satisfont pas :
>> comment initialiser simplement une chaine de caractère contrainte en taille avec une valeur chaine (càd "toto") ?
>>
>> Je pourrais utiliser les chaines non contraintes, les très utiles Unbounded_String ou le faire en 2 temps : déclaration et affectation avec Ada.Strings.Fixed.Move.
>>
>> Quel est le problème ?
>> Prenons le type suivant :
>> type TTabChaine is array (1 .. 2) of String (1 .. 13); Initialisons
>> une constante de ce type avec des valeurs chaines de longueurs
>> variables et terminées par Ascii.NUL :
>
> Ce sont des chaînes de longueur fixe, 13 carctères, et le fait que
> l'un d'eux est un ASCII.NUL n'a aucune influence sur la longueur.
>
>> Je dois écrire :
>> NomsOK : constant TTabChaine :=
>> (('F', '1', '2', '.', 't', 'x', 't', ASCII.NUL, others => ' '),
>> ('g', 'n', 'a', 't', '.', 'e', 'x', 'e', ASCII.NUL, others => '
>> '));
>>
>> Ce qui n'est, accordons le, vraiment pas lisible.
>
> type String_Access is access String;
> type String_Array is array (1 .. 2) of String_Access; Strings :
> constant String_Array := (1 => new String'("F12.txt"),
> 2 => new String'("gnat.exe"));
>
> et ne surtout pas ajouter d'ASCII.NUL sauf, éventuellement, au moment
> de passer les chaînes à un sous-programme importé du C. Dans ce
> dernier cas, utiliser Interfaces.C.To_C (...).
>
> --
> Ludovic Brenta.
> _______________________________________________
> Site WWW de l'association Ada-France: http://www.ada-france.org/
> [email protected]<mailto:[email protected]>
> http://www.ada-france.org/mailman/listinfo/ada-france
_______________________________________________
Site WWW de l'association Ada-France: http://www.ada-france.org/ [email protected]<mailto:[email protected]> http://www.ada-france.org/mailman/listinfo/ada-france
_______________________________________________
Site WWW de l'association Ada-France: http://www.ada-france.org/
[email protected]
http://www.ada-france.org/mailman/listinfo/ada-france