Какой эквивалент массива BYTE (BYTE []) в Delphi с нулевым окончанием целым числом? - PullRequest
4 голосов
/ 15 апреля 2019

Я застрял в этой проблеме, когда компилятор говорит:

Несовместимые типы: 'AnsiChar' и 'Integer'

до последнего элемента массива 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;

Моя попытка в Delphi:

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);

Ответы [ 2 ]

8 голосов
/ 15 апреля 2019

Вы можете почти определить это так, как вы это сделали:

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.)

Каждое из перечисленных значений имеет одинаковое значение.

4 голосов
/ 16 апреля 2019

Вы можете использовать #0 для представления числового 0 как AnsiChar. Но код C ++ присваивает char значения массиву BYTE, и вы не можете неявно назначить AnsiChar для Byte в Delphi, вам нужно приведение типа.

Буквальный перевод кода C ++ на Delphi выглядел бы так:

const
  myarray[0..9] of Byte = (Ord('A'), Ord('B'), Ord('C'), Ord('D'), Ord('E'), Ord('F'), Ord('G'), Ord('H'), Ord('I'), 0);
  // alternatively:
  // myarray[0..9] of AnsiChar = ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', #0);

var
  s: SOCKET;
begin
  ...
  // Usage example:
  if (send(s, myarray, SizeOf(myarray), 0) <= 0) then
    Exit;
  ...
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...