Types 阿达字符串固定

Types 阿达字符串固定,types,ada,gnat,Types,Ada,Gnat,大家好, type String is array (Positive range <>) of Character; 它失败了 例如: With Ada.Text_IO ; Use Ada.Text_IO ; Procedure fixed is max_String : String( 1 .. integer'last ) ; begin get ( max_String ) ; put ( max_String ) ; End

大家好,

type String is array (Positive range <>) of Character;
它失败了


例如:

With Ada.Text_IO ;          Use Ada.Text_IO ;

Procedure fixed is

  max_String : String( 1 .. integer'last ) ;

begin
    get ( max_String ) ;
    put ( max_String ) ;

End fixed ;
编译器:“已修复。adb:3:1:错误:本地对象的总大小太大”


谢谢。

创建字符串时,它具有您指定的长度。所以

S : String (1 .. 5);
为5个字符保留空间

L : String := “foo”;
为3个字符保留空间,并用“f”、“o”、“o”填充

Integer'Last
约为20亿;我认为你没有那么多公羊

您可能想使用函数版本的
Ada.Text\u IO.Get\u Line

with Ada.Text_IO; use Ada.Text_IO;
procedure Fixed is
   S : constant String := Get_Line;
begin
   Put_Line (S);
end Fixed;
这将初始化
S
,不管第一个输入行是什么


大多数需要处理字符串的人都使用
无界字符串
(需要一个链接-ARM网站目前已关闭)

创建字符串时,它具有您指定的长度。所以

S : String (1 .. 5);
为5个字符保留空间

L : String := “foo”;
为3个字符保留空间,并用“f”、“o”、“o”填充

Integer'Last
约为20亿;我认为你没有那么多公羊

您可能想使用函数版本的
Ada.Text\u IO.Get\u Line

with Ada.Text_IO; use Ada.Text_IO;
procedure Fixed is
   S : constant String := Get_Line;
begin
   Put_Line (S);
end Fixed;
这将初始化
S
,不管第一个输入行是什么


大多数需要处理字符串的人都使用
无界字符串
(需要一个链接-ARM网站目前已关闭)

在声明性块中声明的对象被分配到他们正在运行的任务堆栈上

这意味着限制是从运行程序时操作系统为程序提供的堆栈空间的大小得出的

我在Linux上使用Zsh,在这里我可以使用命令
limit stacksize
检查/调整指定的堆栈大小:


%限制堆栈大小
堆栈大小8MB
%

我也可以改变它:


%限制堆叠尺寸2100m
%限制堆栈大小
堆栈大小2100MB
%


如果我在此时(从同一个shell)启动了您的程序,它可能工作得很好。

在声明性块中声明的对象在它们运行的任务堆栈上分配

这意味着限制是从运行程序时操作系统为程序提供的堆栈空间的大小得出的

我在Linux上使用Zsh,在这里我可以使用命令
limit stacksize
检查/调整指定的堆栈大小:


%限制堆栈大小
堆栈大小8MB
%

我也可以改变它:


%限制堆叠尺寸2100m
%限制堆栈大小
堆栈大小2100MB
%


如果我在此时(从同一个shell)启动了您的程序,它可能会正常工作。

取决于系统。将在堆栈上分配一个局部变量,因此如果需要2GB字符串,则需要设置更高的堆栈大小,或者类似于
max\u string:access string:=新字符串(1..integer'last)
在堆上分配字符串。我现在不想处理指针。我不知道如何设置更高的堆栈大小,但这可能是最好的解决方案。那么,当我使用一个字符串时,有没有办法知道我的系统的限制是什么?你几乎肯定不需要分配2G字节来保存一个字符串。调整操作系统配置以允许您这样做(a)没有帮助,(b)甚至可能不可能。我只想知道限制:-(取决于系统。将在堆栈上分配一个局部变量,因此如果需要2GB字符串,则需要设置更高的堆栈大小,或者类似于
max\u string:access string:=新字符串(1..integer'last);
在堆上分配字符串。我现在不想处理指针。我不知道如何设置更高的堆栈大小,但这可能是最好的解决方案。“依赖于系统”。那么,当我使用字符串时,有没有办法知道我的系统的限制是什么?你几乎肯定不需要分配2G字节来保存字符串。调整操作系统配置以允许你这样做(a)没有帮助,(b)甚至可能不可能。我只想知道限制:-(是的,无界字符串在示例中更合适。此外,我不想使用get\u行。我真的想回答我的第一个问题。是的,无界字符串在示例中更合适。此外,我不想使用get\u行。我真的想回答我的第一个问题。请选中
ulimit
,但请注意,它只适用于s到当前会话的后代,它可能仅用于限制(而不是放大)如果您不是root.IIRC,还可以在编译时调整应用程序请求的堆栈大小。我只是不记得如何调整。请检查
ulimit
,但请注意,它仅适用于当前会话的后代,可能仅用于限制(而不是放大)如果您不是root.IIRC,还可以在编译时调整应用程序请求的堆栈大小。我只是不记得如何调整。