On 27.02.13 11:11, Blady wrote:
> Le 16/01/13 13:08, Georg Bauhaus a écrit :
>> with Ada.Numerics.Generic_Real_Arrays;
>>
>> package Globals is
>> pragma Preelaborate (Globals);
>> type T is digits 6;
>> package Linalg is new
>> Ada.Numerics.Generic_Real_Arrays (T);
>>
>> subtype Carré is
>> Linalg.Real_Matrix (1 .. 20_000, 1 .. 20_000);
>>
>> M1, M2, Résultat : Carré;
>> end Globals;
>>
>> with Globals;
> Bonjour, rapide essai avec GNAT GPL 2012 sur MacOS 10.8,
> il y a un crash de 'as' sur la taille des matrices :
GNAT 2012 sur MacOS 10.7 et le même crash de 'as'.
L'erreur a disparu des GNATs récents :
GNATMAKE 4.8.0 20130212 (experimental) [trunk revision 195968]
Copyright (C) 1995-2013, Free Software Foundation, Inc.
"run_using_globals.ali" being checked ...
-> "globals.ads" time stamp mismatch
gcc -c -gnatW8 -gnatwa -fstack-check -gnato run_using_globals.adb
"globals.ali" being checked ...
-> "globals.ads" time stamp mismatch
gcc -c -gnatW8 -gnatwa -fstack-check -gnato globals.ads
End of compilation
gnatbind -x run_using_globals.ali
gnatlink run_using_globals.ali -fstack-check
$
Le programme se termine par un message d'erreur,
$ ./run_using_globals
raised STORAGE_ERROR : stack overflow
$
Selon
http://developer.apple.com/library/mac/#qa/qa1419/_index.html
le taille maximale d'une pile est "64 Megabytes".
> Cela dépend-t-il d'un paramètre système ? Modifiable ?
$ ulimit -s { nombre | "hard" }
ajuste la taille de la pile de lenvironment task.
Pour voir les limites actuelles et extrêmes,
with Sys_Resource_H; -- g++ -c -fdump-ada-spec -C ; gcc -gnat05 *.ads
-- et annuler l'effet de __DARWIN_ALIAS (?) ("_")
with Interfaces.C.Strings;
with Ada.Text_IO;
procedure Defaults_Mac is
use Sys_Resource_H, Ada.Text_IO, Interfaces;
package Size_IO is new Modular_IO (rlim_t);
procedure perror (S : C.Strings.chars_ptr);
pragma Import (C, perror);
RLIMIT_CPU : constant := 0;
RLIMIT_FSIZE : constant := 1;
RLIMIT_DATA : constant := 2;
RLIMIT_STACK : constant := 3;
RLIMIT_CORE : constant := 4;
RLIMIT_AS : constant := 5;
RLIMIT_RSS : constant := RLIMIT_AS;
RLIMIT_MEMLOCK : constant := 6;
RLIMIT_NPROC : constant := 7;
RLIMIT_NOFILE : constant := 8;
subtype Resource_Limit is C.int range RLIMIT_CPU .. RLIMIT_NOFILE;
use type Resource_Limit;
subtype Etiquette is String (1 .. 7);
type Apparence is record
Nom : Etiquette;
Echelle : rlim_t;
Unité : Character;
end record;
Info : constant array (Resource_Limit) of Apparence :=
(RLIMIT_CPU => ("CPU" & " ", 1, 's'),
RLIMIT_FSIZE => ("FSIZE" & " ", 1, '#'),
RLIMIT_DATA => ("DATA" & " ", 1024, 'k'),
RLIMIT_STACK => ("STACK" & " ", 1024, 'k'),
RLIMIT_CORE => ("CORE" & " ", 1, '#'),
RLIMIT_RSS => ("RSS" & " ", 1024, 'k'),
RLIMIT_MEMLOCK => ("MEMLOCK" & "", 1024, 'k'),
RLIMIT_NPROC => ("NPROC" & " ", 1, '#'),
RLIMIT_NOFILE => ("NOFILE" & " ", 1, '#'));
L : aliased rlimit;
procedure Montrer (R : Resource_Limit) is
--# global in L;
I : Apparence renames Info (R);
use type rlim_t;
begin
Put (I.Nom & ": ");
Size_IO.Put (L.rlim_cur / I.Echelle);
Put (' ' & I.Unité);
Size_IO.Put (L.rlim_max / I.Echelle);
Put (' ' & I.Unité);
New_Line;
end Montrer;
begin
for R in Resource_Limit loop
if 0 = getrlimit (R, L'access) then
Montrer (R);
else
perror(C.Strings.New_String
("limite n°" & Resource_Limit'Image (R)));
end if;
end loop;
end Defaults_Mac;