pointers - 如何使用指向字符串数组的指针而不进行强制转换
问题描述
选项 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!!
可能吗?
解决方案
根据@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
谢谢你。
推荐阅读
- rpy2 - 在 rpy2 中使用 suppressMessages 仍然会打印消息
- pine-script - 在多个时间范围内同时使用 Fisher 变换
- python - 为什么这个程序调用了错误的方法?[Python, MultiTimer 库]
- java - 获取 415 内容不受支持 application/pkixcmp
- charts - 在条形图中的条形内绘制点和线
- ios - Objective-C 中的 UIScreenEdgePanGestureRecognizer
- python - 为什么使用 SavedModel 进行训练比使用检查点训练子类 Transformer 慢 20 倍?
- android - Galaxy s10 和 note10 上的 Android Webview 崩溃报告
- javascript - 如何在基本 Typescript 示例上增加 Mocha 测试的代码覆盖率?
- ios - 绘制跟随用户当前位置的 MKPolyline