2016-03-11 3 views
0

В моем коде, я часто использую формулу, которая возвращает меня индекс в 2D массива:Как заменить дублированные индексы вычисления формулы

cells[cellToMarkX + cellToMarkY * xSize] 
// ... 
if (cells[j + i * xSize] == 0) 
//... 
else if (cells[j + i * xSize] >= 5) 
//.. 
cells[cellToMarkX + cellToMarkY * xSize] += 4; 

я не уверен, если я вместо того, чтобы создать какую-то функцию, как

getCell(int x, int y) 

или должен ли это ненужно, и я должен предпочесть использовать макрос?

+0

Если вы используете формулу очень часто, функция не является ненужной. – user463035818

+0

DRY - прекрасный принцип. но в какой-то момент вы заходите слишком далеко. 'x = x + 2;'. «Ooops, теперь я дважды повторял« x »и нарушал DRY. Теперь мне нужно« add_two (x) », чтобы предотвратить повторение xs ... и теперь я повторил' d' в add, blah blah blah. –

+0

yes но если бы я использовал #define, чтобы определить эту простую формулу ячейки [x + y * xsize], было бы неуместно? – Mateusz

ответ

1

В частности, в примере, вы даете, вы можете рассмотреть предварительные вычисления, а также, как и в:

int myindex = j + i * xSize; 
if (cells[myindex] == 0) 
.... 
else if (cells[myindex] >= 5) 

, но ответить на ваш вопрос более непосредственно, вызов функции не неуместны здесь, особенно если вы объявляете его с атрибутом inline. Во многих случаях хороший оптимизирующий компилятор будет генерировать один и тот же код независимо от того, используете ли вы макрос или функцию, но это, конечно, зависит от реализации.

Лично я бы предпочел функцию.

+0

что-то вроде: inline getCell (int x, int y) {return cell [x + y * xsize];}? – Mateusz

+0

precomputing не будет работать, потому что я использую эту формулу во многих функциях в своей программе – Mateusz

+0

Да. 'inline int getCell (int x, int y) {return cell [x + y * xsize] ;} ' – Logicrat