Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > массив и ОЗУ


Автор: mahmed 20.12.2007, 14:21
int a[x][y][z][m]
обращается к элементу a[i][j][k][m] через указатель а и операцию разименования "*"
надо расположить массив а для х=2 у=2 z=2 m=3 в ОЗУ

на толкните на путь истинный, можно с исходниками)

Заранее спасибо)

Автор: Lazin 20.12.2007, 14:56
у тебя массив должен быть одномерным, а индекс в нем вычисляться на основе индексов [x][y][z][m], и размерности массива по каждому из индексов.
Для 2х мерного массива 100 * 100 элементов 

Код

int A[10000];
int Height = 100, Width = 100;

int x = 4, y = 20;
//обращение к элементу массива с индексами x, y.
A[y*Width + x] = 0;

Автор: MAKCim 20.12.2007, 15:11
общее количество памяти для описания массива равно
(x + x * y + x * y * z) * sizeof(void*) + x * y * z * m * sizeof(int)
далее для инициализации пишем функцию
Код

int **** init(void * raw, int x, int y, int z, int m) {
    char * array = raw;
    char * ptr;
    int size = x + x * y + x * y *z;
    int index, __x = x, __y = y, __z = z, __m = m, scale, __xf = 0, __yf = 0, __zf = 0, __mf = 0;
    for (index = 0; index < size; ++index) {
        if (x--)
            scale = __x * sizeof(void*);
        else if (y--) {
            if (!__xf)
                __xf = 1;
            else
                scale = __y * sizeof(void*);
        }
        else if (z--) {
            if (!__yf)
                __yf = 1;
            else
                scale = __z * sizeof(void*);
        }
        else if (m--) {
            if (!__mf)
                __mf = 1;
            else
                scale = __m * sizeof(int);
        }
        ptr += scale;
        *((unsigned long*)array + index) = (unsigned long)ptr;
    }
    return raw;
}

Автор: mahmed 20.12.2007, 15:46
Код

(x + x * y + x * y * z) * sizeof(void*) + x * y * z * m * sizeof(int)

нескромный вопрос: как мы получили эту формулу? 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)