我陷入了编译器说的这个麻烦:
到 AnsiChar
数组的最后一个元素,这是一个空终止的整数。怎么修?
C++代码:
static const BYTE myarray[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 0 };
SOCKET s;
// Usage example:
if(Send(s, (char *) myarray, sizeof(myarray), 0) <= 0)
return;
我在德尔福的尝试:
var
MyArray: array [0 .. MAX_PATH] of AnsiChar = ( 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 0 );
S: TSocket;
// Usage example:
send(S, MyArray, Length(MyArray), 0);
最佳答案
您几乎可以按照您的方式定义它:
var
MyArray: array[0..MAX_PATH] of AnsiChar = ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', #0);
但是随后您会收到一个错误,提示元素的数量,因此您必须添加一些 250 个额外的零来完成它:
// Possible, but not necessary, see below
var
MyArray: array[0..MAX_PATH] of AnsiChar =
('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
'I', #0, #0, #0, #0, ....
...
...
... #0, #0, #0);
但是,这可以更简单地完成:
var
MyArray: array[0..MAX_PATH] of AnsiChar = 'ABCDEFGHI';
这种特殊的语法应该适用于大多数 Delphi 版本,并且不会出现编译器错误。
对于 send() 期间的长度,您必须使用 StrLen(),而不是 Length():
send(S, MyArray, StrLen(MyArray) + 1, 0);
或者,您可以这样做:
var
Stg: AnsiString;
begin
Stg := 'ABCDEFGHI';
// Second parameter is untyped const, so use ^
send(S, PAnsiChar(Stg)^, Length(Stg) + 1, 0);
FWIW,
#0
是序数值为 0 的字符。替代方法是:Chr(0)
#0
^@ (meaning Control+@; ^A = #1 = Chr(1), ^M = #13, etc.)
以上每一项都具有相同的含义。
关于arrays - Delphi 中的 BYTE 数组 (BYTE[]) 与空终止整数的等价物是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55690653/