Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.09.2014, 18:16   #1
Animaria
Новичок
Джуниор
 
Регистрация: 21.08.2014
Сообщений: 1
По умолчанию Передача двумерного массива в функцию

Как я знаю, имя массива и указателя тождественны в С++. Из этого следует, что можно инициализировать указатель, а работать с ним, как с именем массива, добавив индекс (квадратный скобки) или смещение к имени массива и круглые скобки со звёздочкой... Но не в этом суть. Я пробовал ввести передачу в функцию двумерного массива (столбы и строки) - не вышло. Очевидно, что где-то вкралась ошибка.
Вот код:
Код cpp:
Код:
#include "stdafx.h"
#include <iostream>

using namespace std;

const int size1 = 3;
const int size2 = 4;
int arr[size1[size2 = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
* * 
void arr_fun (int arr[[size2, int size1);

void main ()
{
* * arr_fun (arr[[size2, size1);
* * system ("pause");
}
void arr_fun (int arr[[size2, size1)
{
* * for (int i=0; i<size1; i++)
* * {
* * * * for (int j=0; j<size2; j++)
* * * * {
* * cout<<"arr["<<i<<": "<<arr[i[j<<endl;
* * * * }
* * }
}
Хотя бы дайте общие понятия по логике передачи адреса двух- и более мерного массива в функцию, а дальше, я сам попробую написать =)
Animaria вне форума Ответить с цитированием
Старый 15.09.2014, 19:46   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Animaria Посмотреть сообщение
Как я знаю, имя массива и указателя тождественны в С++.
Вы ошибаетесь.
Это две принципиально различные категории типов.

Принципиальная разница особенно ощутима, учитывая что указатель не является массивом, и потому не знает ни про какие размерности.
А вот настоящий массив свою размерность знает.

http://rextester.com/VCODF12220


Код:
include <iomanip>
#include<iostream>
using namespace std;


void Out(const int value, const size_t width=2)
{
    cout << ::std::setfill('0') << ::std::setw(width) << value<<"  ";
}


template<size_t N, size_t M> void fillArray(int (&Arr)[N][M])  //<---- значения N и M будут выведены автоматически в зависимости от переданного массива
{
    size_t v=0;
	for (int i = 0; i < N; i++)
            for (int n = 0; n < M; n++)
	        Arr[i][n] = v, 
                ++v;
}


template<size_t N, size_t M> void showArr(const int  (&Arr)[N][M]) //<---- значения N и M будут выведены автоматически в зависимости от переданного массива
{
    for (int i = 0; i < N; i++)
    {    
        for (int n = 0; n < M; n++)
           Out(Arr[i][n]);

        cout<<'\n'; 
    }
}


//==================================
int main()
{
	setlocale(LC_ALL, "rus");

	int Array[3][4];

	fillArray(Array); 
	showArr(Array);

	return 0;
}

Последний раз редактировалось _Bers; 15.09.2014 в 20:05.
_Bers вне форума Ответить с цитированием
Старый 16.09.2014, 18:00   #3
marenko.lilia
Пользователь
 
Аватар для marenko.lilia
 
Регистрация: 25.12.2013
Сообщений: 91
По умолчанию

Посмотри эту тему http://programmersforum.ru/showthread.php?t=265128.
Тут то, что тебе нужно. Я как раз недавно задавалась этим вопросом и спрашивала на форуме
marenko.lilia вне форума Ответить с цитированием
Старый 16.09.2014, 18:40   #4
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

_Bers, твой пример идеально правильный но он не подходит для показа преподавателю, так как там template который не смогут объяснить для чего он предназначен.
coNsept вне форума Ответить с цитированием
Старый 16.09.2014, 19:45   #5
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

coNsept, я считаю, _Bers правильно делает. Надо сразу учиться применять на практике полезные конструкции. Вводить это в привычку. Заодно он и нас учит
8Observer8 вне форума Ответить с цитированием
Старый 17.09.2014, 01:50   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от coNsept Посмотреть сообщение
_Bers, твой пример идеально правильный но он не подходит для показа преподавателю, так как там template который не смогут объяснить для чего он предназначен.
Это трудности тех, кто не различает указатели и массивы, а так же не осилил ссылки.

Все прочие за 10 секунд смогут переписать код так, что бы в нем не фигурировал шаблон.
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача двумерного массива в функцию Negent Общие вопросы C/C++ 4 24.06.2014 00:46
Передача двумерного массива в функцию СИ orandzheviyman Общие вопросы C/C++ 3 07.05.2014 11:03
Передача двумерного массива в функцию bajaka Visual C++ 9 27.11.2011 16:17
Передача двумерного массива в функцию StudentPolitech Общие вопросы .NET 9 30.10.2010 22:20
Передача двумерного массива в функцию Megapixar Общие вопросы C/C++ 12 01.04.2010 16:04