HP OpenVMS Pascal中的C null终止字符串

时间:2018-03-22 12:01:09

标签: c string char pascal

我有一个相当简单的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中,我设法找到了所需的数据类型。

2 个答案:

答案 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.