java类问题

时间:2011-11-03 12:04:31

标签: java c++

在这个论坛的一些非常好的人的帮助下,我已经能够将一些c ++翻译成java语言,但我不知道如何调用这个类。从根本上说,他们应该做的是返回“gen4风格”曲线。如果有人知道如何让这个运行,请告诉我!

/*
Derived from gen4 from the UCSD Carl package, described in F.R. Moore, 
"Elements of Computer Music."  It works like setline, but there's an
additional argument for each time,value pair (except the last).  This
arg determines the curvature of the segment, and is called "alpha" in
the comments to trans() below.                         -JGG, 12/2/01

http://www.music.columbia.edu/cmc/rtcmix/docs/docs.html    (maketable/gen4)



trans(a, alpha, b, n, output) makes a transition from <a> to <b> in
<n> steps, according to transition parameter <alpha>.  It stores the
resulting <n> values starting at location <output>.
alpha = 0 yields a straight line,
alpha < 0 yields an exponential transition, and 
alpha > 0 yields a logarithmic transition.
All of this in accord with the formula:
output[i] = a + (b - a) * (1 - exp(i * alpha / (n-1))) / (1 - exp(alpha))
for 0 <= i < n
*/





import java.lang.Math;
private static final int MAX_POINTS =1024;

public class gen{
    int size;              /* size of array to load up */
    int nargs;            /* number of arguments passed in p array */
    float []pvals;       /* address of array of p values */
    double []array;     /* address of array to be loaded up */
    int slot;          /* slot number, for fnscl test */
}

public static void  fnscl(gen g) {
}

static void trans(double a, double alpha, double b, int n, double[] output) {
    double delta = b - a;

    if (output.length <= 1) {
        output[0] = a;
        return;
    }
    double interval = 1.0 / (output.length - 1);
    if (alpha != 0) {
        double denom = 1 / (1 - Math.exp(alpha));
        for (int i = 0; i < output.length; i++)
            output[i] = a + (1 - Math.exp(i * alpha * interval)) * delta * denom;
    } else {
        for (int i = 0; i < output.length; i++)
            output[i] = a + i * delta * interval;
    }
}

public static double gen4(gen g) {

    int i;
    int points = 0;
    int seglen = 0;

    double factor;
    double time  [] = new double[MAX_POINTS];
    double value [] = new double[MAX_POINTS];
    double alpha [] = new double[MAX_POINTS];
    double ptr   []; 

    if (g.nargs < 5 || (g.nargs % 3) != 2) /* check number of args */
        System.out.println("gen4 usage: t1 v1 a1 ... tn vn");

    if ((g.nargs / 3) + 1 > MAX_POINTS)
        System.out.println("gen4 too many arguments");

    for (i = points = 0; i < g.nargs; points++) {
        time[points] = g.pvals[i++];

        if (points > 0 && time[points] < time[points - 1])
            System.out.println("gen4 non-increasing time values");

        value[points] = g.pvals[i++];
        if (i < g.nargs)
            alpha[points] = g.pvals[i++];
    }

    factor = (g.size - 1) / time[points - 1];

    for (i = 0; i < points; i++)
        time[i] *= factor;

    ptr = g.array;

    for (i = 0; i < points - 1; i++) {
        seglen = (int) (Math.floor(time[i + 1] + 0.5)
                - Math.floor(time[i] + 0.5) + 1);
        trans(value[i], alpha[i], value[i + 1], seglen, ptr);
        ptr[i] += seglen - 1;
    }

    fnscl(g);
    return 0.0;
}

4 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题并且您想要执行您的程序,则需要对代码进行一些调整。

你需要上课。要执行它,您需要一个特殊的主方法。

/** 
 *Derived from...
 */
import java.lang.Math;

class Gen4Func {
    class Gen {
        // insert from question
    }

    public static void main(String[] args) {
        // prepare parameters
        // ...

        // call your function
        trans( ... );

        // do more stuff
        // ...
    }

    public static void  fnscl(gen g) {
    }

    static void trans(double a, double alpha, double b, int n, double[] output) {
        // insert from above
    }
}

将此保存到Gen4Func.java(必须与类名匹配)。然后从via

执行
> java Gen4Func

正如我所说:如果我理解你的问题。

HTH,
麦克

答案 1 :(得分:0)

就范式而言,Java是一种完全面向对象的语言。 (而不是c ++也是程序性的),这就是为什么Kerrek SB说所有方法都必须在类中声明和定义。 他错的是文件只能包含一个公共类,并且必须与文件完全相同。但它也可以包含任意数量的具有任意名称的非公共类。

