2012-12-04 2 views
0

У меня есть задание создать очень быструю программу nqueens. Пока что алгоритм Bruteforce и Backtrack работают, но я нашел программу на C, которая, кажется, быстрее. Теперь я попытался преобразовать его из C в Java, однако я не могу преобразовать указатели, поскольку я не понимаю, что происходит с указателями. Эти строки, которые должны быть преобразованы:Преобразование C-указателя в Java

Edit: Я обновил преобразования к тому, что я понял:

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++.

С уважением, Деннис Фишер

+3

Вместо указателя, используйте 'int' индекс. – nhahtdh

+0

Я читал об этом, но я понятия не имею, что мне делать тогда :). Предположим, что pnStack имеет тип int: pnStack = aStack +1; Каков результат, который теперь сохраняется в pnStack? –

+1

Нет, вы хотите, чтобы nIndex = 1 соответствовал pnStack = aStack + 1, конечно. –

ответ

2

Внутри массива интерпретировать указатель так же, как вы бы использовать индекс внутри массива.

Значение * означает значение в текущем положении индекса.

Так

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

Вероятно, менее запутанно использовать nStack или что-то для индекса, учитывая, что это не указатель. –

+0

@NicholasWilson oh, правая сторона должна была быть Java, поэтому не стоит беспокоиться о указателях :-) – SJuan76

+0

Пока это хорошо. Однако приложение все еще не работает должным образом. Не могли бы вы объяснить, к чему приводит сравнение (преобразование 6)? –