【发布时间】:2018-03-22 12:01:09
【问题描述】:
我有一个比较简单的Pascal程序,就是调用我写的一些C函数。
我的 C 代码:
void connect_default(int* errorcode)
{
// Connects the default user and places any error code in errorcode
}
void connect(char user[129], char password[129], int* errorcode)
{
// Connects the given user and places any error code in errorcode
}
我试图在我的 Pascal 应用程序中调用这两个函数。这工作正常:
program pascaltest(INPUT, OUTPUT);
procedure connect_default(var errorcode: integer); external;
var
errorcode : integer := 0;
begin
connect_default(errorcode);
if errorcode <> 0 then
writeln('Failed to connect with error code ', errorcode);
end.
但是我很难找出在 Pascal 中使用什么数据类型,它对应于 C 中的空终止字符数组。Pascal 字符串似乎不是它,因为它不会向 C 函数传递任何内容。
program pascaltest(INPUT, OUTPUT);
procedure connect(user : string, password : string, var errorcode: integer); external;
var
errorcode : integer := 0;
begin
connect('MyUser', 'MyPassword', errorcode);
if errorcode <> 0 then
writeln('Failed to connect with error code ', errorcode);
end.
Pascal 中的什么数据类型对应于以空结尾的 C char 数组?我的环境是 HP OpenVMS 机器而不是 Free Pascal,这意味着我无法访问我读过的 pchar 和 ansistring 类型。
C 函数需要尽可能通用,我不能对它们进行任何更改,创建自定义结构(就像这里描述的 Declaring Pascal-style strings in C),因为 C 函数已经被用 C 编写的类似程序成功调用、Fortran 和 Cobol,在那里我设法找到了所需的数据类型。
【问题讨论】:
-
尊重平台的活力! :D
-
Pascal 字符串长度不是存储到数组的第一个字节吗?您不能将整个字符串与
memmove一起移动一个字节,然后将终止'\0'设置到末尾。 -
@JanneTuukkanen 如帖子末尾所述,我无法对 C 函数进行任何更改。这样的解决方案可能适用于 Pascal,但是我会为调用 Fortran 和 Cobol 程序弄乱 C 函数,它们不会将字符串长度存储在第一个字节中。
-
一些 Pascal 编译器可以使用
PChar类型,它是一个以空字符结尾的字符数组。connect(PChar('MyUser'), ... -
似乎
OpenVMS Pascal有一个C_STR_T类型,它包含一个以null 结尾的char 数组,以及一些辅助函数,例如MALLOC_C_STR(),它从一个字符串中分配一个C_STR_T并返回一个指向结构的指针。