Delphi到C ++的翻译问题

时间:2019-02-09 19:41:31

标签: delphi

我遇到了将Delphi代码转换为C ++的问题。 “ Max(...)<1 then”怎么办?

以下是Delphi代码:

if (Distance(CameraPosition, CellCenterPos)/(Size*2*C*
  Max([smallC*D2Matrix[X,Z], 1.0])))<1 then
begin

function Max(const Values : Array of Single): Single;
var
 I : Integer;
begin
 Result := 0;
  for I := Low(Values) to High(Values) do
   if (Values[I] > Result) then Result := Values[I]
end;

1 个答案:

答案 0 :(得分:4)

Delphi代码未执行Max(...) < 1Max()与其他计算一起放在括号内。该代码实际上正在执行(Distance(...) / (... * Max(...)) < 1

在C ++中,Delphi代码会转换为以下形式:

float Max(const float Values[], int NumValues)
{
    float Result = 0;
    for(int I = 0; I < NumValues; ++I) {
        if (Values[I] > Result)
            Result = Values[I];
    }
    return Result;
}

float arr[] = {smallC * D2Matrix[X,Z], 1.0};
if ((Distance(CameraPosition, CellCenterPos) / (Size * 2 * C * Max(arr, 2))) < 1)
{
    ...
}

或者:

template <size_t N>
float Max(const float (&Values)[N])
{
    float Result = 0;
    for(int I = 0; I < N; ++I) {
        if (Values[I] > Result)
            Result = Values[I];
    }
    return Result;
}

const float arr[] = {smallC * D2Matrix[X,Z], 1.0};
if ((Distance(CameraPosition, CellCenterPos) / (Size * 2 * C * Max(arr))) < 1)
{
    ...
}

或者:

#include <algorithm>

float arr[] = {smallC * D2Matrix[X,Z], 1.0};
if ((Distance(CameraPosition, CellCenterPos) / (Size * 2 * C * (*std::max_element(arr, arr+2)))) < 1)
{
    ...
}

或:(仅C ++ 11和更高版本):

#include <algorithm>

if ((Distance(CameraPosition, CellCenterPos) / (Size * 2 * C * std::max({smallC * D2Matrix[X,Z], 1.0}))) < 1)
{
    ...
}