2013-04-23 3 views
3

У меня есть 3 2D-массива, которые я хотел передать функции. В настоящее время я использую оператор if-else, чтобы решить, какой массив будет отправлен, затем скопируйте содержимое выбранного массива и передайте новый массив.C++ Передайте различные массивы разных размеров той же функции

новый массив:

char board[100][100]={} 

эти массивы (содержание не отображается):

char mazeEasy[19][38], mazeMed[41][81], mazeHard[72][98]; 

Как я могу передать либо один из них 12:57 функции без использования board[100][100]?

+0

Простой ответ заключается в том, что вы не можете. Используйте std :: vector вместо 2D-массивов – john

+0

@evilruff Нет, что не работает. Кажется, многие люди не понимают 2D-массивы. – john

+0

@evilruff Извините за труд, но ни char *, ни char ** не работают. Дело в том, что 2D-массивы разных размеров выложены по-разному внутри. Вы не можете написать одну функцию для работы с 2D-массивами разного размера, если вы не используете шаблоны. – john

ответ

7

Возможность будет template функция:

template <typename T, std::size_t Dim1, std::size_t Dim2> 
void f(T(&)[Dim1][Dim2]) 
{ 
    std::cout << Dim1 << ", " << Dim2 << "\n"; 
} 

См демо на http://ideone.com/b60h1e. Обратите внимание, что это будет создавать три разных экземпляра шаблона функции (один экземпляр для каждой разной комбинации измерений).

Рекомендовать вместо этого заменить на std::vector<std::vector<char>>. Это позволяет избежать множества инстанциацию и функция может запросить std::vector для своего размера или итерацию:

void f(std::vector<std::vector<char>>& a_maze) 
{ 
    std::cout << a_maze.size() << ", " << a_maze[0].size() << "\n"; 
} 

Смотрите демо на http://ideone.com/nHL8Hj.

+0

Демонстрация помогает много. Все еще неясно на векторах, но использование кажется лучше. – hudadiaz

3

Не к же функции, но вы можете получить функцию на пару размеров с помощью шаблонов и относительно неизвестных «передать массив по ссылке, если вы хотите четкие размеры» метод:

template<size_t i, size_t j> 
void stuff(char (&arr)[i][j]) 
{ 
    for (size_t x = 0; x < i; x++) 
    { 
     for (size_t y = 0; y < j; y++) 
     { 
      std::cout << arr[x][y] << " "; 
     } 
     std::cout << std::endl; 
    } 
} 
1

/Переехали из комментариев/

Поправьте меня, если я ошибаюсь, но я считаю, что раскладка памяти 2D массива в C является частью стандарта, и вы ничего не можете, скорее,

An object of array type contains a contiguously allocated non-empty 
set of N sub-objects of type T. 
ожидать

То же применяется для 2D.

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

void dumpArray(int * array, int w, int h) 
{ 
    for (int i=0;i<h;i++) 
     for (int j=0;j<w;j++) 
     { 
      printf("[%i,%i] = %i\n", i,j,array[i*w+j]); 
     } 
} 

int main(int argc, char * argv[]) 
{ 
    int a[2][3] = { {1,2,3}, {4,5,6} }; 
    int a1[3][3] = { {1,2,3}, {4,5,6}, {7,8,9} }; 

    dumpArray((int*)a, 3, 2); 
    dumpArray((int*)a1, 3, 3); 
    return 0; 
} 
+0

Выполнение этого дает мне 'error: invalid types 'char [int]' для индекса массива' – hudadiaz

+0

, какая строка? вы скомпилировали мой код или создали свою собственную на основе моей идеи? – evilruff

+0

Ваш код работает нормально, но я не могу его реализовать в своем. Я сделал точно так же, как и выше, за исключением того, что мои массивы являются 'char', и у меня нет' int argc, char * argv [] '. Это причина? – hudadiaz

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