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 变量是从函数的第一行定义的吗? 的相关文章

  • delphi检查ini文件是否存在

    如何检查 INI 文件是否存在 在特定路径和特定名称下 比如这样 if FileExists c yourinifile ini then ShowMessage c yourinifile ini exists
  • Delphi RTTI,已发布的属性出现两次

    我想对属性使用属性 但这些属性偶尔会在继承的类中发生更改 这是一个示例代码 非常简化 TBaseClass class TObject private FFoo string published BaseAttirib hello prop
  • Delphi 如何与 Active Directory 集成?

    我们需要使用 Delphi 7 验证 Microsoft Active Directory 上的用户 最好的方法是什么 我们可以有两种情况 用户输入其网络用户名和密码 其中用户名可能包括域 然后我们检查活动目录是否是有效的活动用户 或者我们
  • 有什么办法可以将2个数组添加到一个数组中吗?

    有没有一种简单通用的方法可以将两个数组添加到一个数组中 在下面的情况下 不可能简单地使用C A B陈述 我想避免每次都为它制定算法 TPerson record Birthday Tdate Name Surname string end
  • ComboBox.Sorted 发生了什么:= True;在德尔福 10.2 中?

    最近我的最后一个问题获得了 风滚草 徽章 我不确定是否应该问更多问题 但这里是 我正在填充一个TComboBox使用 sqlite 表中的项目 效果很好 在我以前的 Delphi 版本中 我能够使用ComboBox1 Sorted True
  • 如何添加资源并使用它们

    在我的应用程序中 我想添加 2 个图像作为资源 我想使用这些图像 当我在应用程序中单击 是 按钮时 第一张图像将被设置为壁纸 当我在应用程序中单击 否 按钮时 第二张图像将被设置为桌面壁纸 提前致谢 regards 最简单的方法是创建一个文
  • 在运行时创建 TQReport 元素

    在运行时创建 TQReport 元素 嗯 至少尝试一下 我不知道这份报告中应出现哪些标题或数据 我得到一个代表数据行和列的 TString 的 TList 我在组的带打印事件中植入 创建 指令 并在主数据行带的 OnNeedData 事件中
  • VCL.位图到 FMX.位图

    我在网上找到了这段代码 但 FMX Bitmap 没有扫描线 是否可以以某种方式将 VCL TBitmap 复制或绘制到 FMX Bitmap IFDEF MSWINDOWS type TBitmap FMX Types TBitmap T
  • 如何在 Vista 上安装 Delphi 7

    我多次尝试在 Vista 上安装 Delphi 7 但 Vista 告诉我此应用程序 Delphi 7 存在已知问题 从而阻止了我这样做 我公司的其他几个人在 Vista 上安装 D7 时遇到了问题 由此得出的结论是 我们的 D7 应用程序
  • delphi 变量值在循环中的线程中发生变化

    我的代码正在运行一个 for 循环来处理一些数据 如下所示 procedure printValue Value Integer begin TThread Synchronize TThread Current procedure beg
  • 开源 Delphi 包可使用哪些项目选项?

    我写了一些 Delphi 代码 想在 GitHub 上分享 所有代码都根据需要包含在运行时和设计时包中 每个项目有许多项目选项需要设置 输出目录 搜索路径 编译选项等 我设法找到了一些适合我的情况的默认选项 但阅读此处的其他问答很明显有多个
  • 当显示对话框时淡出应用程序的所有其他窗口?

    如何在 Delphi 2009 中调暗 淡出应用程序的所有其他窗口 Form 有一个 AlphaBlend 属性 但它仅控制透明度级别 但如果我们能有这样的东西那就太好了 集中窗口 http www anappaday com downlo
  • Async InputQuery 不处理“取消”按钮

    我正在使用一个简单的调用TDialogServiceAsync InputQuery 使用单个输入 它只是忽略了Cancel按钮和窗口的X关闭按钮 But the Ok按钮工作正常 这是我的代码 uses FMX DialogService
  • 带位图的简单组合框

    如何将位图放入组合框中并将样式设置为简单 例如 Google Chrome 的右侧有星号 Firefox 的右侧有箭头 我尝试了这段代码 procedure TForm2 ComboBox1DrawItem Control TWinCont
  • 我如何在Delphi中处理事件?

    例如 我有一个程序 在单击 Button1 后执行某些操作 如果没有 Button1Click 中的代码 如何处理按钮的 onclick 事件 我需要为 Button1 动态添加事件 unit Unit1 interface uses Wi
  • Delphi 返回 TList 时出错

    我做了一个非常简单的应用程序 但我有一个我真的无法理解的问题 看一下这个基本代码 unit Unit1 interface uses Winapi Windows Winapi Messages System SysUtils System
  • 处理 TShellListView 后代中的文件放置

    我正在尝试创建 TShellListView 的后代 它接受从 Windows 资源管理器中删除的文件 我想在组件定义中处理拖 放操作 而不必在任何使用该组件的应用程序中实现它 我找到了接受从 Windows 资源管理器中拖放的文件的示例
  • 如何在调试器中显示 TStringList 的内容?

    我想在调试应用程序时显示 TStringList 的全部内容 相反 我只是得到指示 Flist 仅显示地址 如果您使用的是 Delphi 2010 或更高版本 调试器允许使用调试可视化工具 http docwiki embarcadero
  • 具有 csOwnerDrawFixed 样式的组合框如何表现得像 csDropDown 样式?

    我正在使用一个组合框 http docwiki embarcadero com Libraries en Vcl StdCtrls TComboBoxstyle 属性设置为的组件csOwnerDrawFixed 我实现了绘图项一切工作正常
  • 为什么未初始化的指针会导致内存访问冲突接近 0?

    据说often 但并非总是如此 当你在接近于零的内存位置 比如 89 美元 获得 AV 时 你就有了一个未初始化的指针 但我也在 Delphi 书籍中看到了这一点 嗯 或者它们都是由同一作者写的 Update 引自 Bob Swart 等人

随机推荐

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

    学习 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