我正在将C代码块转换为Java,遇到了一些我不太了解的语法。第一个使用#define创建函数。我个人以前没有见过#define创建函数。我还刚刚在这篇文章中发现这确实是macro。在下面,您将看到我试图用Java解释此代码的内容。
这是C代码:
#define mat_elem(a, y, x, n) (a + ((y) * (n) + (x)))
然后我将其转换为Java:
public double mat_elem(double a, int y, int x, int n){
return (a + ((y) * (n) + (x)));
}
现在真正的问题是,此代码块也使用#define。
C语言代码:
#define A(y, x) (*mat_elem(a, y, x, n))
我还没有转换成Java,因为我不太确定发生了什么。
我首先想到#define A(y, x)创建的数据类型等于(*mat_elem(a, y, x, n))返回的get。但是,他们在mat_elem前面使用的指针使我失望。
我正在考虑在Java中执行以下操作:
public double[] fillA(double y, double x){
double [] A = new double [100];
for(int i = 0; i < some_var; i++){
A[i] = mat_elem(a, y, x, n);
}
return A;
}
我敢肯定,这样的事情是可行的,但是我主要关心的是理解C代码的实际作用,并且如果我的不完善代码等同于C语言中的代码。
#define并未定义函数,而是每次使用时都会扩展的宏。 如果a是指向矩阵的指针,则它返回指向矩阵内部元素的指针。 在Java中,您可以将矩阵定义为双精度(double[][])的二维数组,并且(在正确初始化之后)您将不需要此mat_elem
嗯,好的,我不熟悉宏,但我会对其进行研究。 您能解释一下它在每次使用时如何扩展的含义吗? 您本质上是在说宏的行为类似于具有动态行为的指针吗?
否-宏(几乎)在代码中被文本替换。 如果代码说A(3, 4) = 5.0;,则首先将其替换为*mat_elem(a, 3, 4, n) = 5.0;,将其替换为*((a + ((3) * (n) + (4))) = 5.0;在Java中,只需说a[3][4] = 5.0;
mat_elem和A都是所谓的函数式宏。
宏是一种简单的文本替换。如果您定义一个宏
#define FOO a + b
然后,当代码通过预处理器运行时,源代码中的每个FOO实例都将替换为文本a + b。
类似函数的宏类似,除了可以传递参数以进行扩展之外。如果编写mat_elem(my_matrix, i, j, rows),则在对代码进行预处理时,它将替换为文本
(my_matrix + ((rows) * (i) + (j))
注意,宏参数不像函数参数那样求值-它们只是在适当位置扩展。 mat_elem(mat, i++, j+2, rows)将扩展为
(mat + ((rows) * (i++) + (j+2))
宏可以调用其他宏。 A(i, j)扩展为(*mat_elem(a, y, x, n)),其又扩展为
(*(a +((n) * (y) + (x)))
Java AFAIK中没有等效的工具-您将必须编写方法来完成同一件事。
感谢您提供这条信息。 是的,我认为我需要一种方法来完成此任务。 这是因为我需要将其转换为Java代码,然后才能编写Java Stream。
我不太喜欢该C代码,但是您可以使用已有的代码。
当您得到类似的东西时,将C转换为Java的最佳选择是注释掉header头并通过预处理器运行它并转换预处理的C代码。有关如何调用预处理器的信息,请参见以下答案:扩展#define之类的宏后,如何运行GCC预处理器以获取代码?
实际上,您只想执行一次,然后确定其作用,然后应用代码的逻辑含义而不是直接含义来智能地进行其余替换。
在此扩展为*(a + ((dia) * (n) + (dia))。 ((dia) * (n) + (dia)是整数,指针加整数是指针。因此,它将这个复杂的表达式通告给指针并取消引用。通常写为a [((dia)*(n)+(dia)]。
看起来像原始的C程序员试图构造一个二维数组,而第二维不是常数。数组的数组是惯用的,但是实际上在大多数处理器上这会更快。
好的,所以在运行它时,我看到在该行中使用A(x,y) max = (*(a + ((dia) * (n) + (dia))));如果要用Java编写,它将是这样的:max[i] = ((a + ((dia)* (n) + (dia)))我之所以问是因为在那里看到了指针:(*(a + ((dia) * (n) + (dia)))) 仍然让我感到困惑。
很有意思。 我仍然在努力寻找这个二维数组。 但是,我现在知道a被作为执行该宏时的指针,以及现在如何在C中使用预处理器。
只是想到了什么。 它是2D数组,因为a作为指针将填充在max[i]中吗? 因此,我在想什么,它看起来像这样:max[i] = *(a+((dia)*(n)+(dia))?
@frlzjosh:2D数组被分配为大小为maxx * maxy的单个D数组,并被索引为a[x + y * maxy],其中在宏中将maxy称为n。