如何解决这个问题的最重要的想法是正确阅读您的错误消息。在上一个问题上您评论说:“错误是说它是一个重载的函数或其他东西”。这种态度不会帮助你理解问题。您需要正确阅读错误消息。
在这个问题中,您对您的错误进行以下描述:
所以2个错误是错误:不兼容的类型:得到“AnsiString”预期“LongInt”这是平均:=总和/计数;错误:不兼容的类型:得到“字节集”预期“双”此错误是针对温度 [K] := lstTemp.Items[K];
但是,根据提供的代码,描述与您应该看到的错误不对应。
看起来您没有阅读您的错误,只是盲目地开始进行更改,希望您会意外地做正确的事情。因为您没有阅读错误,所以您没有注意到它们发生了变化。所以当你来找我们寻求帮助时,你用新代码提供了旧错误,反之亦然。
如果您确实正确阅读了错误消息,您可能已经能够自己解决问题。至少,您可以通过与代码实际匹配的描述提出更好的问题。
平均值:=总和/计数;
Average
,Sum
并且Count
都被声明为Integer
. 您应该得到的错误消息是:“不兼容的类型:整数和扩展”。
如果您阅读了错误消息,它应该为您提供阅读的线索Integer
和Extended
。
这里的问题是,在数学中,除法产生一个有理数。相应地,程序中除法运算的结果不是整数。所以你需要声明Average
为Double
or Extended
。
温度[K] := lstTemp.Items[K];
Temperatures
被声明为一个数组Integer
。您没有显示 的声明lstTemp
,但根据其他代码,它是已Items
声明为的标准 Delphi 控件之一TStrings
。所以你应该得到的错误信息是:“不兼容的类型:整数和字符串”。
如果您阅读了错误消息,它应该会为您提供与之前 5 行相同的操作的线索。
出现此错误的原因是 Delphi 是一种“强类型”语言。编译器试图防止您犯某些类型的错误,因为最好尽早发现它们。想象一下如果其中的值之一是会发生lstTemp
什么'Hello'
。那不能转换为整数;并且会在您的程序中导致“运行时”错误。
要解决此问题,您需要告诉编译器:“我知道该值是一个字符串,可以是任何字符串,但我希望您将其转换为整数”。你可以通过调用StrToInt
函数来做到这一点。注意:如果将无效字符串传递给函数,您仍然会收到运行时错误,但是通过强制显式进行转换,您可以考虑是否要对输入数据进行一些预验证。
您询问了编译器报告的错误。这只是你在编程时会遇到的一种错误——通常是最容易解决的。您还会遇到逻辑错误:您的程序编译成功,但行为不正确。安德烈亚斯的优秀答案已经涵盖了这些,所以我不会重复它们。
不过,我会给你一些宝贵的建议。一旦您克服了解决编译器错误的障碍,并且能够轻松地做到这一点 - 您需要尽快:
- 养成彻底测试代码的习惯。
- 了解如何使用集成调试器。
- 了解它的局限性。
- 学习其他调试技术:日志记录、分析、前置和后置条件检查。
最后,作为对alcalde 抱怨没有任何简单的函数来获取 Min、Max、Sum 或 Avg 的回应:我提供了另一种可能的实现。
基本上,咆哮是关于他宁愿写一些类似以下内容的事实:
begin
if (lstTemp.Count > 0) then
begin
edtMin.Text := lstTemp.Min;
edtMax.Text := lstTemp.Max;
edtAvg.Text := lstTemp.Average;
end
else
begin
ShowMessage('List is empty');
end;
end;
显然上面的代码不会编译,但是通过一些工作我们可以实现类似的东西。
他在两个方面是完全正确的:(1)这个实现会更干净,更容易维护并且出错的机会更少。(2) Delphi 没有提供一种方法来简单地做到这一点。
事实上,如果您遵循自上而下的设计方法,这可能是您最初的伪代码。应该教你自上而下的设计,如果不是要求你退款。:)
自顶向下设计方法背后的重点是您正在寻找一个理想的实现。您不必担心存在/不存在什么。如果当前的库和工具不提供Min
功能,您可以编写自己的.
你是程序员,你有力量!
我有时喜欢称其为“一厢情愿的编程”。您希望如果有其他东西,我可以像“this”那样更轻松地实现该功能。然后你去实现你的愿望。
事不宜迟,这里是实现。您将需要使用数学单元。
type
{ We will call existing functions that take TDoubleArray as input }
TDoubleArray = array of Double;
TStringsHelper = class(TStrings)
{ A useful class to help us convert TStrings into TDoubleArray }
public
class function Using(AStrings: TStrings): TStringsHelper;
function AsDoubleArray: TDoubleArray;
end;
{ TStringsHelper }
function TStringsHelper.AsDoubleArray: TDoubleArray;
var
LoopI: Integer;
begin
SetLength(Result, Count);
for LoopI := 0 to Count - 1 do
begin
Result[LoopI] := StrToFloat(Strings[LoopI]);
end;
end;
class function TStringsHelper.Using(AStrings: TStrings): TStringsHelper;
begin
Result := TStringsHelper(AStrings);
end;
var
LTemperatures: TDoubleArray;
begin
{ This code is almost the same as our "ideal" implementation }
if (lstTemp.Items.Count > 0) then
begin
LTemperatures := TStringsHelper.Using(lstTemp.Items).AsDoubleArray;
edtMin.Text := FloatToStr(MinValue(LTemperatures));
edtMin.Text := FloatToStr(MaxValue(LTemperatures));
edtMin.Text := FloatToStr(Mean(LTemperatures));
end
else
begin
ShowMessage('List is empty');
end;
end;