相关疑难解决方法(0)

在Delphi中初始化哪些变量?

所以我总是听说类字段(基于堆)被初始化,但基于堆栈的变量不是.我还听说记录成员(也是基于堆栈的)也没有初始化.编译器警告局部变量未初始化([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)

delphi variables initialization delphi-2009

32
推荐指数
2
解决办法
8540
查看次数

Delphi中"结果"的默认值是多少?

函数的Result变量是否有任何保证的默认值,如0,''或nil?或者结果总是在使用前初始化?

我有一个函数返回一个这样的字符串:

function Foo(): String
begin
    while {...} do
    Result := Result + 'boingbumtschak';
end;
Run Code Online (Sandbox Code Playgroud)

它运行正常,但现在我得到一些字符串,其中包含之前调用该函数的内容.当我Result := ''在开头添加一个,它没关系.我什么时候应该初始化Result变量,什么时候不需要?(字符串,基元,类实例(零))

delphi

13
推荐指数
2
解决办法
5193
查看次数

Delphi - 分配给'x'的值从未使用过

假设我有以下代码:

function DoSomething:Boolean;
var obj : TMyObject;
i : Integer;
begin
  Result := False; //We haven't executed GetValue() correctly yet
  obj := TMyObject.Create();
  try
    //perform some code that may produce an exception        
    i := obj.GetValue();
    //Set the return to True as we executed GetValue() successfully
    Result := True;
  finally
    //do some cleanup
    obj.Free; 
  end;
end;
Run Code Online (Sandbox Code Playgroud)

Delphi编译器抱怨分配给Result的值从未在第一行中使用.

我可能错过了一些明显的东西,但我不明白为什么编译器会优化它(如果优化已经开启).

我一直被教导要明确设置我的变量,以免混淆他们的价值观.最重要的是,如果GetValue()函数生成异常,该Result := True;行将永远不会执行.因此,无论Delphi初始化变量是什么,我们都会受到怜悯.

这是安全/可接受的代码吗?我应该简单地删除方法的第一行,这会使它更难阅读吗?如果失败,我将不得不关闭特定的编译器警告,但我不愿意这样做,因为此警告消息可以提供有用的信息.

delphi compiler-warnings

5
推荐指数
2
解决办法
3583
查看次数

OleVariant变量的初始值

我一直认为OleVariant变量的初始值总是等于Unassigned(类型VT_EMPTY).但是下面用XE3编译的简单代码告诉我这不是真的.

{$APPTYPE CONSOLE}

uses
  ActiveX;

function GetValue: OleVariant;
begin
  Result := TVariantArg(Result).vt;
end;

function GetValue2: OleVariant;
begin
  Result := 10;
  Result := GetValue;
end;

var
  Msg: string;
begin
  Msg := GetValue2;
  Writeln(Msg);
end.
Run Code Online (Sandbox Code Playgroud)

App写"3".这是正常的吗?

delphi

4
推荐指数
1
解决办法
334
查看次数

我是否需要在初始化时将setLength设置为动态数组?

type Tmyclass = class(TObject)
  somearray: array of TSometype
  FBool: Boolean;
  Fint: Integer;
  Fstr: string;
  constructor Create;
  destructor Destroy; override;
end;

implementation

constructor Tmyclass.Create;
begin
  inherited;
  SetLength(somearray,0); //is this needed?
end;

destructor TmyClass.Destroy;
begin
  SetLength(somearray,0); //this IS needed!
  inherited;
end;
Run Code Online (Sandbox Code Playgroud)

还有什么类型在创建时初始化?例如我在课堂上宣布的内容.FBool被保证是假的吗?是FInt保证是0吗?是Fstr保证是''?

当地情况怎么样?只有字符串?

我使用Delphi XE.

delphi delphi-xe

3
推荐指数
4
解决办法
5173
查看次数