Précédent   Forum des professionnels en informatique > Autres langages > Autres langages > Ada
Ada Forum d'entraide sur la programmation en langage Ada
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/11/2011, 20h16   #1
Membre confirmé
 
Inscription : juin 2006
Messages : 649
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : juin 2006
Messages : 649
Points : 276
Points : 276
Par défaut Les chaîne de cractères dans un paquetage passif partagé.

Bonjour,

A tout hasard, serait- il possible de stocker des chaîne de caractère et des tableau de sous chaîne dans un paquetage contenant le pragma Shared_Passive ?
J'ai essayé, et ça n'a pas fonctionné.
Si vous aviez une soluce ?
Merci.
jovalise est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2011, 16h02   #2
Candidat au titre de Membre du Club
 
Inscription : octobre 2010
Messages : 12
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 12
Points : 13
Points : 13
Bonjour,

C'est possible de faire une telle chose, mais avec certaines contraintes vu qu'il me parait suicidaire d'utiliser un pointeur ici...

String étant un tableau commes les autres, pour en avoir une de taille variable, la seule solution "pointeur free" que je connaisse est de passer par un record discriminé. Le discriminant serait alors la taille de la String. Pour indication, je dirai qu'il faut faire attention à l'allocation mémoire d'un tel record.

L'idée serait alors la même pour stocker plusieurs String de taille variable.

En espérant que ces indications vous aident !
Jaizu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2011, 16h42   #3
Membre confirmé
 
Inscription : juin 2006
Messages : 649
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : juin 2006
Messages : 649
Points : 276
Points : 276
J'ai essayé, le compilateur râle parce qu'un tel type contient un type access.
Merci pour l'idée.
jovalise est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2011, 23h15   #4
Candidat au titre de Membre du Club
 
Inscription : octobre 2010
Messages : 12
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 12
Points : 13
Points : 13
En effet... Mes plus humbles excuses ! J'étais persuadé que cette approche n'avait pas de pointeur.

Mais on peut toujours avoir recours au "je fais tout moi-même" : déclarer des constantes qui serviront de bornes, comme la taille maximale d'une chaîne, le nombre maximum de chaînes qu'on peut stocker etc... et définir des "buffer" qui prendront la taille maximale possible pour y stocker les valeurs. Par exemple, on définit la taille maximale d'une chaîne à 64, on définira alors un type dérivé de chaîne qui sera les chaînes de taille 64.

J'ai fait un test rapide et ça fonctionnait. Mais c'est assez "fastidieux" à écrire.
Jaizu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2011, 23h56   #5
Membre confirmé
 
Inscription : juin 2006
Messages : 649
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : juin 2006
Messages : 649
Points : 276
Points : 276
Citation:
Envoyé par Jaizu Voir le message

J'ai fait un test rapide et ça fonctionnait.

Bonsoir Jaizu, t'as testé quoi exactement, parce que moi, pas moyen de mémoriser une chaîne.
jovalise est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 02h07   #6
Candidat au titre de Membre du Club
 
Inscription : octobre 2010
Messages : 12
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 12
Points : 13
Points : 13
J'ai testé en définissant à la main les types servant de buffers.

Code ada :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package sharing is
   pragma Shared_Passive(sharing);

   max_length : constant Positive;

   [...]

private
   max_length : constant Positive := ?;

   subtype Bounding_Range is Positive range 1 .. max_length;

   subtype Bounded_String is String(Bounding_Range'Range);

   type Bounded_Mutable_String is record
      current_length : Natural;
      value : Bounded_String;
   end record;

   [...]

end sharing;

L'idée générale est là. C'est la même chose qu'avec un record discriminé... Mais sans record discriminé, donc sans pointeur et pour de vrai cette fois !

J'ai retrouvé ceci également entre temps : http://www.adacore.com/2007/12/03/ada-gem-20/ qui décrit sensiblement la même chose... En anglais malheureusement
Jaizu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 15h45   #7
Membre confirmé
 
Inscription : juin 2006
Messages : 649
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : juin 2006
Messages : 649
Points : 276
Points : 276
Merci jaizu pour tout ça.

Je viens de tester ton code, ça marche.
C'est à dire que si je déclare une chaîne dans le paquetage sharing, un fichier du nom de la variable est créé, préfixé par le nom du paquetage.
Cette variable est donc persistante au long de divers appel au programme.

Mais ça marche aussi avec une simple déclaration de chaîne

Bref, mon problème est résolu. Bien qu'il n'y en ai jamais eu apparemment.

Merci encore jaizu.
jovalise est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h37.


 
 
 
 
Partenaires

Hébergement Web