Палец вверх 3
Перевод
Перевод

Как назначить массив символов для строки наиболее элегантным способом?

Я люблю Pascal за его ясность, поэтому поверьте, что следующий фрагмент кода вместе с заголовком вопроса не требует пояснений:

procedure TForm1.FormClick(Sender: TObject);
const
  N = 42; { fnord }
type
  { this structure merely defines memory layout }
  TStringStruct = record
    NumberOfCharacters: Cardinal;
    { this array supposed to be friendly for the string type }
    StringCompatibleArray: array [0..N-1] of Char;
  end;
  { actual work is done with pointer to that structure }
  PStringStruct = ^TStringStruct;
var
  StringStruct: PStringStruct;
  S: string;
begin
  StringStruct := PopulatedElsewhere;

  { most pleasant code but will copy no more than N characters }
  S := StringStruct^.StringCompatibleArray;

  { this construct works but is way too ugly and complex }
  SetString(
    S,
    { in particular: must reference the array and then typecast to make it work }
    { default $T- state assumed, unfortunately $T+ has global effect and not useful here }
    PChar(@StringStruct^.StringCompatibleArray),
    StringStruct^.NumberOfCharacters
  );
end;

В случае, если кто-то хочет получить официальный вопрос: я хотел бы увидеть, какие варианты мне нужно выполнить такое назначение, предпочтительно менее SetString чем показанный вызов SetString .

Примечание: я знаю, что операторы разыменования являются необязательными для структурированных типов.

delphi syntax
задан Premature Optimization 26 окт. 2011 г., 23:56:02
источник

1 ответ

Решение 5
Перевод
Перевод

SetString - это путь, обычно. Это только неясно, если люди продолжают оставаться в неведении о его полезности. Приведение типов необходимо, потому что есть две перегрузки, и массив char не точно соответствует ни одному из ожидаемых типов аргументов (PAnsiChar и PWideChar).

Это многословно, но в вашем случае оно легко превращается в функцию для вашего типа данных, например, ToString . Как предложил Дэвид в комментарии, вы можете разрешить этой функции быть Implicit оператором, а затем автоматически получить преобразование:

class operator TStringStruct.Implicit(const Value: TStringStruct): string;
begin
  SetString(Result, Value.StringCompatibleArray, Value.NumberOfCharacters);
end;

S := StringStruct^;
ответ дан Rob Kennedy 27 окт. 2011 г., 1:03:42
источник