- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个需要分发的Ada应用程序,并且尝试使用DSA进行此操作,但是我在“允许”使用“什么”和“不使用”什么方面发现了很大的限制。
我不会发布源代码,因为它很复杂,而且无论如何这都是一个通用的问题,我只想对我不正确理解的内容提出一些建议,所以请忍着并纠正我,如果我错了。
所以我的问题是:我想用pragma Remote_Call_Interface
标记一个过程,以便可以远程调用它。但是,由于该过程在我的项目中包括了未归类为Pure
或Remote_Types
的其他程序包,因此我一添加pragma编译就会中断。
因此,我尝试将我需要的软件包标记为Pure
或Remote_Types
(无论它们是否具有状态都在此范围之内),但这反过来又进一步破坏了编译,因为事实证明,您甚至无法在Pure /中使用基本系统类型Remote_Types软件包,例如:您不能使用Vector
,您不能使用Unbounded_String
,您不能使用Map
,等等...整个程序崩溃了,因为我不能使用数据结构用来建造它了!
有没有解决的办法?或者,如果我想分发我的应用程序,我必须严格限制自己使用最基本的类型,例如Integers和booleans以及其他类型?我不明白我是在遇到语言限制还是在错误地使用它(不幸的是,我在DSA上发现的教程都非常模糊,顺便说一句,如果有人有好的话,可以随意链接它们!)
编辑:ajb回答后的让我指定特别令我烦恼的事情:在我想用pragma Remote_Call_Interface
标记的软件包中,我试图与某些非pure / remote_types软件包一起使用,但是它仅使用其中的类型这些软件包本地,它确实而不是包含任何接受此类参数(例如参数)的过程,也不包含返回此类类型的函数。这就是困扰我的地方:由于这些类型不必通过网络进行“旅行”,为什么我不能使用它们呢?我只是在本地使用它们...我不明白这一点,这就是为什么我试图将这些类型设置为Pure / Remote_Types的原因,但是现在我已经阅读了ajb的说明(即:使用Remote_Types以便对象这些类型的数据可以通过网络传播),我什至更困惑为什么仅在本地使用它们就不能使用它们。
最佳答案
我不是Ada分布式编程的专家,但是我确实知道(或认为我知道):
带注释的Ada参考手册的E.2.3部分说:“控制远程调用接口库单元的限制旨在确保可以在两个 Activity 分区之间有意义地发送远程调用中实际参数的值。”例如,如果记录类型的字段是访问类型,则不能将其从一个分区发送到另一个分区,因为被调用的分区将无法访问指针所指向的内存。 (Unbounded_String
,Map
和Vector
是使用访问类型作为内部函数的一部分来实现的。)所有用作参数或返回类型的类型都必须支持“外部流”,这意味着必须有一种将类型与该类型相互转换的方法。字节流,以便可以通过套接字传输参数值。如果您有一个具有访问类型的记录,但是您提供了'Read
和'Write
属性,以便可以在不传输任何实际指针的情况下将类型写入字节流和从字节流读取,则可以将记录类型放入Remote_Types
包中。
我不确定您的问题到底是什么:是否要将某些类型作为参数传递给远程调用,但是不能?还是只想在应用程序的其余部分中使用某些类型,但是会妨碍您使用?
如果是第二种,那么我认为解决方案是重组您的软件包,以使所有“远程类型”与非远程类型分开。
但是,如果您确实希望通过远程调用将Unbounded_String
,Map
或Vector
从一个分区传递到另一个分区,则比较麻烦。 Unbounded_String
确实应该支持外部流传输,并且有人提议将Unbounded_String
变成Remote_Types
包(请参阅AI05-0204),但未采取任何行动-我不知道为什么。但是,Map
和Vector
会是更大的问题,因为它们是通用软件包,必须适用于任何类型,包括不支持外部流传输的软件包。无论如何,这些类型都不设置为自动转换为字节或通过套接字传递。
但我认为您可以使它像这样工作:
private with Ada.Strings.Unbounded;
package Remote_Types_Package is
pragma Remote_Types;
type My_Unbounded_String is private;
private
type My_Unbounded_String is record
S : Ada.Strings.Unbounded.Unbounded_String;
end record;
end Remote_Types_Package;
Unbounded_String
软件包必须与
private with
一起使用;见E.2.2(6)。您需要提供一个函数来创建
My_Unbounded_String
,并且需要为
My_Unbounded_String
提供流读写例程,并为该类型定义
'Read
和
'Write
。通过使用
Read
的
Write
和
Read
属性,您应该能够编写
Write
和
Unbounded_String
属性。如果您想使用
Vector
作为远程调用参数,则应该可以执行类似的操作,尽管您可能需要做更多的工作来自己编组/解组该类型。
Remote_Types
包中,例如
P1
。其他类型应放在不同的包中,例如
P2
(或多个包)。如果
P1
中的类型取决于
P2
中的类型,您仍然可以通过让
P1
说
private with P2;
并确保您具有所需的编组和解组过程来使它起作用。如果您遇到困难,我鼓励您在这里提出一个新问题。
Remote_Types
包中,而不是仅仅说
Remote_Call_Interface
包中使用的任何类型都必须只包含可以流传输的部分。可能存在一些实施问题。可能对于
Remote_Types
包存在的任何代码都必须在两个分区中的程序中,并且这可能是试图限制必须链接到多个分区中的代码类型。但是我只是在猜测。
关于ada - Ada:pragma Pure/Remote_Types和系统类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24971222/
我是一名优秀的程序员,十分优秀!