Result 变量是从函数的第一行定义的吗?

2023-11-25

我需要澄清这个案子。

根据我的测试,结果变量定义为: 从第一行开始,Boolean=False、Integer=0、String=''、Object=nil 等。 但我从未见过这方面的官方参考。 这也是有道理的,因为这给出了暗示。

[DCC 警告] Unit1.pas(35):H2077 分配给“TForm1.Test”的值从未使用过

function TForm1.Test: Boolean;
begin
  Result := False;
  // Some arbitrary code here

  Result := True;
end;

但是,如果我注释掉第一行并且最后一行之前的某处出现异常,会发生什么情况?结果=假吗?

如果 Result 未定义,这意味着我always必须通过定义 Result 来启动每个函数,以防稍后出现异常。这对我来说毫无意义。


正如所指出的Delphi 官方文档,结果是:

  • CPU 寄存器 (AL / AX / EAX / RAX / EAX:EDX) 用于寄存器中包含的序数值和元素;
  • FPU 寄存器(st(0) / XMM1);
  • 作为最新参数传递的附加变量。

一般规则是默认情况下不定义结果值。你必须设置它。编译器将警告您任何丢失的结果集。

对于字符串、动态数组、方法指针或变量结果, 效果与函数结果被声明为相同 声明参数后面的附加 var 参数。其他 换句话说,调用者传递一个额外的 32 位指针,该指针指向 返回函数结果的变量。

准确地说,var参数不仅适用于托管类型,而且仅适用于record or object结果在调用之前在堆栈上分配,因此具有相同的行为。

也就是说,例如,如果您的结果是string,它将作为附加传递var范围。因此它将默认包含调用之前的值。这将是''首先,如果多次调用该函数,它将包含以前的值。

function GetString: string;
// is compiled as procedure GetString(var result: string);
begin
  if result='' then
    result := 'test' else
    writeln('result=',result);
end;

function GetRaise: string;
// is compiled as procedure GetRaise(var result: string);
begin
  result := 'toto';
  raise Exception.Create('Problem');
end;

var s: string;
begin
  // here s=''
  s := GetString; // called as GetString(s);
  // here s='test'
  s := GetString; // called as GetString(s);
  // will write 'result=test' on the console
  try
    s := GetRaise; // called as GetRaise(s);
  finally
    // here s='toto'
  end;
end;

