2016-02-27 139 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