我有一个相当简单的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中的空终止char数组.Pascal字符串似乎不是它,因为它不会向C函数传递任何内容。 / p>
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中,我设法找到了所需的数据类型。
答案 0 :(得分:2)
正如您在官方HP文档中所看到的,Pascal版本支持以null结尾的字符串:http://h41379.www4.hpe.com/doc/82final/6083/6083pro_005.html#null_strings
2.7 Null-Terminated Strings
HP Pascal包含例程和内置类型,以便更好地与C语言中以空值终止的字符串共存。 C_STR_T数据类型等同于:
C_STR_T = ^ ARRAY [0..0] OF CHAR;
C_STR_T是指向ARRAY OF的指针 字符。它不为任何字符数据分配内存。 C_STR_T 行为类似于普通指针类型,因为您可以将NIL指定给它 并且可选的指针检查代码将检查是否取消引用 一个NIL指针。可以通过解除引用来使用各个字符 指针并使用数组索引。
在这些情况下,没有界限 即使启用了数组边界检查,也将执行检查。 但是,您也不能取消引用C_STR_T指针 索引单个字符。如果你想访问整个 以null结尾的字符串,请参阅PAS_STR函数。
然后,您可以将这些C风格的字符串用作只读引用,或通过PAS_STR
函数将它们转换为独立的Pascal字符串:http://h41379.www4.hpe.com/doc/82final/6083/6083pro_016.html#pas_str_func
PAS_STRCPY
会马上做相反的事情:
http://h41379.www4.hpe.com/doc/82final/6083/6083pro_016.html#pas_strcpy
答案 1 :(得分:1)
我现在找到一个解决方法,它根本不会影响我的C代码,但不是很动态。在我的特定情况下,用户名和密码是硬编码的。
我只是在Pascal中使用一个字符数组,然后逐个设置字符。然而,在一般情况下,这不是一个好的解决方案,我想接受Yury Schkatula的回答是正确的。这是预期的用途。但是,我不能,因为我从来没有让它工作。如果我找到原因,我会更新这个帖子。
program pascaltest(INPUT, OUTPUT);
type username = array [0..6] of char;
type password = array [0..10] of char;
procedure connect(var user : username, var pass : password, var errorcode: integer); external;
var
errorcode : integer := 0;
user : username;
pass : password;
begin
user[0] := 'M';
user[1] := 'y';
user[2] := 'U';
user[3] := 's';
user[4] := 'e';
user[5] := 'r';
user[6] := chr(0);
pass[0] := 'M';
pass[1] := 'y';
pass[2] := 'P';
pass[3] := 'a';
pass[4] := 's';
pass[5] := 's';
pass[6] := 'w';
pass[7] := 'o';
pass[8] := 'r';
pass[9] := 'd';
pass[10] := chr(0);
connect(user, pass, errorcode);
if errorcode <> 0 then
writeln('Failed to connect with error code ', errorcode);
end.