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

ne plus utiliser les arrays

66 views
Skip to first unread message

letocha

unread,
Feb 10, 2013, 2:52:08 PM2/10/13
to
Bonjour,

Je bidouille en Ada , et donc ça ne rentre pas facilement.
Bref, voilà, encore des "stack overflows"

J'ai remplacé mes tableaux unidimensionnels par des containers,
formidable plus d'erreurs.
Et puis j'ai eu besoin de tableau 2D dont chaque élément est un containers.
Et là, dès que la "surface" dudit array passe un seuil : paf...stack overflow
Alors j'ai fait des tableaux de pointeurs...mais je m'emberlificote un tantinet le code.
Donc je veux me passer de ces array, sans passer par les pointeurs.

J'ai trouvé cette information :
>>>
Access types should be used rarely in Ada. In a lot of circumstances where pointers are used in other languages, there are other ways without pointers. If you need dynamic data structures, first check whether you can use the Ada Container library. Especially for indefinite record or array components, the Ada 2012 package Indefinite_Holders (RM A.18.18) can be used instead of pointers.
<<<

Mais j'aimerais un exemple simple, une implémentation d'un tableau à deux dimensions sur des entiers, par exemple.

Thanks bcp

J-P. Rosen

unread,
Feb 10, 2013, 4:07:00 PM2/10/13
to
Le 10/02/2013 20:52, letocha a �crit :
> Je bidouille en Ada , et donc �a ne rentre pas facilement.
> Bref, voil�, encore des "stack overflows"

Pour des tableaux de taille "raisonnable", �a n'a pas de raison de faire
des stacks overflow. D'o� je d�duis que tu as peut-�tre une petite
confusion au niveau des tableaux contraints ou non contraints...

Peux-tu nous mettre un peu de ton code (au moins la d�claration des
tableaux), pour qu'on puisse voir ce qui ne va pas?

--
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

letocha

unread,
Feb 11, 2013, 1:17:17 PM2/11/13
to
Le dimanche 10 février 2013 22:07:00 UTC+1, J-P. Rosen a écrit :
>
> Peux-tu nous mettre un peu de ton code (au moins la déclaration des
>
> tableaux), pour qu'on puisse voir ce qui ne va pas?
>

generic
a : in positive;
b : in positive;

package reservoirs is
...
end reservoirs;

package body reservoirs is

___type array2D_bis is array(1..a,1..b) of voisinage; **STACK OVERFLOW

___type ecrans_bis is access array2D_bis;

___sc_bis : ecrans_bis;
....
end reservoirs;

with Ada.Containers.Ordered_Sets;

package voisinages is

___package entiers is new Ada.Containers.ordered_sets(positive);
___use entiers;
____type voisinage is new set with null record;
....
end voisinages;

si j'instancie un reservoir avec des valeurs de a et b dépassant quelques centaines...stack overflow
Alors je peux faire un type accès à voisinage....mais faire des acces sur des acces

Finalement, je pourrais faire une procédure tableau(a,b,valeur)
dans laquelle j'utiliserai un container pour stocker les valeurs de façon linéaire, avec un calcul sur a et b pour la position dans le container.
ça résoudrait tous mes stack_overflow.
Parce que vraiment, je déteste les types acces.

J-P. Rosen

unread,
Feb 12, 2013, 7:38:33 AM2/12/13
to
Le 11/02/2013 19:17, letocha a �crit :
> Le dimanche 10 f�vrier 2013 22:07:00 UTC+1, J-P. Rosen a �crit :

> generic
> a : in positive;
> b : in positive;
>
> package reservoirs is
> ...
> end reservoirs;
>
> package body reservoirs is
>
> ___type array2D_bis is array(1..a,1..b) of voisinage; **STACK OVERFLOW
>
> ___type ecrans_bis is access array2D_bis;
>
> ___sc_bis : ecrans_bis;
> ....
> end reservoirs;
>
> si j'instancie un reservoir avec des valeurs de a et b d�passant quelques centaines...stack overflow
> Alors je peux faire un type acc�s � voisinage....mais faire des acces sur des acces
Deux points importants:
1) Quelle est la taille du type Voisinage? parce que 100x100xbeaucoup,
�a finit par faire de la m�moire...

2) O� le g�n�rique est-il instanci�? Dans un paquetage de biblioth�que,
ou � l'int�rieur d'une proc�dure appel�e par le programme principal?
Parce que dans le premier cas, c'est allou� dans la m�moire globale,
alors que dans le second c'est allou� sur la pile, qui est en g�n�ral
bien plus petite (mais �a peut se r�gler)
>
> Finalement, je pourrais faire une proc�dure tableau(a,b,valeur)
> dans laquelle j'utiliserai un container pour stocker les valeurs de fa�on lin�aire, avec un calcul sur a et b pour la position dans le container.
> �a r�soudrait tous mes stack_overflow.
L�, je n'ai pas compris, il faudrait un peu plus nous d�crire le probl�me.