要运行该程序,您必须首先使用javac [filename] .java编译该文件,然后使用java [classname]运行它而不用!的.class

还有一件事。你不能声明这样的方法:

public void foo();

编译器会将其视为抽象方法并引发错误消息。

答案 2 :(得分:0)

对Gen.java进行庞大的复制,尝试在main()方法中设置带有测试值的Gen类字段。

/*
 * Derived from gen4 from the UCSD Carl package, described in F.R. Moore,
 * "Elements of Computer Music." It works like setline, but there's an additional
 * argument for each time,value pair (except the last). This arg determines the
 * curvature of the segment, and is called "alpha" in the comments to trans()
 * below. -JGG, 12/2/01
 *
 * http://www.music.columbia.edu/cmc/rtcmix/docs/docs.html (maketable/gen4)
 *
 *
 *
 * trans(a, alpha, b, n, output) makes a transition from <a> to <b> in <n>
 * steps, according to transition parameter <alpha>. It stores the resulting <n>
 * values starting at location <output>. alpha = 0 yields a straight line, alpha
 * < 0 yields an exponential transition, and alpha > 0 yields a logarithmic
 * transition. All of this in accord with the formula: output[i] = a + (b - a) *
 * (1 - exp(i * alpha / (n-1))) / (1 - exp(alpha)) for 0 <= i < n
 */
public class Gen {

    private static final int MAX_POINTS = 1024;
    int size;              //size of array to load up
    int nargs;            //number of arguments passed in p array
    float[] pvals;       //address of array of p values
    double[] array;     //address of array to be loaded up
    int slot;          //slot number, for fnscl test

    public static void main(String[] args) {
        Gen g = new Gen();
        //initialize Gen fields here..
        Gen.gen4(g);
    }

    public static void fnscl(Gen g) {
    }

    public static void trans(double a, double alpha, double b, int n, double[] output) {
        double delta = b - a;

        if (output.length <= 1) {
            output[0] = a;
            return;
        }
        double interval = 1.0 / (output.length - 1);
        if (alpha != 0) {
            double denom = 1 / (1 - Math.exp(alpha));
            for (int i = 0; i < output.length; i++) {
                output[i] = a + (1 - Math.exp(i * alpha * interval)) * delta * denom;
            }
        } else {
            for (int i = 0; i < output.length; i++) {
                output[i] = a + i * delta * interval;
            }
        }
    }

    public static double gen4(Gen g) {
        int i;
        int points = 0;
        int seglen = 0;

        double factor;
        double time[] = new double[MAX_POINTS];
        double value[] = new double[MAX_POINTS];
        double alpha[] = new double[MAX_POINTS];
        double ptr[];

        if (g.nargs < 5 || (g.nargs % 3) != 2) /*
         * check number of args
         */ {
            System.out.println("gen4 usage: t1 v1 a1 ... tn vn");
        }

        if ((g.nargs / 3) + 1 > MAX_POINTS) {
            System.out.println("gen4 too many arguments");
        }

        for (i = points = 0; i < g.nargs; points++) {
            time[points] = g.pvals[i++];

            if (points > 0 && time[points] < time[points - 1]) {
                System.out.println("gen4 non-increasing time values");
            }

            value[points] = g.pvals[i++];
            if (i < g.nargs) {
                alpha[points] = g.pvals[i++];
            }
        }

        factor = (g.size - 1) / time[points - 1];

        for (i = 0; i < points; i++) {
            time[i] *= factor;
        }

        ptr = g.array;

        for (i = 0; i < points - 1; i++) {
            seglen = (int) (Math.floor(time[i + 1] + 0.5)
                    - Math.floor(time[i] + 0.5) + 1);
            trans(value[i], alpha[i], value[i + 1], seglen, ptr);
            ptr[i] += seglen - 1;
        }

        fnscl(g);
        return 0.0;
    }
}

答案 3 :(得分:0)

在Java中,不允许使用独立方法。你应该让它们成为某些class的成员。在您的情况下,您的两种方法似乎使用class gen作为参数fnscl() amd gen4()。您可以将它们作为成员方法。另一个可以在static内保持class

public class gen{
  // data ...

  public void fnscl () { ... }  // member method
  public double gen4 () { ... }  // member method

  // static method
  public static void trans(double a, double alpha, double b, int n, double[] output) { ... }
}

main()也应该是某些class的一部分。我把这个选择留给你了。