所以我的建议是:

  • 修复所有有关未设置结果的编译器警告;
  • 不要假设结果字符串被初始化为 '' (可能是第一次,但不是在第二次调用时) - 这是作为var参数,不作为out范围;
  • Any exception将被处理as usual,即运行的流程会跳转到下一个finally or except块 - 但如果你有一个结果作为var参数,并且某些内容已经分配给result,该值将被设置;
  • 这并不是因为在大多数情况下,未设置的结果序数值(例如布尔值)为 0(因为在返回之前的 asm 代码中 EAX=0),所以下次会出现这种情况(我在客户端看到过随机问题)由于这种未设置的结果变量:它在大多数情况下都有效,然后有时代码会失败......);
  • 您可以使用exit()在较新版本的 Delphi 上返回值的语法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Result 变量是从函数的第一行定义的吗? 的相关文章

  • 如何使用 jQuery 和“长轮询”通过 Indy HTTP 服务器动态更新 HTML 页面?

    我读过这篇文章使用 JavaScript 和 jQuery 的简单长轮询示例 http techoctave com c7 posts 60 simple long polling example with javascript and j
  • Indy FTP 传输类型

    我正在使用 IdFTP Indy 10 组件从远程位置下载一些文件 zip 和 txt 在获取每个文件之前 我将 TransferType 设置为二进制 IdFTP TransferType ftBinary IdFTP Get ASour
  • EIdOSSLUnderlyingCryptoError 和“使用 SSL 连接时出错。错误:14094410...”

    我在 OS X 上的 Delphi 10 1 Berlin 中遇到 Indy 组件问题 我正在使用TIdHTTP使用 HTTPS 连接到 Web 服务 问题是从 OS X 客户端连接到服务器 在 OS X 上运行时 我总是遇到同样的错误 P
  • 如何允许表单接受文件删除而不处理 Windows 消息?

    在 Delphi XE 中 我可以允许我的表单接受文件 拖放 但不必处理裸窗口消息吗 您不需要处理消息来实现这一点 你只需要实施IDropTarget并打电话RegisterDragDrop RevokeDragDrop 这真的非常非常简单
  • 使用 StretchDIBits 使用 Delphi 6 处理条形码图像 - 输出中缺少条形线

    我的应用程序是在 Delphi 6 中开发的 由于后台处理和大量数据 它消耗大约 60MB 120MB 物理内存 这是一个资源密集型应用程序 该应用程序的功能之一是在进行某些处理后创建条形码图像 如果用户继续生成条形码 那么至少十分之一的条
  • Delphi - 将物理路径(设备文件句柄)转换为虚拟路径

    我怎样才能转换像这样的路径 设备 HarddiskVolume3 Windows 进入其相应的虚拟路径 如本例中的 c Windows 我个人更喜欢原生方式 function GetHDDDevicesWithDOSPath TString
  • 我应该害怕使用 UDP 进行客户端/服务器广播通话吗?

    我在过去的两天里阅读了每一篇StackOverflow问题和答案 以及googling当然 关于印地TCP and UDP协议 以便决定在我的用户应用程序和 Windows 服务之间的通信方法中应该使用哪一种 从我目前所看到的来看 UDP是
  • 如何读取注册表项的默认值

    我有一个 Delphi XE2 项目来使用注册表项进行某些操作 所以我定义了以下代码 procedure TMainForm BitBtn01Click Sender TObject var RegistryEntry TRegistry
  • 从delphi应用程序调用.net4.0 com服务器后出现错误异常

    我们正在将代码库从 BDS2006 迁移到 Rad Studio XE 我们发现了一些非常奇怪的行为 如果我们在从 Net4 0 中实现的 COM 服务器创建一些对象后进行无效的浮点运算 即除以零 我们不会没有得到正常异常 即 EDivis
  • 如何追踪“地址 00000000”的访问违规

    我知道如何创建 map 文件来在错误消息包含实际地址时跟踪访问冲突错误 但是如果错误消息说怎么办 Access violation at address 00000000 Read of address 00000000 我从哪里开始寻找这
  • DELPHI 和 WANT 或 NANT

    We use 巡航控制 net http confluence public thoughtworks org display CCNET Welcome to CruiseControl NET在 Delphi 2006 应用程序中进行持
  • 使用项目中的波形文件

    我目前只能通过将波形文件放在已编译的 exe 旁边来播放背景声音 但我实际上想要一个包含波形文件的静态可执行文件 这在Delphi XE2中可能吗 这是我的代码 SndPlaySound Raw wav SND ASYNC or SND L
  • Delphi应用程序窗口z顺序和MainFormOnTaskBar属性

    我正在维护一个最初用 Delphi 7 编写并移植到 Delphi XE 的应用程序 使用 Windows 7 我们遇到了一些问题 例如模态窗口出现在主窗口下方 以及最终无法与程序交互 因为用户需要与模态窗体交互 而这是不可能的 因为它位于
  • 如何用不同的颜色绘制选定的列表框项目?

    是否可以更改 TListBox 中的项目选择焦点颜色和文本颜色 当项目中未启用主题或列表框样式设置为所有者绘制时 项目周围的选择将被涂成蓝色 我相信这是由系统的外观设置全局定义的 我想将所选项目的颜色更改为自定义颜色 举个例子 结果会是这样
  • 如何使 StringGrid 的列适合网格的宽度?

    我已经寻找解决方案很长时间了 但没有任何运气 有谁知道一个简单的方法来做到这一点 例如 我想拉伸网格的第二列以适应网格的宽度 Use the ColWidths财产 像这样 with StringGrid1 do ColWidths 1 C
  • Delphi中使用FindVCLWindow调用WinHelp32(WinXP Pro SP3 32bit)

    有什么问题吗 procedure TForm1 VCLHelpClick Sender TObject var Ctrl TWinControl begin Ctrl FindVCLWindow Mouse CursorPos if Ctr
  • 如何比较枚举类型集

    从某个时刻开始 我厌倦了编写设定条件 and or 因为对于更多的条件或更长的变量名 重新编写会变得笨拙且烦人 所以我开始写助手这样我就可以写ASet ContainsOne ceValue1 ceValue2 代替 ceValue1 in
  • logback的“谨慎模式”是如何实现的?

    The 审慎模式 http logback qos ch manual appenders html prudentlogback 中的序列化所有 JVM 之间的 IO 操作 写入同一文件 可能运行在不同的主机上 在其他日志记录框架中 如果
  • Delphi 的内存分析工具?

    我建立了一个项目并运行它 然后在 Process Explorer 中查看它 结果发现它在启动时使用的 RAM 比我想象的要多 5 倍 现在 如果我的程序运行得太慢 我会将其连接到分析器并让它告诉我什么正在使用我的所有周期 有没有类似的工具
  • FireMonkey iOS RAD Studio XE2 - 在从 URL 加载的表单上显示图像

    是否可以将 TImage 放置在 iOS 的 FMX 表单上 并将图像 jpg 从 URL 加载到此 TImage 中以在 iOS 应用程序中显示 我尝试过但没有成功 任何正确方向的提示或指出都会受到赞赏 将 TButton TImageC

