将字符串分配给字符数组

Ske*_*a87 1 delphi

问题一

我有

var example : array[0..15] of char;
Run Code Online (Sandbox Code Playgroud)

我想将输入值分配给该变量

example := inputbox('Enter Name', 'Name', '');
Run Code Online (Sandbox Code Playgroud)

在高分单元中,我有记录和数组

type
points = record
var
  _MemoryName : array[0..15] of char;
  _MemoryScore : integer;
end;

var
rank : array[1..3] of points;
Run Code Online (Sandbox Code Playgroud)
var s: string;
 a: packed array[0..15] of char;

highscoresdata.position[1]._MemoryName := StrPLCopy(a, s, Length(a)) ;
Run Code Online (Sandbox Code Playgroud)

返回 - >(186): E2010 Incompatible types: 'array[0..15] of Char' and 'PWideChar'

var s: string;
 a: packed array[0..15] of char;

             s := InputBox('caption', 'Caption', 'Caption');
             FillChar(a[0], length(a) * sizeof(char), #0);
             Move(s[1], a[0], length(a) * sizeof(char));
      scores.rank[1]._MemoryName := <<tried both s and a>> ;
Run Code Online (Sandbox Code Playgroud)

回报 (189): E2008 Incompatible types

And*_*and 5

问题一

有很多方法.一个是:

procedure TForm1.FormCreate(Sender: TObject);
var
  s: string;
  a: packed array[0..15] of char;
begin
  s := InputBox(Caption, Caption, Caption);
  assert(length(s) <= 16);
  FillChar(a[0], length(a) * sizeof(char), #0);
  Move(s[1], a[0], length(s) * sizeof(char));
end;
Run Code Online (Sandbox Code Playgroud)

但我怀疑,你的原始问题可能会有更优雅的解决方案.

问题二

每当您希望函数/过程没有特定的参数时,您应该意识到项目的设计可能存在问题.然而,Sender参数是多余的并不罕见,因为它们几乎无所不在,因为VCL的设计(特别是TNotifyEvent).如果您知道接收程序不关心Sender参数,只需给它任何东西,比如Selfnil.

问题三

考虑以下代码:

procedure TForm4.FormCreate(Sender: TObject);
var
  a: packed array[0..15] of char;
  b: packed array[0..15] of char;
begin
  a := b;
end;
Run Code Online (Sandbox Code Playgroud)

这不起作用.你不能像字符串一样对待数组; 特别是,你不能像这样(a := b)分配静态数组.

相反,你必须做一些像......

Move(b[0], a[0], length(a) * sizeof(char));
Run Code Online (Sandbox Code Playgroud)

...或者只是一次循环并复制一个值.但是a := b如果声明一个静态数组类型,上面的简单赋值()确实有效:

type
  TChrArr = packed array[0..15] of char;

procedure TForm4.FormCreate(Sender: TObject);
var
  a: TChrArr;
  b: TChrArr;
begin
  b := a;
end;
Run Code Online (Sandbox Code Playgroud)

  • FillChar和Move?多么粗暴!:) StrPLCopy(a,s,Length(a)) (3认同)