java如何define_如何将对宏使用“ #define”的C代码转换为Java?

我正在将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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值