随机推荐

  • 理解封装和抽象的简单方法

    学习 OOP 概念特别有兴趣深入理解抽象和封装 已经查看了下面的内容 抽象VS信息隐藏VS封装 抽象和封装之间的区别 我发现如果没有真实且简单的示例类 代码片段 很难理解这些概念 我的一位同事说抽象只不过是创造抽象 类和用范围保护其成员变量
  • 在 Windows Phone 8.1 上获取 CivicAddress

    我正在尝试从 Windows Phone 8 1 中的地理位置获取 CivicAddress 我尝试使用以下代码 Get Current Location var geolocator new Geolocator geolocator D
  • 属性的使用... INotifyPropertyChanged

    这只是我在学习属性时想到的事情 而且我太多地使用了 INotifyPropertyChanged 这只是一个想法 我想听听一些关于它的意见 我知道这需要在编译器上做一些工作 而不是在消费者方面 由于 INotifyPropertyChang
  • 如何在 MySQL 中存储 varbinary?

    只是一个简单的问题 在下面提到的两个选项中 如何存储到varbinaryMySQL 中的列 public key 67498930589635764678356756719 or public key 6749893058963576467
  • 如何为 android MediaController 创建自定义 UI

    我想为我的视频播放器自定义 MediaController 中的控件 我想更换播放按钮的图像 更改皮肤 更改颜色等 有已知的方法可以做到这一点吗 Thanks 我在最近的一个项目中遇到了同样的问题 最终基于库存 MediaControlle
  • “ascii”编解码器无法对位置 9 中的字符 u'\u2013' 进行编码:序号不在范围内(128)

    我正在尝试导入 cvs 但出现此错误 UnicodeEncodeError at brokers csv ascii codec can t encode character u u2013 in position 9 ordinal no
  • 将多个本机 DLL 合并为一个 DLL

    我有很多小的 DLL 我想将它们制作成一个大的 呃 DLL 如在这里建议 我可以通过合并我的项目来做到这一点 但我想要一种侵入性较小的方式 多个DLL可以合并为一个单元吗 快速搜索发现这个线程声称这是不可能的 还有人知道吗 请注意 我谈论的
  • 关闭Form时出现异常(线程+调用)

    我刚刚开始学习c 中的线程和方法调用 但我遇到了一个我找不到解决方案的问题 我制作了一个基本的 C 表单程序 它通过启动线程并调用委托来不断更新和显示数字 在 Form1 load 上启动新线程 private void Form1 Loa
  • Spring security - 如何提及基于表单的身份验证和基本身份验证

    是否可以使用名称空间配置在 Spring security 中提及基于表单的身份验证和基本身份验证 而不覆盖其他身份验证 这样应用程序就可以为基于浏览器的请求和远程客户端提供服务 The grimesjm 的回应是对的 但是 如果您使用 S
  • Java中栈帧的内容

    从Java虚拟机实现中可以明显看出 http docs oracle com javase specs jvms se7 html index html 该堆栈帧存在于堆上 用于存储方法的运行时数据 但是java中栈帧的内容是什么以及栈帧是
  • 让div占据100%的身体高度,减去固定高度的页眉和页脚[重复]

    这个问题在这里已经有答案了 根据我的研究 这似乎是一个绝对经典的 CSS 问题 但我找不到明确的答案 所以 StackOverflow 就是这样 如何设置内容 div 占据正文高度的 100 减去固定高度页眉和页脚所占据的高度
  • 在 C# 中使用 LINQ 从名称值列表中获取 4 个元素的组

    我想循环遍历这个名称值对列表 并将它们分成 4 个一组 数据会是这样的 value1 1 value2 1 value3 1 value4 1 value1 2 value2 2 value3 2 value4 2 它会将其分组为 1 个列
  • 仅使用 css 换行(如

    是否可以在纯CSS中 即不添加额外的html标签 进行换行 例如 br 我想要在之后换行 h4 元素 但不在之前 HTML li Text text text text text h4 Sub header h4 Text text tex
  • 具体来说,VMMap 如何知道给定的内存区域是线程堆栈?

    我一直在使用 Mark Russinovich 的 VMMap 来为我正在分析的进程映射虚拟内存 使用 VirtualQueryEx 我可以遍历外部进程的空间并获取有关进程地址空间内的内存区域的信息 当然 这些区域与 VMMap 匹配 但
  • std::function 可以用来存储带有可变参数的函数吗[重复]

    这个问题在这里已经有答案了 我有一个在应用程序中传递的结构 其中包含一堆回调函数 typedef struct std function
  • 从 pyenv-virtualenv 切换到 pipelinev 时保持相同的共享 virtualenv

    我开始看pipenv看起来还不错 我唯一担心的是 我的大部分项目都涉及numpy scipy和其他一些不那么小的图书馆 目前管理我的项目的方式 I have pyenv and pyenv virtualenv安装 我有一些 目前是 4 个
  • 选择/取消选择所有按钮以进行闪亮的变量选择

    我有这样的语句 可以让我获得有关变量的基本描述性统计数据 checkboxGroupInput show vars Columns in diamonds to show names input data selected names in
  • 如何将模型从视图传递到局部视图?

    我有一个观点是not强类型 然而 在这个视图中 我有一个强类型的部分视图 如何将模型传递给这个强类型视图 我尝试过类似的东西 public ActionResult Test MyData new Data MyData One 1 ret
  • 如何找到 Azure 存储帐户上的热 LRS 写入操作的来源?

    我们使用 Azure 存储帐户来存储我们的应用程序应根据用户需求下载的一些文件 尽管不应该有写入操作 至少我能想到没有 但在计费周期的几天后 我们就超出了包含的写入操作 见图 就价格而言 还在限制范围内 但我还是想知道这是否正常 以及如何分
  • Result 变量是从函数的第一行定义的吗?

    我需要澄清这个案子 根据我的测试 结果变量定义为 从第一行开始 Boolean False Integer 0 String Object nil 等 但我从未见过这方面的官方参考 这也是有道理的 因为这给出了暗示 DCC 警告 Unit1