Delphi数组平均值函数异常:无论输入值如何结果始终约为50,求排查
Delphi数组平均值函数返回错误结果的问题分析与解决
问题根源
开放数组索引误用
Delphi的array of Integer属于开放数组参数,其索引固定从0开始,和你定义的静态数组arrVal[1..50]的索引范围无关。你的循环for e := 1 to y do会跳过开放数组的第一个元素(对应原数组的arrVal[1],即70),反而取到了未初始化的x[3](对应原数组的arrVal[4],值为随机数或0),导致求和结果偏差,最终平均值错误。不必要的var参数
参数y仅用于传递元素个数,无需用var修饰——var会让参数按引用传递,可能引发意外修改,这里完全没必要使用。
修正后的函数代码
Function Average(x : array of Integer; y : Integer): Real; var e : Integer; fTotal : Real; begin fTotal := 0; // 从开放数组的0索引开始遍历前y个元素 for e := 0 to y - 1 do begin fTotal := fTotal + x[e]; end; // 处理y=0的边界情况,避免除以0错误 if y > 0 then Result := fTotal / y else Result := 0; // 可根据需求改为返回NaN或其他默认值 end;
修正后的测试代码
var arrVal : array[1..50] of integer; iCount : Integer; fAverage : Real; begin arrVal[1] := 70; arrVal[2] := 80; arrVal[3] := 90; iCount := 3; fAverage := Average(arrVal, iCount); // 若要计算整个数组的平均值,可直接用数组自身的边界值: // fAverage := Average(arrVal, High(arrVal) - Low(arrVal) + 1); end;
说明
修正后的循环从0开始到y-1,正确取到开放数组的前y个元素(对应原数组的arrVal[1]、arrVal[2]、arrVal[3]),求和后除以y即可得到预期的80。同时增加了y>0的判断,避免出现除以0的运行时错误。
内容的提问来源于stack exchange,提问作者Adriaan De Lange
相关产品推荐
相关产品推荐

