首页 > 解决方案 > 如何使用指向字符串数组的指针而不进行强制转换

问题描述

选项 1 和 2 工作正常,但我不喜欢使用“TArrayString()”,我宁愿使用类似于选项 3 的东西(它不起作用)。

program project1;
type TArrayString = array of string;

const
   n_signals = 3;
var
   signals_1    : array [1..n_signals] of string = ('101', '102', '103');
   i            :integer;
   ptr_signals  : pointer;
   ptr_signals2 : ^TArrayString;
begin

  ptr_signals  := @signals_1;
  ptr_signals2 := @signals_1;

  WriteLn('1) Void Pointer + Cast:');
  for i:=0 to n_signals-1 do begin
    writeLn('senal' + TArrayString(ptr_signals)[i]);
  end;
  WriteLn('');

  WriteLn('2) TArrayString Pointer + Cast:');
  for i:=0 to n_signals-1 do begin
    writeLn('senal' + TArrayString(ptr_signals2)[i]);
  end;
  WriteLn('');

  WriteLn('3) TArrayString Pointer + NO Cast: => Not working!!');
  for i:=0 to n_signals-1 do begin
    writeLn('senal' + ptr_signals2^[i]); // ¿¿??
  end;
  WriteLn(''); 

输出如下所示:

1) Void Pointer + Cast:
senal101
senal102
senal103

2) TArrayString Pointer + Cast:
senal101
senal102
senal103

3) TArrayString Pointer + NO Cast: => Not working!!

可能吗?

标签: pointerspascallazarus

解决方案


根据@David Hefferman 的回答,在这篇文章中我已经完成了这个代码更新,我不确定它是否是正确的答案,但至少是一种可能的选择。

看起来像:

  • 指向静态数组(信号)的动态数组指针 (^TArrayString) 可以完成这项工作,但方式不正确。
  • 使用指向静态数组(信号)的静态数组指针 (^TArrayStringStatic) 以正确的方式完成工作,并且无需强制转换(第 5 点)。

程序:

program project1;
type TArrayString = array of string;
type TArrayStringStatic = array [0..65535] of string;

const
   n_signals = 3;
var
   signals      : array [1..n_signals] of string = ('10199999999', '102', '103777777');
   i            :integer;
   ptr_signals_void : pointer;
   ptr_signals_dyn  : ^TArrayString;
   ptr_signals_stat : ^TArrayStringStatic;
begin

  ptr_signals_void  := @signals;
  ptr_signals_dyn   := @signals;
  ptr_signals_stat  := @signals;

  WriteLn('1) Void Pointer + Cast (Dynamic Array):');
  for i:=0 to n_signals-1 do begin
    writeLn('senal' + TArrayString(ptr_signals_void)[i]);
  end;
  WriteLn('');

  WriteLn('2) TArrayString Pointer + Cast (Dynamic Array):');
  for i:=0 to n_signals-1 do begin
    writeLn('senal' + TArrayString(ptr_signals_dyn)[i]);
  end;
  WriteLn('');

  WriteLn('3) TArrayString Pointer + NO Cast: => Not working!!');
  for i:=0 to n_signals-1 do begin
    //writeLn('senal' + ptr_signals_dyn^[i]);          // ¿¿why not??
    //writeLn('senal' + string(ptr_signals_dyn[i]));   // Works
  end;
  WriteLn('');

  WriteLn('4) TArrayStringStatic Pointer + Cast (Static Array):');
  for i:=0 to n_signals-1 do begin
    writeLn('senal' + TArrayStringStatic(ptr_signals_stat^)[i]);
  end;
  WriteLn('');

  WriteLn('5) TArrayStringStatic Pointer + No Cast:');
  for i:=0 to n_signals-1 do begin
    writeLn('senal' + ptr_signals_stat^[i]);
  end;
  WriteLn('');

end. 

输出:

1) Void Pointer + Cast (Dynamic Array):
senal10199999999
senal102
senal103777777

2) TArrayString Pointer + Cast (Dynamic Array):
senal10199999999
senal102
senal103777777

3) TArrayString Pointer + NO Cast: => Not working!!

4) TArrayStringStatic Pointer + Cast (Static Array):
senal10199999999
senal102
senal103777777

5) TArrayStringStatic Pointer + No Cast:
senal10199999999
senal102
senal103777777

谢谢你。


推荐阅读