【问题标题】:Converting C pointer to Java将 C 指针转换为 Java
【发布时间】:2012-12-04 10:36:08
【问题描述】:

我的任务是创建一个非常快速的 nqueens 程序。到目前为止,Bruteforce 算法和 Backtrack 都在工作,但我发现了一个似乎更快的 C 程序。现在我尝试将它从 C 转换为 Java,但是我无法转换指针,因为我不了解指针发生了什么。 这些是必须转换的行:

编辑:我已将转换更新为我所理解的:

final int[] aStack = new int[MAX_BOARDSIZE * 2];
int bitfield; //That's what I've got so far


//Conversion 1:
register int* pnStack;       -> int pnStack;

//Conversion 2:
pnStack = aStack + 1;        -> pnStack = 1;

//Conversion 3:
pnStack = aStack + 1;        -> pnStack = 1;
*pnStack++ = 0;              -> aStack[pnStack++] = 0;

//Conversion 4:
bitfield = *--pnStack;       -> bitfield = aStack[--pnStack];

//Conversion 5:
*pnStack++ = bitfield;       -> aStack[pnStack++] = bitfield;

//Conversion 7:
pnStack == aStack            -> pnStack == aStack[0] ???????

一个解决方案会很好,但如果你能解释一下这里发生了什么,我会尝试自己找到它。指针是我从未真正学习过 c 和 c++ 的原因。

问候, 丹尼斯·费舍尔

【问题讨论】:

  • 使用int索引而不是指针。
  • 我已经读过这方面的内容,但我不知道我该怎么做:)。假设 pnStack 是 int 类型: pnStack = aStack +1;现在 pnStack 中保存的结果是什么?
  • 不,你当然希望 nIndex = 1 对应于 pnStack = aStack + 1。

标签: java c pointers n-queens


【解决方案1】:

在数组中,解释指针就像在数组中使用索引一样。

* 表示索引当前位置的值。

所以

pnStack = aStack;  <-- int pnStack = 0;
pnStack++;         <-- pnStack++;
bitfield = *pnStack <-- bitfield = aStack[pnStack];
bitfield = *--pnStack <-- bitfield = aStack[--pnStack]; (first decrement index, then retrieve the value)

【讨论】:

  • 考虑到它不是指针,使用 nStack 或其他东西作为索引可能不太容易混淆。
  • @NicholasWilson 哦,右侧是 Java,所以不用担心指针 :-)
  • 目前看起来不错。但是,该应用程序仍未按预期工作。您能解释一下比较(转换 6)的结果吗?
  • 哪个转换6???如果是转换7,则类似于pnStack==0(指针在数组的开头。想想在C中,“数组变量”实际上是指向其开头的指针。
  • 是的,对不起,错误的号码,正在谈论转换 7。谢谢您的帮助。与其他一些解决方案相比,该应用程序正在运行并且速度非常快。 (n=15,~ 1.8 秒)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
  • 2012-11-21
  • 2021-01-08
  • 1970-01-01
相关资源
最近更新 更多