2016-12-16 3 views
1

Я использую: Windows 10, C++, Visual Studio 2013.C++ макрос с 2D массива

Я ищу способ получить доступ к моей 2D-массив с отрицательными числами, например, я знаю, что это работает 1D-массив-:

int myarray[35]; 

#define a (myarray + 50) 

a[-45] = 0; //accesses myarray[5] 

, но не могу понять, как заставить его работать с 2D-массив:

int foo[32][32] 

#define bar (foo + 50)(foo + 50) 

// The above does not work 
+0

Это не делает тонну смысла. Даже с вашим 1D-массивом, если вы получаете доступ к 'a [-5]', вы выполнили запрос за пределами границ. –

+0

Зачем нужно -45 дать вам товар 5? Это не имеет никакого смысла. – Lundin

+1

Из-за определения в строке выше .. он работает .. –

ответ

1

Вы можете использовать тот же подход с 2D массивов, как define s может иметь аргументы:

int a[100][100]; 
#define b(x,y) a[x + 50][y + 50] 

a[0][0] = 123; 
cout << b(-50, -50) << endl; // prints 123 

лично я не хотел бы, используя этот метод define управляемом обществом, так как это ограничивает операции, которые вы могли бы выполнять в массиве (например, вы не можете писать b(1) означает одну конкретную строку a[51] или должны определить другой макрос для него).

Для улучшения читаемости и ремонтопригодность, рассмотрим написание свой собственный класс, основанный на std::vector:

template<typename T> 
class ShiftedVector { 
private: 
    int shift; 
    std::vector<T> storage; 
public: 
    T& operator[] (int idx) { 
     return storage[idx + shift]; 
    } 
    // Definitions of other useful operations 
} 

ShiftedVector<ShiftedVector<int>> x; // Usage 
Смежные вопросы