Как на сях по хорошему объявить динамический двумерный массив?

Тема в разделе "WASM.BEGINNERS", создана пользователем dyn, 26 авг 2010.

  1. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    САБЖ
     
  2. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    все зависит от сокрального смысла "по хорошему"
     
  3. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    Например чтобы к нему можно было обращаться вот так:
    SomeArray[x][y] = 0;
    а не вот так
    pSomeArray[x + (y*line_size)] = 0;


    Я обсясню почему.
    Исходник не мой, кода очень много.
    В изначальном варианте размер буффера был вполне приемлимым. А сейчас он около 20 мб, что уже не влезает в стек. Сделать глобальным я его тоже не могу по ряду причин.


    Сейчас склоняюсь к такому финту ушами:
    p = VirtualAlloc(0, BufferSize, MEM_COMIT, PAGE_READWRITE)
    _asm mov esp, [p]
    _asm add esp, BufferSize-4
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Код (Text):
    1. int x = 0, y = 0;
    2. char **p = (char**)malloc(10);
    3. int i=0;
    4. for (i=0; i<10; i++)
    5. {
    6.     p[i] = (char*)malloc(10);
    7. }
    8.  
    9. p[5][5] = 0;
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Или если нужен сплошняковый массив.
    Код (Text):
    1. #define LINE_LEN 10
    2. #define ARRAY_SIZE 100
    3. char (*p)[LINE_LEN] = (char(*)[LINE_LEN])malloc(LINE_LEN*ARRAY_SIZE);
    4. int i=0;
    5. for (i=0; i<ARRAY_SIZE; i++)
    6. {
    7.     int y=0;
    8.     for (y=0; y<LINE_LEN; y++)
    9.     {
    10.         p[i][y] = 0;
    11.     }
    12. }
     
  6. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    #4 *(*(base + i) + j)
    #5 *(base + i * col + j)
    в #5 со сплошным массивом только один доступ к памяти
    зато #4 намного гибче в плане использования памяти
     
  7. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    есть еще способ
    Код (Text):
    1. size_t x = 0, i = 2, j = 2;
    2. char **base = malloc(i * j + sizeof(char*) * i), **tmp = base;
    3. while (x < i)
    4.     *tmp++ = (char*)base + sizeof(char*) * i + x++ * j;
    5. base[0][1] = 'f';
    6. base[1][0] = 'k';
    7. free(base);
    с ведущими указателями
    фактически получается *(*(base + i) + j) только
    и массив указателей и двумерный массив хранятся в одном сплошном массиве
    но это скорее экзотика а не способ
    помимо того что двойное обращение к памяти как #4 так еще и гибкости никакой как в #5