2013-12-24 14 views
-1

У меня есть зазубренный 2D массив, строки не все равно длина:Моделирование 2D массива 1D

int sizes[100]; 
//init sizes 

unsigned char *p = [100]; 

for(unsigned int i = 0; i < 10; i++) 
{ 
    p[i] = (unsigned char*)malloc(sizeof(char)*sizes[i]); 
    for(unsigned int j = 0; j < sizes[i]; j++) 
     p[i] = j; 
} 

Я использую массив так:

p[x][y] 

Как я могу имитировать этот массив до 1D?

+0

в моем массиве не все имеют одинаковый размер – Blazer

+0

Если у вас есть «зубчатый массив» (разные длины), то не рекомендуется пытаться сделать его одним массивом D. Как вы его создали? – Floris

+0

У меня нет других вариантов, длины должны быть разными, что быстрее для этой работы, кроме 2-го массива? – Blazer

ответ

1

Я предполагаю, что если вы хотите получить доступ к вашему «2D-массиву» как одну D-матрицу, вы ожидаете, что при увеличении индекса на 1 вы получите доступ к следующему элементу массива (и автоматически перейдете к следующему когда вы сбегаете с края). Правильный способ сделать это - изменить способ выделения массива. Я попытаюсь показать, как это делается - это просто C, а не C++. Это, вероятно, более уместно, так как вы все равно использовали malloc. Я также думаю, что у вас есть довольно серьезные ошибки в коде, в том, что вы создаете char * указатель p, но ожидать, чтобы использовать его в

p[x][y]; 

, для которого потребуется char **, очевидно. Давайте попробуем сделать код, который будет делать то, что вы хотите:

int sizes[100]; 
//init sizes 

unsigned char *p[100]; // without the == sign we create an array of 100 pointers 
unsigned char *bigP; // the master pointer 

int totalLength = 0; 

int ii; 
for(ii=0; ii<100; ii++) totalLength += sizes[ii]; 

bigP = malloc(sizeof(char) * totalLength); 

int offset = 0; 

// make pointers p point to places along this big memory block: 
for(ii = 0; ii < 100; ii++) { 
    p[ii] = bigP + offset; 
    offset += sizes[ii]; 
} 

Теперь вы можете обратиться ваш массив с

p[x][y]; 

или

bigP[z]; 

где z может пойти от 0 до максимальное количество элементов. Конечно, в процессе, о котором вы не знаете (когда вы используете парадигму «1D») в какой строке/столбце массива jagged вы - вы не можете знать, что если вы действительно в одном измерении.

Ключ здесь в том, что память выделяется как единый непрерывный блок, а указатели p указывают на места в этом блоке. Это означает, что вы НЕ ДОЛЖНЫ БЕСПЛАТНО p. Вы должны только освобождать bigP.

Надеюсь, это имеет смысл.

+1

Большое спасибо за вашу помощь! И с Рождеством! – Blazer

1

Если вы ищете способ отображения двухмерного массива на одном пространстве, а затем попробовать ...

int sizes[width*height]; 
void setPoint(int x, int y, int val) { 
    sizes[x*width + y] = val; 
} 

частности x*width + y индексация даст вам соответствующий элемент в одномерный массив.

+0

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

+0

@Blazer - да, если вы где-то сохраняете измерение, то вы просто суммируете первые x-элементы вместо умножения. –

1

Если это домашняя работа, просто скачайте boost и используйте Boost.Matrix.

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