内容简介:翻译自:https://stackoverflow.com/questions/10726052/why-compiler-skips-assigning-variable
我有以下程序:
procedure GetDegree(const num : DWORD ; var degree : DWORD ; min ,sec : Extended); begin degree := num div (500*60*60); min := num div (500*60) - degree *60; sec := num/500 - min *60 - degree *60*60; end;
在指定了度变量后,调试器会跳到过程的结尾.这是为什么?
这是一个优化.变量min和sec按值传递.这意味着调用者看不到对它们的修改,并且对此过程是私有的.因此,编译器可以确定分配给它们是没有意义的.永远无法读取分配给变量的值.因此编译器选择节省时间并跳过分配.
我希望你的意思是声明这样的程序:
procedure GetDegree(const num: DWORD; var degree: DWORD; var min, sec: Extended);
正如我在上一个问题中所说,使用Extended并没有多大意义.使用其中一种标准浮点类型(单或双)会更好.甚至使用映射到Double的通用Real.
此外,您已声明min为浮点类型,但计算计算整数.在这方面,我对你上一个问题的回答非常准确.
我建议你创建一个记录来保存这些值.传递三个独立的变量会使您的函数接口非常混乱并破坏封装.这三个值只有在考虑整体时才有意义.
type
TGlobalCoordinate = record
Degrees: Integer;
Minutes: Integer;
Seconds: Real;
end;
function LongLatToGlobalCoordinate(const LongLat: DWORD): TGlobalCoordinate;
begin
Result.Degrees := LongLat div (500*60*60);
Result.Minutes := LongLat div (500*60) - Result.Degrees*60;
Result.Seconds := LongLat/500 - Result.Minutes*60 - Result.Degrees*60*60;
end;
function GlobalCoordinateToLongLat(const Coord: TGlobalCoordinate): DWORD;
begin
Result := Round(500*(Coord.Seconds + Coord.Minutes*60 + Coord.Degrees*60*60));
end;
翻译自:https://stackoverflow.com/questions/10726052/why-compiler-skips-assigning-variable
以上所述就是小编给大家介绍的《delphi – 为什么编译器会跳过赋值变量》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- C赋值运算符 – 编译器生成还是自定义?
- 少说话多写代码之Python学习023——赋值语句的用户02(链式赋值、增量赋值)
- 理解Golang多重赋值
- ES6 解构赋值
- 【ES6复习】解构赋值
- 问题分享:Js引用类型赋值
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
圈圈教你玩USB
刘荣 / 2013-4 / 59.00元
通过U盘、USB鼠标、15SB键盘、USBMIDI键盘、USB转串口、自定义的USBHID设备和自定义的USB设备等几个具体的USB例子,一步步讲解USB设备及驱动程序和应用程序开发的详细过程和步骤。第9和10章介绍USBWDM驱动开发,并给出一个简单的USB驱动和USB上层过滤驱动的实例。第2版中新增4章内容,包括USB触摸屏设备、移植到AVR单片机和ARM微控制器上以及更多的USB设备的实现。......一起来看看 《圈圈教你玩USB》 这本书的介绍吧!