如何定位并修复Pascal代码中数组元素全为0的错误?
问题修复方案
问题根源
Pascal中参数默认采用值传递:当你把主程序的数组X传入Read1d过程时,程序会创建一个数组副本,你输入的元素全部存在这个副本里,主程序的原数组X始终是初始的0值,这就导致后续输出和查找都不符合预期。
修复步骤
- 修改
Read1d的数组参数为引用传递:
必须将X参数声明为Var类型,这样过程才能直接操作主程序中的原数组,而不是副本。 - 其他读写数组的过程/函数用
Const优化:
对于Write1d、Nbev、RechV这类只读取数组、不修改的过程/函数,把数组参数声明为Const类型,既可以避免不必要的数组拷贝(提升效率),也能防止意外修改数组。
修复后的完整代码
Program MainProgram; Uses Crt; Const n = 100; Type TypeIn = 1..n; Array1d = Array[TypeIn] Of Integer; Procedure Read1d(Var Tai: TypeIn; Var X: Array1d); Var i: TypeIn; Begin Writeln('Enter the size of the array: '); Readln(Tai); For i := 1 To Tai Do Begin Write('X[', i, '] = '); Read(X[i]); Readln; // 读取输入后的换行符,避免后续ReadLn读取空值 End; End; Procedure Write1d(Var Tai: TypeIn; Const X: Array1d); Var i: TypeIn; Begin Write(' | '); For i := 1 To Tai Do Begin Write(X[i], ' | '); End; WriteLn; End; Function Nbev(Tai:TypeIn; Const X: Array1d ; V:Integer):Integer; var i, cpt:Integer; Begin cpt := 0; for i := 1 to tai do Begin if X[i] = V then cpt := cpt + 1; End; Nbev := cpt; End; Function RechV(Tai: TypeIn; Const X: Array1d; V: Integer): Boolean; Var i: TypeIn; Begin RechV := False; // 直接给函数名赋值,兼容部分编译器对Result的支持差异 For i := 1 To Tai Do Begin If X[i] = V Then Begin RechV := True; Break; End; End; End; Var Tai: TypeIn; X: Array1d; V: Integer; Begin textcolor(green); textbackground(black); ClrScr; Read1d(Tai, X); WriteLn; Write1d(Tai, X); Writeln('What''s the element you are looking for: '); Readln(V); If RechV(Tai, X, V) Then Begin Writeln('Element found.'); WriteLn('出现次数: ', Nbev(Tai, X, V)); End Else Writeln('Element not found.'); End.
额外优化说明
- 在
Read1d的Read(X[i])后添加了Readln,用来读取输入数字后的换行符,避免后续的Readln(V)直接读取空行导致异常。 - 把
RechV函数里的Result赋值改成直接给函数名赋值,兼容部分对Result关键字支持不完善的Pascal编译器。
内容的提问来源于stack exchange,提问作者Walker
相关产品推荐
相关产品推荐

