2013-03-07 13 views
1

Я пытаюсь получить массив указателей на 2d массивы булевых. Как это можно достичь? Это для Arduino (думаю, что это сочетание C и C++?)C/C++ массив указателей на 2d массивы

+0

Вы хотите синтаксис объявления или что? –

+0

http://stackoverflow.com/questions/1768294/how-to-allocate-a-2d-array-of-pointers-in-c – noMAD

+0

Вы ищете массив или динамическое распределение (т. Е. «Массив» [подробнее или менее] определенного размера, известного только во время выполнения)? Это будет сделано иначе в 'C', чем в' C++' для динамического выделения. – RageD

ответ

0

Массив указателей на 2D-массивы булевых выглядит так (как на C, так и на C++ - выберите один, они не совпадают языка, ни смесь):

typedef bool TwoDBoolArr[10][10]; 
typedef TwoDBoolArr *TwoDBoolArrPtr; 
typedef TwoDBoolArrPtr TwoDBoolArrPtrArray[10]; 

Вам нужен последний typedef, конечно.

Если вы хотите меньше определений типов и снижение читаемости:

typedef bool (*TwoDBoolArrPtrArray[10])[10][10]; 
5

На основании вашего описания, я думаю, что вы ищете что-то вроде:

bool (*arr[K])[M][N]; 

Это ломает, как

 arr    -- arr 
     arr[K]    -- is a K-element array 
     *arr[K]    -- of pointers 
    (*arr[K])[M]   -- to M-element arrays 
    (*arr[K])[M][N]  -- of N-element arrays 
bool (*arr[K])[M][N]  -- of bool 
+0

можно объявить его без объявления M и N, т.е. если вы хотел иметь 2d массивы разных размеров? – holmeswatson

+0

№ Размер массива является частью типа; например, массив элементов 3x4 типа 'bool' является другим типом из массива элементов 4x5 из' bool', а указатель на один несовместим с указателем на другой. –

2

Если вы используете C++, и вы не хотите вводить размер из объявления, вы можете сделайте это, выделив его динамически.

int first_dim, second_dim; 
// determine dimensions somewhere inside code 

// create array of pointers to booleans 
bool** arr[10]; 
for(i = 0; i < 10; i++){ 
    arr[i] = new bool*[first_dim]; 
    for(j = 0; j < first_dim; j++){ 
     arr[i][j] = new bool[second_dim]; 
    } 
} 

Убедитесь, что вы delete все ваши массивы, когда вы сделали их использование.

ПРИМЕЧАНИЕ

Когда вы пытаетесь выделить 2d массивы, не думать о них как матрицы или таблицы, каждый из которых хранит логическое значение. Например, возьмите массив из int s, массив, объявленный как int arr[i][j], каждый элемент в первом «измерении» имеет тип int*, и каждый элемент во втором «измерении» имеет тип int. Так что это фактически «массив массивов», если хотите.

+0

(обратите внимание на OP, это будет менее эффективно, потому что 2-мерные массивы не будут смежными) –

+0

возможно, но как еще он это сделает, так как он не хочет знать, что 'first_dim' и' second_dim' будут известны от начала? (см. комментарии к ответу на @JohnBode выше) – naxchange

+0

он мог выделять каждый 'arr [n]' как 1-d массивы вместо 2-мерного массива и вручную индексировать 'arr [n] [second_dim * i + j]' (это то, что я сделал бы, если бы производительность имела значение) –

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