【问题标题】:Converting C code to Java [closed]将 C 代码转换为 Java [关闭]
【发布时间】:2016-02-27 00:24:54
【问题描述】:

有人可以向我解释一下下面的两段代码的作用,以及在 Java 中对应的代码是什么样的吗?

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

根据我对 C 的有限了解,我推测它正在声明一个指针 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;

}

【问题讨论】:

  • 不要使用** 突出显示代码行。
  • 我投票结束这个问题,因为堆栈溢出不是翻译或“解释我的代码”服务。
  • 您不是在翻译算法或类似代码,您可以合理地尝试进行逐行分析。它是一整套代码——您应该尝试从高层次上弄清楚代码应该做什么,并在 Java 中从头开始实现它。你不会尝试让malloc 在 Java 中工作,因为没有这样的东西。
  • 我认为询问某些 $UNFAMILIAR_LANGUAGE 语句的作用是合法的。

标签: java c pointers


【解决方案1】:
double* ptr;
ptr = (double*)malloc(10*_R_CONST*sizeof(double)+2048);

这是在运行时动态分配数组的 C 方式,Java 等价物是

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

(请注意,Java 不需要 sizeof(double) 因素,因为它分配对象,而不是字节。出于同样的原因,2048 字节缓冲区缩小到 256 双倍。)

类似,方法声明

double GetRange(double* sln, int yardage)

会翻译成

double GetRange(double[] sln, int yardage)

您指出的其他几行只是访问这个双精度数组的元素。

*Solution = ptr;

您没有显示Solution 的声明,也没有询问它,但我猜Solutiondouble ** 并作为参数传递。对此没有直接的 Java 等效项(尽管可以模拟);它所做的是将分配的数组的地址存储到方法调用者提供的变量中。

【讨论】:

  • 非常感谢,这很有帮助。我没有太多的 C 经验,所以我对语法的理解有限。只是需要一些指针。哈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
相关资源
最近更新 更多