15.2关键问题 首先,我们必须查找这些代码的位置。这通过一个名字来实现。如 果代码是直接链接到你的程序里,就必须使用链接名;如果代码位 于一个DLL,则可以使用导出名。无论是用链接名还是用导出名, 对 Visual Prolog来说没有区别,但是当你试图在外部代码(或系 统)中寻找这个名字时,就有了区别。我们这里提到系统,是因为 有时你必须使用的名字在代码中根本不存在。因此,对于这个概念, 我们仅使用链接名。 2004.11.3 AI序设计
2004.11.3 AI程序设计 6 15.2 关键问题 ⚫ 首先,我们必须查找这些代码的位置。这通过一个名字来实现。如 果代码是直接链接到你的程序里,就必须使用链接名;如果代码位 于一个DLL,则可以使用导出名。无论是用链接名还是用导出名, 对Visual Prolog来说没有区别,但是当你试图在外部代码(或系 统)中寻找这个名字时,就有了区别。我们这里提到系统,是因为 有时你必须使用的名字在代码中根本不存在。因此,对于这个概念, 我们仅使用链接名
15.2关键问题 其次,在我们已经确定了外部代码的位置之后,接着必须传递输入 参数并调用代码,代码被执行后,还必须获取其输岀等等。有许多 不同的途径去完成此过程。显然,调用者和被调用者必须在这一点 达成一致,即双方必须有调用约定。 第三,关于数据表示。但是,不仅调用双方必须在参数等的传递上 相一致,更重要的是双方要以相同方式解释所传递的字节。换句话 说就是,双方的数据表示必须相同。 2004.11.3 AI序设计
2004.11.3 AI程序设计 7 15.2 关键问题 ⚫ 其次,在我们已经确定了外部代码的位置之后,接着必须传递输入 参数并调用代码,代码被执行后,还必须获取其输出等等。有许多 不同的途径去完成此过程。显然,调用者和被调用者必须在这一点 达成一致,即双方必须有调用约定。 ⚫ 第三,关于数据表示。但是,不仅调用双方必须在参数等的传递上 相一致,更重要的是双方要以相同方式解释所传递的字节。换句话 说就是,双方的数据表示必须相同
15.2关键问题 最后要注意的一点是内存管理。调用者和被调用者必须明确在必要 时由哪一方分配和释放内存。如果释放內存和分配内存不是由同一 方进行,那么释放内存一方必须以正确的方式释放内存。 总之,调用外部代码有四个关键问题需要考虑: 链接名 调用约定 数据表示 存储管理 2004.11.3 AI序设计
2004.11.3 AI程序设计 8 15.2 关键问题 ⚫ 最后要注意的一点是内存管理。调用者和被调用者必须明确在必要 时由哪一方分配和释放内存。如果释放内存和分配内存不是由同一 方进行,那么释放内存一方必须以正确的方式释放内存。 ⚫ 总之,调用外部代码有四个关键问题需要考虑: ⚫ 链接名 ⚫ 调用约定 ⚫ 数据表示 ⚫ 存储管理
15.3调用约定和链接名 链接名(或导出名)用于识别你想要调用的代码。不同的编译器用 不同的缺省链接名,许多编译器有多种指定链接名的途径。在 Vsua| Prolog中,你可以用保留字“as”为一个谓词声明一个链接 名。如: predicates pppp: (integer)as"LinkName 在 Visual Prolog程序中,上面的谓词被命名为“ pppp,但是它的 链接名是“ LinkName 2004.11.3 AI序设计
2004.11.3 AI程序设计 9 15.3 调用约定和链接名 ⚫ 链接名(或导出名)用于识别你想要调用的代码。不同的编译器用 不同的缺省链接名,许多编译器有多种指定链接名的途径。在 Visual Prolog中,你可以用保留字“as”为一个谓词声明一个链接 名。如: predicates pppp : (integer) as "LinkName". ⚫ 在Visual Prolog程序中,上面的谓词被命名为“pppp”,但是它的 链接名是“LinkName
15.3调用约定和链接名 注意:仅类谓词有一个链接名,这意味着它必须在一个类中进行声 明或在一个类实现的类谓词( class predicates)段进行声明。 Visua| Prolog支持大量不同的调用约定。这些约定也在谓词中声 明,但用的是 language保留字。 predicates gaga:(integer)language C 2004.11.3 AI序设计 10
2004.11.3 AI程序设计 10 15.3 调用约定和链接名 ⚫ 注意:仅类谓词有一个链接名,这意味着它必须在一个类中进行声 明或在一个类实现的类谓词(class predicates)段进行声明。 ⚫ Visual Prolog支持大量不同的调用约定。这些约定也在谓词中声 明,但用的是language保留字。 predicates qqqq : (integer) language c