Delphi执行自定义数组移位过程后原数组未发生变化的原因是什么
问题原因解析
1. 核心问题:参数传递方式错误
Delphi中按值传递的参数默认会在栈上创建副本,过程内部修改的只是副本的值,不会回写到外部传入的原始变量。
你当前定义的过程:
procedure ArrayShiftRowUp(arrArrayShift: arrRotor );
没有加var关键字,属于按值传递,所以你对arrArrayShift的所有修改都只作用在过程内部的副本上,外部的arrTest自然不会发生变化。
修复方法
在参数前添加var关键字,改为按引用传递,直接操作外部变量的内存地址:
procedure ArrayShiftRowUp(var arrArrayShift: arrRotor );
2. 附加优化:移位逻辑可调整
你当前使用相邻元素交换实现循环左移,虽然对于定长10位的数组可以得到正确结果,但性能较差,更高效的循环左移一位实现参考:
procedure TForm2.ArrayShiftRowUp(var arrArrayShift: arrRotor ); var tempS: string; i: Integer; begin tempS := arrArrayShift[Low(arrArrayShift)]; // 保存第一个元素 for i := Low(arrArrayShift) to High(arrArrayShift)-1 do begin arrArrayShift[i] := arrArrayShift[i+1]; end; arrArrayShift[High(arrArrayShift)] := tempS; // 第一个元素放到末尾 end;
另外建议不要使用全局变量存储临时值tempS、循环变量i,在过程内部定义局部变量可以避免多线程/多次调用冲突。
内容的提问来源于stack exchange,提问作者MelkorIlluvatar
相关产品推荐
相关产品推荐

