2015-05-13 3 views
1

Итак, я работаю над кодированием проблемы дискретного разбиения. Я храню мой объект называется polyomino как так:Как хранить симметрии Polyomino с помощью указателей на указатели?

pointer = new int*[h]; 
p_0 = new int*[h]; 
p_1 = new int*[h]; 
p_2 = new int*[w]; 
p_3 = new int*[w]; 
p_4 = new int*[w]; 
p_5 = new int*[h]; 
p_6 = new int*[w]; 

for (i=0 ; i < h ; i++) 
    pointer[i] = new int[w]; 
    p_0[i] = new int[w]; 
    p_1[i] = new int[w]; 
    p_5[i]=new int[w]; 

    } 
    for(i=0 ; i < w ; i++){ 
    p_2[i]=new int[h]; 
    p_3[i]=new int[h]; 
    p_4[i]=new int[h]; 
    p_6[i]=new int[h]; 
    } 

    for (i=0; i<h ; i++){ 
    for(j=0; j<w ; j++){ 
     cout << "What is the " << i+1; 
      cout << ", " << j+1; 
      cout << endl; 
      cin >> k; 
       if(k != 0) 
       pointer[i][j]=1;  
       else 
        pointer[i][j]=0; 

     } 


} 

Тогда я генерируя все 8 возможных ориентаций (group of symmetries площади) и хранить их в 7 других двойных указателей. Мне было интересно, есть ли способ сделать массив размером 8, который содержит адрес для каждого из моих двойных указателей.

Если бы я мог это сделать, это облегчило бы мою жизнь, когда мы проверили бы, чтобы доска была разбита на пустые места, а затем поместила их. Я хотел бы что-то вроде:

  orientation[8]; 
     orientation[0]=pointer; 
     orientation[1]=p_0; 
     orientation[2]=p_1; 
     orientation[3]=p_2; 
     orientation[4]=p_3; 

и так далее. Проблема в том, что существуют два разных размера; один из которых hxw, а другой - wxh. Мое первое, хотя я должен был сделать что-то вроде:

 int** orientation; 
    orientation = new int*[8] 

    for(i=0;i<8<;i++) 
     orientation[i]=new int*[h*w]; 

Спасибо за кучу заранее.

+0

Я по существу хочу сделать все мои ориентации прямо смежными друг с другом в памяти. – mikeysaxton

+1

Я не понимаю, что вы сейчас делаете, и что облегчит вашу жизнь. Может быть, напишите больше кода или перефразируйте вопрос? – cnicutar

+0

Я имею в виду указатели на указатели. Я хочу иметь удобный способ доступа к восьми восьмимерным матрицам (где я уже сгенерирован и сохранен в памяти. Я не включил эту часть кода, если понадобится). Проблема, с которой я сталкиваюсь, состоит в том, что мои 4 из моих матриц hxw и 4 wxh. Мне нравится примерно Ориентация: [8] – mikeysaxton

ответ

-3

можно просто объявить массив указателей двойной с размером 8, как этот

двойной * Arrptr [8];

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

double *arrptr[8]; 
for (int i=1;i<=8;i++) 
{ 
    /*generate values getting them from the user or 
    you can generate them with your method*/ 

    cout << "Enter orientations/n"; 
    cin >> arrptr[i]; 


} 
+3

Массивы индексируются нулями в C и C++. Это может привести к переполнению и, вероятно, segfault. –

+0

Спасибо за ваш вклад, даже если ваши индексы отключены в цикле for. Я не думаю, что этот метод будет работать в моем случае. – mikeysaxton

0

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

int arr[] = { 0, 1, 2, 3, 4, 5 }; 
int* a = &arr[0]; // Address of the beginning of the array (i.e index 0) 
int* b = a + 3; // Address of index 3, behind the scene it does a + (3 * sizeof(int)) 

cout << "index 0 : " << *a << endl; 
cout << "index 3 : " << *b << endl << endl; 

int d = 0, e = 1, f = 2; 
int* arr2[] = { &d, &e, &f }; // Array of pointers 
int** address = &arr2[1];  // Pointer to a pointer 
int*** address_of_handle = &address; // Address of that pointer 
cout << "index 1 : " << ***address_of_handle; 

Но кроме знакомясь с указателями Интересно, почему ты хочешь это сделать?

+0

Я хотел бы сделать это для простых «бухгалтерских» причин. Я чувствую, что может быть удобно иметь все мои матрицы, сгруппированные вместе. В конце концов, это может быть бесполезно. Однако, спасибо за ответ! Это помогло кучу – mikeysaxton

0

имейте это в виду, но он ошибается, вы можете запустить свой массив в 0 или 1 до тех пор, пока вы остановите свой массив в точном положении, если попытаетесь достичь памяти за пределами массива, у вас возникнет проблема переполнения alex, вы должны прочитать немного больше C/C++

 Смежные вопросы

  • Нет связанных вопросов^_^