> Parce que vraiment, je d�teste les types acces.
>
C�, on est bien d'accord...

letocha

unread,
Feb 13, 2013, 2:38:19 PM2/13/13
to
Le mardi 12 février 2013 13:38:33 UTC+1, J-P. Rosen a écrit :

>
> 1) Quelle est la taille du type Voisinage? parce que 100x100xbeaucoup,
>
> �a finit par faire de la m�moire...
>
le type voisinage modélise par un ensemble d'entiers, les particules au voisinage d'une particule donnée - pour tester s'il y a des chocs afin d'éviter de balayer inutilement l'ensemble complet des points.

>
>
> 2) O� le g�n�rique est-il instanci�? Dans un paquetage de biblioth�que,
>
il est instancié dans un paquetage, lui-même instancié d'un paquetage.

>

> >

> L�, je n'ai pas compris, il faudrait un peu plus nous d�crire le probl�me.
>
je remplace le type array(1..L,1..l) par
procedure array(a,b : lesdimensions , c : valeur_a_placer)
--- indice = L * (b-1) + a
--- insert(container,indice)
end array

J-P. Rosen

unread,
Feb 13, 2013, 3:25:57 PM2/13/13
to
Le 13/02/2013 20:38, letocha a �crit :
> le type voisinage mod�lise par un ensemble d'entiers, les particules
> au voisinage d'une particule donn�e - pour tester s'il y a des chocs
> afin d'�viter de balayer inutilement l'ensemble complet des points.
OK, mais quel est le type (Ada) de voisinage? N'est-ce pas trop gros?

letocha

unread,
Feb 13, 2013, 3:56:44 PM2/13/13
to

>
> OK, mais quel est le type (Ada) de voisinage? N'est-ce pas trop gros?
>

saperlipopette, ne l'avais-je pas déjà publié ?

with Ada.Containers.Ordered_Sets;

package voisinages is

package entiers is new Ada.Containers.ordered_sets(positive);
use entiers;

type voisinage is new set with null record;

-- type voisinage is access tvoisinage;

end voisinages;

J-P. Rosen

unread,
Feb 14, 2013, 1:22:33 AM2/14/13
to
Le 13/02/2013 21:56, letocha a écrit :
>
>>
>> OK, mais quel est le type (Ada) de voisinage? N'est-ce pas trop gros?
>>
>
> saperlipopette, ne l'avais-je pas déjà publié ?
>
> with Ada.Containers.Ordered_Sets;
>
> package voisinages is
>
> package entiers is new Ada.Containers.ordered_sets(positive);
> use entiers;
>
> type voisinaH
> -- type voisinage is access tvoisinage;
>
> end voisinages;
>
Hmmm... Il serait peut-être intéressant d'imprimer Voisinage'Size, des
fois que...

letocha

unread,
Feb 17, 2013, 10:18:20 AM2/17/13
to

> Hmmm... Il serait peut-être intéressant d'imprimer Voisinage'Size, des
>
> fois que...
>
>

cela donne : 544

letocha

unread,
Feb 17, 2013, 10:35:49 AM2/17/13
to

donc avec un voisinage'size de 544

j'ai un :

raised STORAGE_ERROR : stack overflow (or erroneous memory access)


sur la déclaration suivante :

type pavages is array(1..a,1..b) of voisinage;

avec a et b ayant, respectivement, les valeurs 557 et 301

(pas de soucis avec 10 et 10....)



J-P. Rosen

