Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi dcc32警告UnloadProcs.pas(59):函数“GetType”的W1035返回值可能未定义_Delphi_Function_Build_Warnings_Delphi Xe2 - Fatal编程技术网

Delphi dcc32警告UnloadProcs.pas(59):函数“GetType”的W1035返回值可能未定义

Delphi dcc32警告UnloadProcs.pas(59):函数“GetType”的W1035返回值可能未定义,delphi,function,build,warnings,delphi-xe2,Delphi,Function,Build,Warnings,Delphi Xe2,有一种数据类型 type TDataTypeId = (DataTypeId_String, DataTypeId_SmallInt, DataTypeId_Integer, DataTypeId_Word, DataTypeId_Boolean, DataTypeId_Float, DataTypeId_Currency, DataTypeId_BCD, DataTypeId_FmtBCD, DataTypeId_Date,

有一种数据类型

type
TDataTypeId = (DataTypeId_String, DataTypeId_SmallInt, DataTypeId_Integer, DataTypeId_Word,
               DataTypeId_Boolean, DataTypeId_Float, DataTypeId_Currency,
               DataTypeId_BCD, DataTypeId_FmtBCD, DataTypeId_Date,
               DataTypeId_Time, DataTypeId_DateTime, DataTypeId_TimeStamp,
               DataTypeId_Bytes, DataTypeId_VarBytes, DataTypeId_Blob,
               DataTypeId_Memo, DataTypeId_Graphic, DataTypeId_fmtMemo,
               DataTypeId_FixedChar, DataTypeId_WideChar, DataTypeId_LargeInt,
               DataTypeId_Array, DataTypeId_FixedWideChar, DataTypeId_WideMemo);
有一个函数,它接受包含此类型值之一的行,并返回此值

Function GetType(str: string): TDataTypeId;
var
typeidx: TDataTypeId;
typestr: string;
begin
for typeidx := Low(TDataTypeID) to High(TDataTypeID) do
 begin
  typestr:=GetEnumName(TypeInfo(TDataTypeId),Ord(typeidx));
  typestr:=Copy(typestr, 12, length(typestr)-11);
  //Memo.Lines.Add(typestr+'\n');
  if (AnsiCompareStr(str, typestr)=0) then
     Result:=typeidx
 end;
 end;
因此,存在一个程序集

[dcc32 Warning] UnloadProcs.pas(59): W1035 Return value of function 'GetType' might be undefined

如何转换没有出现警告的函数?

编译器警告是准确的。如果由于未找到匹配项,If语句的计算结果从未为True,则循环不会分配给Result。然后函数退出而不赋值

您的选择:

在循环完成后,为结果指定一个值,该值指示未找到匹配项。 在循环完成后引发异常。 我还建议您在分配结果后立即退出。当你找到答案时,没有必要继续循环

我可能会这样编写此函数:

Function GetType(str: string): TDataTypeId;
var
  typestr: string;
begin
  for Result := low(Result) to high(Result) do
  begin
    typestr := GetEnumName(TypeInfo(TDataTypeId),Ord(typeidx));
    typestr := Copy(typestr, 12, length(typestr)-11);
    if AnsiSameStr(str, typestr) then
      exit;
  end;
  raise EEnumNotFound.CreateFmt('Enum not found: %s', [str]);
end; 
注意使用结果变量作为循环变量。这是一种惯用方法,有利于减少您声明的局部变量的数量


我同意您可以使用GetEnumValue更有效地解决问题,但我想向您展示如何以惯用的方式处理编译器警告。

编译器警告是准确的。如果由于未找到匹配项,If语句的计算结果从未为True,则循环不会分配给Result。然后函数退出而不赋值

您的选择:

在循环完成后,为结果指定一个值,该值指示未找到匹配项。 在循环完成后引发异常。 我还建议您在分配结果后立即退出。当你找到答案时,没有必要继续循环

我可能会这样编写此函数:

Function GetType(str: string): TDataTypeId;
var
  typestr: string;
begin
  for Result := low(Result) to high(Result) do
  begin
    typestr := GetEnumName(TypeInfo(TDataTypeId),Ord(typeidx));
    typestr := Copy(typestr, 12, length(typestr)-11);
    if AnsiSameStr(str, typestr) then
      exit;
  end;
  raise EEnumNotFound.CreateFmt('Enum not found: %s', [str]);
end; 
注意使用结果变量作为循环变量。这是一种惯用方法,有利于减少您声明的局部变量的数量


我同意您可以使用GetEnumValue更有效地解决您的问题,但我想向您展示如何以惯用的方式处理编译器警告。

其他人已经解释了警告,但更好的例程实现方式是:

uses
  TypInfo, ConvUtils;

Function GetType(str: string): TDataTypeId;
var idx: Integer;
begin
  idx := GetEnumValue(TypeInfo(TDataTypeId), 'DataTypeId_'+str);
  if(idx <> -1)then Result := TDataTypeId(idx)
  else RaiseConversionError('Unknown typeID name: '+str);
end;

ie无需循环遍历所有枚举值并将其作为字符串进行比较,请改用GetEnumValue函数。

其他人已解释了警告,但更好的例程实现方式如下:

uses
  TypInfo, ConvUtils;

Function GetType(str: string): TDataTypeId;
var idx: Integer;
begin
  idx := GetEnumValue(TypeInfo(TDataTypeId), 'DataTypeId_'+str);
  if(idx <> -1)then Result := TDataTypeId(idx)
  else RaiseConversionError('Unknown typeID name: '+str);
end;

ie无需遍历所有枚举值并将其作为字符串进行比较,请改用GetEnumValue函数。

关于在此类循环中使用result的一般方法,以下是如何对函数进行编码:

Function GetType(const str: string): TDataTypeId;
var
typestr: string;
begin
 for result := Low(TDataTypeID) to High(TDataTypeID) do
 begin
  typestr:=GetEnumName(TypeInfo(TDataTypeId),Ord(result));
  typestr:=Copy(typestr, 12, length(typestr)-11);
  //Memo.Lines.Add(typestr+'\n');
  if (AnsiCompareStr(str, typestr)=0) then
     exit; // if found, returns result value
 end;
 result := DataTypeId_String; // returns STRING type by default
end;
这是唯一可以在循环范围之外使用循环变量的情况之一。生成的代码是正确的,并且经过优化


我认为您最好定义一个专用的TDataTypeId项,如DataTypeId\u Unknown,或者在找不到时引发异常。

关于在此类循环中使用result的一般方法,下面是如何对函数进行编码:

Function GetType(const str: string): TDataTypeId;
var
typestr: string;
begin
 for result := Low(TDataTypeID) to High(TDataTypeID) do
 begin
  typestr:=GetEnumName(TypeInfo(TDataTypeId),Ord(result));
  typestr:=Copy(typestr, 12, length(typestr)-11);
  //Memo.Lines.Add(typestr+'\n');
  if (AnsiCompareStr(str, typestr)=0) then
     exit; // if found, returns result value
 end;
 result := DataTypeId_String; // returns STRING type by default
end;
这是唯一可以在循环范围之外使用循环变量的情况之一。生成的代码是正确的,并且经过优化


我认为您最好定义一个专用的TDataTypeId项,如DataTypeId\u Unknown,或者在未找到时引发异常。

关于在循环外使用循环变量,这里没有什么特别的。只要在循环结束后指定给循环变量,在读取之前就可以了。关键是循环正常终止后,循环变量立即处于定义错误的状态。@DavidHeffernan我不同意。结果变量在循环中用作循环迭代索引,如果通过exit关键字退出循环,则仍然按照预期定义结果变量。在普通循环中,当循环存在时,索引是未定义的,例如,可以是循环中最后一个值的+1,或者如果循环没有迭代,甚至是未定义的。编译器保证将定义一个结果变量,而如果在其进程中存在出口,则不保证循环值。我觉得这里有点特别。我对在循环中使用result的评论是,使用循环变量迭代器是安全的,而不是普通的非result变量。不是这样,而是相反。特殊结果变量在循环结束时与普通局部变量一样未定义。这就是为什么必须在循环完成后分配给它。当您跳出循环时,循环迭代器是定义良好的。只有当循环正常终止时,它才会变得未定义。这里没有什么特别的。关于在循环外使用循环变量,这里没有什么特别的。只要在循环结束后指定给循环变量,在读取之前就可以了。关键是循环正常终止后,循环变量立即处于定义错误的状态。@DavidHeffernan
我不同意。结果变量在循环中用作循环迭代索引,如果通过exit关键字退出循环,则仍然按照预期定义结果变量。在普通循环中,当循环存在时,索引是未定义的,例如,可以是循环中最后一个值的+1,或者如果循环没有迭代,甚至是未定义的。编译器保证将定义一个结果变量,而如果在其进程中存在出口,则不保证循环值。我觉得这里有点特别。我对在循环中使用result的评论是,使用循环变量迭代器是安全的,而不是普通的非result变量。不是这样,而是相反。特殊结果变量在循环结束时与普通局部变量一样未定义。这就是为什么必须在循环完成后分配给它。当您跳出循环时,循环迭代器是定义良好的。只有当循环正常终止时,它才会变得未定义。这里没什么特别的。