所以我总是听说类字段(基于堆)被初始化,但基于堆栈的变量不是.我还听说记录成员(也是基于堆栈的)也没有初始化.编译器警告局部变量未初始化([DCC警告] W1036变量'x'可能尚未初始化),但不会对记录成员发出警告.所以我决定进行测试.
对于所有记录成员,我总是从Integers得到0而从布尔都得到假.
我尝试打开和关闭各种编译器选项(调试,优化等),但没有区别.我的所有记录成员都正在初始化.
我错过了什么?我正在使用Delphi 2009 Update 2.
program TestInitialization;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TR = Record
Public
i1, i2, i3, i4, i5: Integer;
a: array[0..10] of Integer;
b1, b2, b3, b4, b5: Boolean;
s: String;
End;
var
r: TR;
x: Integer;
begin
try
WriteLn('Testing record. . . .');
WriteLn('i1 ',R.i1);
WriteLn('i2 ',R.i2);
WriteLn('i3 ',R.i3);
WriteLn('i4 ',R.i4);
WriteLn('i5 ',R.i5);
Writeln('S ',R.s);
Writeln('Booleans: ', R.b1, ' ', R.b2, ' ', R.b3, ' …Run Code Online (Sandbox Code Playgroud) 函数的Result变量是否有任何保证的默认值,如0,''或nil?或者结果总是在使用前初始化?
我有一个函数返回一个这样的字符串:
function Foo(): String
begin
while {...} do
Result := Result + 'boingbumtschak';
end;
Run Code Online (Sandbox Code Playgroud)
它运行正常,但现在我得到一些字符串,其中包含之前调用该函数的内容.当我Result := ''在开头添加一个,它没关系.我什么时候应该初始化Result变量,什么时候不需要?(字符串,基元,类实例(零))
我遇到一个奇怪的问题.
我使用Delphi和Indy上传和备份一些文件.它在许多计算机上运行得很好(Win7 64bit,WinXP).CPU使用率低于1%和最大值.RAM为20MB.
但是有一台计算机(Win 2008 R2)存在问题,我无法找到原因.CPU使用率为5-20%,内存需要100MB +,并且增加了很多.此外,"页面错误"上升很多,例如.每秒10万(我的电脑没有增加)
代码很简单
var
IdHTTP: TIdHTTP;
IdPostData: TIdMultiPartFormDataStream;
sResponse: string;
begin
IdHTTP := TIdHTTP.Create(nil);
IdPostData:=TIdMultiPartFormDataStream.Create;
try
IdPostData.AddFile('file', 'C:\data.dat', '');
sResponse:=IdHTTP.Post('http://web.com', IdPostData);
ShowMessage(sResponse);
finally
IdHTTP.Free;
IdPostData.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
有没有人知道为什么"页面错误"增加了很多?是否有可能存在硬件问题?怎么找到它?
我相信在delphi中局部整数变量没有初始化为零.初始值是在该存储器位置发生的任何事情.因此,在第一次单击按钮时,下面的代码中,第一条消息显示整数值.为什么第二次点击它不会显示3而是显示相同的整数值?每次单击按钮时,它都会继续显示相同的整数值.仅当我停止并重新启动程序时,该值才不同.3存储在哪里,因为看起来每次在同一程序运行中单击按钮时使用相同的内存位置?
procedure TForm1.Button1Click(Sender: TObject);
var
int1 : integer;
begin
showmessage(inttostr(int1)) ;
int1 := 3;
end;
end.
Run Code Online (Sandbox Code Playgroud) 今天有一位朋友问我下面的代码:
var
a: Integer;
begin
ShowMessage(IntToStr(a));
end;
Run Code Online (Sandbox Code Playgroud)
这是局部变量,尚未初始化,好吗?
将代码放在按钮组件的OnClick事件中,然后以下面三种不同的方式运行代码:
我在两台不同的计算机上测试代码并看到相同的结果,对此有何看法?
快速问题我找不到任何信息.
在我创建的一个组件上,我有一个Integer类型的值.
我只需要允许在Object Inspector中输入的值在0-10之间,任何超出此范围的内容都应显示一条消息,说明输入的值不合适,然后将焦点返回给Delphi Object Inspector .
例:
TMyComponent = class(TComponent)
private
FRangeVal: Integer;
procedure SetRangeVal(const Value: Integer);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property RangeVal: Integer read FRangeVal write SetRangeVal default 0;
end;
...
procedure SetRangeVal(const Value: Integer);
var
OldValue: Integer;
begin
OldValue := Value;
if (Value < 0) or (Value > 10) then
begin
MessageDlg('Please enter a value between 0-10', mtError, [mbOK], 0);
// FRangeVal := OldValue; ?? revert to the last value that worked …Run Code Online (Sandbox Code Playgroud) 我看了很多帖子在论坛上指点一下,Assigned功能,Free性能,FreeAndNil功能等......我已经知道自由功能不去除指针引用到分配的对象,FreeAndNil做它...所有的帖子我看了对待这个问题的考虑Create方法已经被执行,或者换句话说,考虑已经创建的对象.
我的问题是:为什么Assigned函数对于未初始化的对象变量返回true?
举个例子:
procedure TForm1.FormCreate(Sender: TObject);
var
Qry: TADOQuery;
begin
if Assigned(Qry) then
ShowMessage('Assigned')
else
ShowMessage('Unassigned');
Qry := TADOQuery.Create(nil);
if Assigned(Qry) then
ShowMessage('Assigned')
else
ShowMessage('Unassigned');
end;
Run Code Online (Sandbox Code Playgroud)
该示例显示"已分配"两次!
结论:在Qry声明之后,在创建方法执行之前,指针Qry就不是NIL!
如果我把Qry := nil;第一行放到上面的程序中,一切正常......它显示'未分配'和'已分配'.
为什么??
有没有什么安全的方法可以知道类变量是否已经执行了create方法?
我上课了
type
TLoadOption = class
private
FAutoSearch: Boolean;
public
property AutoSearch: Boolean read FAutoSearch write FAutoSearch;
end;
Run Code Online (Sandbox Code Playgroud)
在其中一个函数中,我在堆栈中创建类的对象
procedure MyView.InitializeForm(const aMsg: MyMsg);
//---------------------------------------------------------------------------
var
Options: TLoadOption;
begin
if aMsg.OptionalObject <> nil then
Options := aMsg.OptionalObject as TLoadOption;
if Assigned(Options) and Options.AutoSearch then
DoRefresh;
end;
Run Code Online (Sandbox Code Playgroud)
我没有在aMsg中传递任何内容,所以理想情况下没有设置选项.
在Delphi XE中默认选项设置为nil,因此不会调用此DoRefresh但是当我在Delpi XE4中执行相同的代码时,选项会使用一些随机值进行初始化,并且AutoSearch始终变为true,这会导致调用此DoRefresh函数,这是不需要.
我想知道是否有任何编译器选项将默认值设置为未初始化的变量.我现在唯一的解决方案就是这样
procedure MyView.InitializeForm(const aMsg: MyMsg);
//---------------------------------------------------------------------------
var
Options: TLoadOption;
begin
Options := nil;
if aMsg.OptionalObject <> nil then
Options := aMsg.OptionalObject as TLoadOption;
if Assigned(Options) and Options.AutoSearch then
DoRefresh;
end;
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?
我正在将一些 C# 代码转换为 Delphi。
在 c# 中,我有 Nullabe 类型:
System.Nullable<T> variable
Run Code Online (Sandbox Code Playgroud)
或者
T? variable
Run Code Online (Sandbox Code Playgroud)
然后,我可以使用一些东西:
int?[] arr = new int?[10];
Run Code Online (Sandbox Code Playgroud)
是否有一些与它等效的 Delphi VCL?
delphi ×10
variables ×2
c# ×1
delphi-2009 ×1
delphi-xe ×1
delphi-xe4 ×1
indy ×1
null ×1
page-fault ×1
pointers ×1