unread,
Feb 17, 2013, 5:45:58 PM2/17/13
to
Le 17/02/2013 16:35, letocha a écrit :
>
> donc avec un voisinage'size de 544
Soit 68 octets ('Size est mesuré en bits)
>
> j'ai un :
>
> raised STORAGE_ERROR : stack overflow (or erroneous memory access)
> sur la déclaration suivante :
>
> type pavages is array(1..a,1..b) of voisinage;
>
> avec a et b ayant, respectivement, les valeurs 557 et 301
>
68 * 557 * 301 = 11_400_676

11.5 Mo, c'est en effet trop gros pour la pile.

letocha

unread,
Feb 18, 2013, 8:09:43 AM2/18/13
to
Le dimanche 17 février 2013 23:45:58 UTC+1, J-P. Rosen a écrit :
> Le 17/02/2013 16:35, letocha a écrit :
>
> >
>
> > donc avec un voisinage'size de 544
>
> Soit 68 octets ('Size est mesuré en bits)
>
> >
>
> > j'ai un :
>
> >
>
> > raised STORAGE_ERROR : stack overflow (or erroneous memory access)
>
> > sur la déclaration suivante :
>
> >
>
> > type pavages is array(1..a,1..b) of voisinage;
>
> >
>
> > avec a et b ayant, respectivement, les valeurs 557 et 301
>
> >
>
> 68 * 557 * 301 = 11_400_676
>
>
>
> 11.5 Mo, c'est en effet trop gros pour la pile.
>

J'imagine que ce problème doit survenir assez souvent -
un simple tableau à 2 dimensions sur un type non élémentaire -
Comment les concepteurs d'applications ada contournent cette pile ?

Pascal Obry

unread,
Feb 19, 2013, 11:37:10 AM2/19/13
to letocha
Le 18/02/2013 14:09, letocha a écrit :
> J'imagine que ce problème doit survenir assez souvent -
> un simple tableau à 2 dimensions sur un type non élémentaire -
> Comment les concepteurs d'applications ada contournent cette pile ?

Soit en augmentant la taille de la pile à l'édition de lien. Cela est
dépendant du compilateur et de la plate-forme.

Soit en allouant cet objet sur le tas.

Pascal.

--
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

letocha

unread,
Feb 20, 2013, 11:47:21 AM2/20/13
to letocha
Le mardi 19 février 2013 17:37:10 UTC+1, Pascal Obry a écrit :
> Le 18/02/2013 14:09, letocha a écrit :
>
> > J'imagine que ce problème doit survenir assez souvent -
>
> > un simple tableau à 2 dimensions sur un type non élémentaire -
>
> > Comment les concepteurs d'applications ada contournent cette pile ?
>
>
>
> Soit en augmentant la taille de la pile à l'édition de lien. Cela est
>
> dépendant du compilateur et de la plate-forme.
>
>
>
> Soit en allouant cet objet sur le tas.
>
>
>
> Pascal.
>
>

Très bien merci, dès que je n'y arrive pas...je reviens !

letocha

unread,
Feb 21, 2013, 4:37:11 PM2/21/13
to letocha
Le mardi 19 février 2013 17:37:10 UTC+1, Pascal Obry a écrit :
Si je déclare une variable du type array(1..300,1..300) of voisinage
à partir du programme principale - et non d'un sous-paquetage -
le stack overflow persiste.

Donc, comment augmenter la taille de la pile ou comment allouer cet objet
sur le tas.
Mon compilateur est le gnat de debian.

merci !

Ludovic Brenta

unread,
Feb 21, 2013, 4:56:35 PM2/21/13
to
letocha writes on fr.comp.lang.ada:
> Si je d�clare une variable du type array(1..300,1..300) of voisinage
> � partir du programme principale - et non d'un sous-paquetage -
> le stack overflow persiste.
>
> Donc, comment augmenter la taille de la pile ou comment allouer cet
> objet sur le tas. Mon compilateur est le gnat de debian.
>
> merci !

type T is array (Positive range <>, Positive range <>) of Voisinage;
type Array_Access is access T;
function Free is new Ada.Unchecked_Deallocation (T, Array_Access);

Variable : Array_Access := new T'(1 .. 300, 1 .. 300);
begin
...
Free (Variable);
end;

--
Ludovic Brenta.

J-P. Rosen

unread,
Feb 22, 2013, 12:41:59 AM2/22/13
to
Le 21/02/2013 22:37, letocha a �crit :
> Si je d�clare une variable du type array(1..300,1..300) of voisinage
> � partir du programme principale - et non d'un sous-paquetage -
> le stack overflow persiste.
Attention: il n'y a pas de programme principal en Ada! C'est juste une
proc�dure comme les autres que l'on appelle pour d�marrer le programme.
En particulier, les variables /locales/ du programme principal sont
allou�es sur la pile comme les autres. Pour avoir une variable statique,
il faut la d�clarer dans un paquetage de biblioth�que (un paquetage qui
n'est pas d�clar� dans autre chose).

letocha

unread,
Feb 22, 2013, 4:55:13 AM2/22/13
to
Le mardi 12 février 2013 13:38:33 UTC+1, J-P. Rosen a écrit :

>
> ou � l'int�rieur d'une proc�dure appel�e par le programme principal?
>
> Parce que dans le premier cas, c'est allou� dans la m�moire globale,
>

ah ! mais pourtant vous parliez bien de "programme principal" ce jour-là !

:)

letocha

unread,
Feb 22, 2013, 4:57:58 AM2/22/13
to
Le jeudi 21 février 2013 22:56:35 UTC+1, Ludovic Brenta a écrit :
> letocha writes on fr.comp.lang.ada:
>
> > Si je d�clare une variable du type array(1..300,1..300) of voisinage
>
> > � partir du programme principale - et non d'un sous-paquetage -
>
> > le stack overflow persiste.
>
> >
>
> > Donc, comment augmenter la taille de la pile ou comment allouer cet
>
> > objet sur le tas. Mon compilateur est le gnat de debian.
>
> >
>
> > merci !
>
>
>
> type T is array (Positive range <>, Positive range <>) of Voisinage;
>
> type Array_Access is access T;
>
> function Free is new Ada.Unchecked_Deallocation (T, Array_Access);
>
>
>
> Variable : Array_Access := new T'(1 .. 300, 1 .. 300);
>
> begin
>
> ...
>
> Free (Variable);
>
> end;
>
>
>
> --
>
> Ludovic Brenta.

merci !
Pour le free(variable), cette libération explicite est nécessaire dans tous les cas ? peut-être une bonne habitude à prendre ?

Georg Bauhaus

unread,
Feb 22, 2013, 8:22:13 AM2/22/13
to
On 22.02.13 10:57, letocha wrote:

> Pour le free(variable), cette lib�ration explicite est n�cessaire dans tous les cas ? peut-�tre une bonne habitude � prendre ?

Avec une t�che, "Access types should be used [even more] rarely in Ada." :)
Au moins, Free n'est pas n�cessaire, je pense :

with Ada.Text_IO, Ada.Exceptions;
use Ada.Text_IO;

procedure Large is

type Voisinage is range 1 .. 123_456_789;

type Matrice is array(Natural range <>,
Natural range <>) of Voisinage;


task type Calcule (Longeur : Natural) is
entry Resultat (N : out Voisinage);
end Calcule;

type Processeur is access Calcule;

task body Calcule is
Variable : Matrice(1..Longeur,1..Longeur); -- pile de la t�che
begin
-- ...
Variable (1, Longeur) := Variable (Longeur, 1);
-- ...
accept Resultat (N : out Voisinage) do
N := Variable (1, Longeur);
end Resultat;
end Calcule;

Travail : Processeur;
N : Voisinage;
begin
Travail := new Calcule(300);
Travail.Resultat(N);
Put_Line (Voisinage'Image (N));
end Large;

Pascal Obry

unread,
Feb 22, 2013, 10:25:44 AM2/22/13
to letocha
Le 21/02/2013 22:37, letocha a écrit :
> Si je déclare une variable du type array(1..300,1..300) of voisinage
> à partir du programme principale - et non d'un sous-paquetage -
> le stack overflow persiste.

Effectivement car cela ne change rien. La pile est pour chaque tâche
(thread). En Ada on a l'/environment task/ qui exécute la procédure
principale (et tout le code appelé) et les autres tâches de l'application.

Pour modifier la taille de la pile de l'/environement task/ il faut
passer au linker une commande et cela dépend du compilateur et du
systàme utilisé ou utiliser le setrlimit() sous UNIX.

> Donc, comment augmenter la taille de la pile ou comment allouer cet objet
> sur le tas.
> Mon compilateur est le gnat de debian.

Cela peut aider:

http://stackoverflow.com/questions/2275550/change-stack-size-for-a-c-application-in-linux-during-compilation-with-gnu-com

Mais dans ton cas l'objet est très gros et devrait plutôt être sur le
tas. Voir message de Ludovic.

Ludovic Brenta

unread,
Feb 22, 2013, 12:37:33 PM2/22/13
to
letocha writes:
> Pour le free(variable), cette libération explicite est nécessaire dans
> tous les cas ? peut-être une bonne habitude à prendre ?

Oui. Et une habitude encore meilleure est d'utiliser un objet contrôlé
pour appeler Free dans tous les cas, même en cas d'exception. Voir ici:

http://www.adaic.org/resources/add_content/docs/craft/html/ch16.htm

Avec Ada 2012 il me semble possible de construire un type "smart
pointer", contrôlé, qui permet d'accéder aux éléments du tableau de
façon transparente avec la syntaxe du tableau; voir ARM 4.1.5
"User-Defined References".

--
Ludovic Brenta.

Ludovic Brenta

unread,
Feb 22, 2013, 12:43:50 PM2/22/13
to
Ludovic Brenta <lud...@ludovic-brenta.org> writes:

> letocha writes:
>> Pour le free(variable), cette lib�ration explicite est n�cessaire dans
>> tous les cas ? peut-�tre une bonne habitude � prendre ?
>
> Oui. Et une habitude encore meilleure est d'utiliser un objet contr�l�
> pour appeler Free dans tous les cas, m�me en cas d'exception. Voir ici:
>
> http://www.adaic.org/resources/add_content/docs/craft/html/ch16.htm
>
> Avec Ada 2012 il me semble possible de construire un type "smart
> pointer", contr�l�, qui permet d'acc�der aux �l�ments du tableau de
> fa�on transparente avec la syntaxe du tableau; voir ARM 4.1.5
> "User-Defined References".

et cela a d�j� �t� fait:

http://www.christ-usch-grein.homepage.t-online.de/Ada/Smart_Pointers.html

--
Ludovic Brenta.
0 new messages