You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi数组平均值函数异常:无论输入值如何结果始终约为50,求排查

Delphi数组平均值函数返回错误结果的问题分析与解决

问题根源

  1. 开放数组索引误用
    Delphi的array of Integer属于开放数组参数,其索引固定从0开始,和你定义的静态数组arrVal[1..50]的索引范围无关。你的循环for e := 1 to y do会跳过开放数组的第一个元素(对应原数组的arrVal[1],即70),反而取到了未初始化的x[3](对应原数组的arrVal[4],值为随机数或0),导致求和结果偏差,最终平均值错误。

  2. 不必要的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 00:45:46