gpt4 book ai didi

ada - 如何将数据从字符串访问复制到 Ada.String

转载 作者:行者123 更新时间:2023-12-02 01:51:37 25 4
gpt4 key购买 nike

我有以下代码片段

 with GNAT.Command_Line; use GNAT.Command_Line;
with GNAT.Strings; use GNAT.Strings;

....

Define_Switch
(Config => Config, Output => File_Name'Access,
Long_Switch => "--file=", Switch => "-f=",
Help => "File with Composition");

....
Getopt

通过 Getopt 解析命令行后,我拥有指向实际文件名的访问对象我想将此名称复制到定义为的 Ada.String.Fixed 字符串

 File_Name : String(1 .. 256);

我可以将 File_Name'Access 中的数据打印到控制台

Put_Line(File_Name.all);

我认为我应该提供诸如复制操作之类的东西,然后自由访问对象。我该怎么做?

谢谢。亚历克斯

最佳答案

我猜代码片段中的 File_Name 定义为“别名 GNAT.Strings.String_Access”。这是一个指向字符串对象的“胖指针”。 “Fat”意味着它不仅仅是一个地址,它是字符串索引的范围。 Ada 中不使用 C 风格的 Nil 终止符,Nil 是有效字符。

您可以将此字符串对象内的数据复制到另一个进行索引计算的标准 String 对象中,但通常您不能这样做:没有 Nil 终止符,您将需要传递实际数据的长度;目标字符串对象可能小于所需的大小,并且数据将被截断或引发异常;等等

有两种正确的方法可以做到这一点。第一个是声明不受约束的字符串对象并为其赋值。

declare
Fixed_File_Name : String := File_Name.all;

begin
Free (File_Name);

或使用可变长度字符串(有界或无界):

declare
Unbounded_File_Name : Ada.Strings.Unbounded.Unbounded_String;

begin
Unbounded_File_Name :=
Ada.Strings.Unbounded.To_Unbounded_String (File_Name.all);
Free (File_Name.all);

固定字符串的使用有一个重要的限制:字符串对象必须在对象的声明点准确初始化,并且只能在相应的 block /子程序内使用。使用可变长度字符串允许在特定 block /子程序的范围之外声明字符串对象。

关于ada - 如何将数据从字符串访问复制到 Ada.String,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70259135/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com