【问题标题】:C++ to Delphi pointer conversion [closed]C ++到Delphi指针转换[关闭]
【发布时间】:2016-11-13 11:46:50
【问题描述】:

我正在尝试将开源 C++ 项目转换为 Delphi(Berlin 10.1)。它使用了一些指针,我找不到将它们转换为 Delphi 指针的方法。我如何将这段代码从 C++ 翻译成 Delphi? 代码如下:

int SolveAll(int DragFunction, double DragCoefficient, double Vi, 
      double SightHeight, 
      double ShootingAngle, double ZAngle, double WindSpeed, double WindAngle, 
      double** Solution)
{    
    double* ptr;

    ptr = (double*)malloc(10*__BCOMP_MAXRANGE__*sizeof(double)+2048);

    double t=0;
    double dt=0.5/Vi;
    double v=0;
    double vx=0, vx1=0, vy=0, vy1=0;
    double dv=0, dvx=0, dvy=0;
    double x=0, y=0;

    double headwind=HeadWind(WindSpeed, WindAngle);
    double crosswind=CrossWind(WindSpeed, WindAngle);

    double Gy=GRAVITY*cos(DegtoRad((ShootingAngle + ZAngle)));
    double Gx=GRAVITY*sin(DegtoRad((ShootingAngle + ZAngle)));

    vx=Vi*cos(DegtoRad(ZAngle));
    vy=Vi*sin(DegtoRad(ZAngle));

    y=-SightHeight/12;

    int n=0;
    for (t=0;;t=t+dt){

        vx1=vx, vy1=vy; 
        v=pow(pow(vx,2)+pow(vy,2),0.5);
        dt=0.5/v;


        dv = retard(DragFunction,DragCoefficient,v+headwind);       
        dvx = -(vx/v)*dv;
        dvy = -(vy/v)*dv;


        vx=vx + dt*dvx + dt*Gx;
        vy=vy + dt*dvy + dt*Gy;



        if (x/3>=n){
            ptr[10*n+0]=x/3;                            
            ptr[10*n+1]=y*12;                           
            ptr[10*n+2]=-RadtoMOA(atan(y/x));           
            ptr[10*n+3]=t+dt;                           
            ptr[10*n+4]=Windage(crosswind,Vi,x,t+dt);   
            ptr[10*n+5]=RadtoMOA(atan(ptr[10*n+4]));    
            ptr[10*n+6]=v;                              
            ptr[10*n+7]=vx;                         
            ptr[10*n+8]=vy;                     
            ptr[10*n+9]=0;                              
            n++;    
        }   

        // Compute position based on average velocity.
        x=x+dt*(vx+vx1)/2;
        y=y+dt*(vy+vy1)/2;

        if (fabs(vy)>fabs(3*vx)) break;
        if (n>=__BCOMP_MAXRANGE__+1) break;
    }

    ptr[10*__BCOMP_MAXRANGE__+1]=(double)n;

    *Solution = ptr;

    return n;
}

【问题讨论】:

  • 可能有一个不涉及指针欺骗的解决方案。我们需要查看调用站点并了解您可以对界面进行哪些更改。
  • 我没有阅读所有的函数体,但我想你最好使用 Delphi 动态数组(TDoubleArray = array of Double; 无边界)。如果n 是数组的最终长度,您甚至可以返回该数组。如果不将数组传递为var

标签: c++ delphi pointers


【解决方案1】:
type
   TDoubleArray  = array[Word] of Double;
   PDoubleArray  = ^TDoubleArray;


ptr: PDoubleArray;

GetMem(ptr, 10*sizeof(double)+324);


ptr[10*n+1] := y*12;   

ptr[1] := n;

添加完整代码后编辑:

argument definition:  
    ... var Solution: PDoubleArray)
in this case usage:   
    Solution := ptr;

【讨论】:

  • 最后一部分写错了。这实际上只是一个 double* 类型的 var 参数。静态数组在这里有点蹩脚。 POINTERMATH ON 可以更好地完成工作。我个人对勺子喂养没有什么耐心。为什么我们不能站稳脚跟,提出适当的问题?所以我们可以帮助提问者学习。
  • "double** Solution" 应该像我理解的 2*2 数组?
  • 没有。在这种特殊情况下,double** 是指向线性数组的指针。因为你只展示了很少的代码,没有上下文,我不得不猜测,但我认为从我们拥有的代码中可以清楚地看到。
  • 谢谢。我在上面添加了完整的代码。
  • @David 最后一部分没有错(但丑陋)。没有信息表明解决方案是函数参数。
【解决方案2】:
type
 DoubleArray = Array[Word] of Double;
 PDoubleArray = ^DoubleArray;

const
 __BCOMP_MAXRANGE__ = 5; // for Example

var
 Ptr : ^DoubleArray;
 Solution : ^PDoubleArray;
 Y : Double;
 N : Integer;
begin
 Ptr := AllocMem(10*SizeOf(Double)+324); // Initialize with Zero
 // OR
 GetMem(Ptr, 10*SizeOf(Double)+324); // Without Initializing
 ...
 Ptr^[10*N+1] := Y*12;
 ...
 Ptr^[10*__BCOMP_MAXRANGE__ + 1] := N;
 ...
 Solution := @Ptr;

 ShowMessage(FloatToStr(Solution^^[1])); // Example for using 'Solution'
 ...

 // Free Memory using FreeMem(Ptr) at the End
end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-14
    • 2019-02-03
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多