2016-02-27 146 views
-6

有人可以向我解釋下面的兩段代碼是做什麼的,以及在Java中看起來像什麼?將C代碼轉換爲Java

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

我從我有限的ç,它的聲明指針PTR的知識推測,設置指針的大小?

這是電話的樣子後在同一個文件

ptr[10*n+2]=-RadtoMOA(atan(y/x)); 
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;     

還有另外一個類似的功能,再次我不熟悉C.這兩條線有星號是我行特別想知道。

double GetRange(double* sln, int yardage){ 
    **double size=sln[_R_CONST*10+1];** 
    if (yardage<size){ 
     **return sln[10*yardage];** 
    } 
    else return 0; 
} 

對於這個問題的第一部分,下面是完整的代碼,含。上面的摘錄。

double* ptr; 
    ptr = (double*)malloc(10*_R_CONST*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((Angle + ZAngle))); 
double Gx=GRAVITY*sin(DegtoRad((Angle + 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; 

    // Compute acceleration using the drag function retardation 
    dv = retard(DragFunction,DragCoefficient,v+headwind);  
    dvx = -(vx/v)*dv; 
    dvy = -(vy/v)*dv; 

    // Compute velocity, including the resolved gravity vectors.  
    vx=vx + dt*dvx + dt*Gx; 
    vy=vy + dt*dvy + dt*Gy; 



    if (x/3>=n){ 
     ptr[10*n+0]=x/3;       // Range in yds 
     ptr[10*n+1]=y*12;       // Path in inches 
     ptr[10*n+2]=-RadtoMOA(atan(y/x));   // Correction in MOA 
     ptr[10*n+3]=t+dt;       // Time in s 
     ptr[10*n+4]=Windage(crosswind,Vi,x,t+dt); // Windage in inches 
     ptr[10*n+5]=RadtoMOA(atan(ptr[10*n+4])); // Windage in MOA 
     ptr[10*n+6]=v;        // Velocity (combined) 
     ptr[10*n+7]=vx;       // Velocity (x) 
     ptr[10*n+8]=vy;       // Velocity (y) 
     ptr[10*n+9]=0;        // Reserved 
     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>=R_CONST+1) break; 
} 

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

*Solution = ptr; 

return n; 

}

+3

請勿使用'**'突出顯示代碼行。 – EOF

+2

由於堆棧溢出不是翻譯或「解釋我的代碼」服務,因此我正在投票結束此問題。 – Olaf

+0

您並未翻譯算法或類似的代碼,您可以合理地嘗試逐行分析。它是一個完整的代碼體系 - 你應該嘗試弄清楚代碼應該做什麼,在高層次上,並從頭開始在Java中實現它。因爲沒有這樣的事情,所以你不會試圖獲得Java中的'malloc'。 – PaulMcKenzie

回答

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

這是在運行時動態地分配的陣列的C-方式中,Java當量是

double[] ptr = new double[10*_R_CONST+256]; 

(請注意,爪哇不需要sizeof(double)因子,因爲它分配的是對象,而不是字節,出於同樣的原因,2048字節的緩衝區縮小到256倍。)

類似,方法聲明

double GetRange(double* sln, int yardage) 

將轉化

double GetRange(double[] sln, int yardage) 

您所指出的其它行僅僅是訪問這個數組雙打的元素。

*Solution = ptr; 

你沒有表現出Solution聲明,也不問這件事,但我的猜測是,Solutiondouble **並作爲參數傳遞。沒有直接的Java等價物(儘管它可以被模擬);它所做的就是將分配數組的地址存儲到方法調用者提供的變量中。

+0

非常感謝,這很有幫助。我沒有太多的C語言經驗,所以我對語法的理解是有限的。只需要一些指針。哈。 – Jreed