2016-11-13 239 views
-2

我想將開源C++項目轉換爲德爾福(柏林10.1)。它使用了一些指針,我找不到將它們轉換爲Delphi指針的方法。我如何將這段代碼從C++轉換爲Delphi? 下面是代碼:經過充分的代碼添加C++到德爾福指針轉換

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; 
} 
+1

有可能是不涉及指針掛羊頭賣狗肉的解決方案。我們需要看到呼叫站點,並知道您可以更改關於界面的內容。 –

+0

我沒有閱讀所有的函數體,但我想你最好使用一個Delphi動態數組('TDoubleArray = Double數組;'無邊界)。如果'n'是數組的最後一個長度,你甚至可以返回數組。如果不將該數組作爲'var'傳遞。 –

回答

0
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; 
+1

最後一部分是錯誤的。這實際上只是一個'double *'類型的var參數。靜態數組在這裏有些蹩腳。 POINTERMATH ON將工作做得更好。我個人對勺子餵食有一點耐心。爲什麼我們不能站在我們的立場上並要求適當的問題?所以我們可以幫助提問者學習。 –

+0

「雙**解決方案」應該像2 * 2陣列,據我所知? – khafan

+0

編號'double **'是指向線性數組的指針,在這種情況下。因爲你只顯示很少的代碼,沒有上下文,所以我不得不猜測,但是我認爲從我們的代碼中可以清楚地看到它。 –

0
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;