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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2014, 00:30   #1
Negent
Студент
Пользователь
 
Аватар для Negent
 
Регистрация: 11.06.2010
Сообщений: 39
Радость Передача двумерного массива в функцию

Как я знаю, имя массива и указателя тождественны в С++. Из этого следует, что можно инициализировать указатель, а работать с ним, как с именем массива, добавив индекс (квадратный скобки) или смещение к имени массива и круглые скобки со звёздочкой... Но не в этом суть. Я пробовал ввести передачу в функцию двумерного массива (столбы и строки) - не вышло. Очевидно, что где-то вкралась ошибка.
Вот код:
Код:
#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;
		}
	}
}
Хотя бы дайте общие понятия по логике передачи адреса двух- и более мерного массива в функцию, а дальше, я сам попробую написать =)
"...Попытайся ухватить звёзды с небес, чем переживай, что до них не дотянуться..."

Последний раз редактировалось Stilet; 23.06.2014 в 10:59.
Negent вне форума Ответить с цитированием
Старый 23.06.2014, 08:15   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Каков, по-вашему, тип второго аргумента функции arr_fun в ее дефиниции?
Что именно, по-вашему, вы передаете первым аргументом при вызове функции arr_fun?

Ref:
http://www.cplusplus.com/doc/tutorial/arrays/
waleri вне форума Ответить с цитированием
Старый 23.06.2014, 12:08   #3
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Negent Посмотреть сообщение
Как я знаю, имя массива и указателя тождественны в С++. Из этого следует, что можно инициализировать указатель, а работать с ним, как с именем массива, добавив индекс (квадратный скобки) или смещение к имени массива и круглые скобки со звёздочкой... Но не в этом суть.
На языке с++ указатель и массивы - не тождественны. Это принципиально различные типы данных, И не стоит их путать.

На практике, одно из главных отличий массива от указателя - массив "помнит" свою размерность.

Это свойство используют для автоматического вывода размера массива при передачи его в функцию по ссылке

http://rextester.com/JPE74082

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

template<typename T, size_t X, size_t Y> void arr_fun (const T (&arr)[Y][X])
{
    cout<<"array["<<Y<<"]["<<X<<"]:\n";
	for (size_t y=0; y<Y; ++y)
    {
		for (size_t x=0; x<X; ++x)
            cout<< (arr[y][x]<10? " ": "")<< arr[y][x]<<", ";
        cout<<endl;
    }
    
}

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

Мораль: если вы пишите на языке с++ (а не на pure C), то при работе с "живыми" объектами используйте ссылки, а не указатели.

Работать будет проще, безопасность будет выше, головняков всяких будет меньше.

Последний раз редактировалось _Bers; 23.06.2014 в 12:13.
_Bers вне форума Ответить с цитированием
Старый 23.06.2014, 18:47   #4
Negent
Студент
Пользователь
 
Аватар для Negent
 
Регистрация: 11.06.2010
Сообщений: 39
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
На языке с++ указатель и массивы - не тождественны. Это принципиально различные типы данных, И не стоит их путать.

На практике, одно из главных отличий массива от указателя - массив "помнит" свою размерность.

Это свойство используют для автоматического вывода размера массива при передачи его в функцию по ссылке

http://rextester.com/JPE74082

Код:
template<typename T, size_t X, size_t Y> void arr_fun (const T (&arr)[Y][X])
Работать будет проще, безопасность будет выше, головняков всяких будет меньше.
Спасибо. Сейчас буду читать про шаблоны (template - шаблон ведь?).

Как ни крутился, всё равно без глобальных переменных обойтись не удалось:
Код:
#include "stdafx.h"
#include <iostream>

using namespace std;

const int size2 = 4;

void show_arr (int arr[][size2], int);

void main ()
{
	static const int size1 = 3;
	int arr[size1][size2] = {{1,2,3,4},{4,5,6,7},{7,8,9,0}};
	show_arr (arr, size1);
	system ("pause");
}
void show_arr (int arr[][size2], int size1)
{
	for (int i=0; i<size1; i++)
	{
		for (int j=0; j<size2; j++)
		{
			cout<<"Array["<<i+1<<"]: "<<arr[i][j]<<endl;
		}
	}
}
"...Попытайся ухватить звёзды с небес, чем переживай, что до них не дотянуться..."
Negent вне форума Ответить с цитированием
Старый 24.06.2014, 00:46   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

На языке си можно сделать менее безопасно, но просто:

http://rextester.com/RYSJR86326

Код:
#include <iostream>

using namespace std;

void show_arr (const int* arr, const size_t x, const size_t y);

int main ()
{
	const int arr[][4] = {{1,2,3,4},{4,5,6,7},{7,8,9,0}};
    
    const size_t y = sizeof(arr)/sizeof(arr[0]);
    const size_t x = sizeof(arr[0])/sizeof(arr[0][0]);
    show_arr ( reinterpret_cast<const int*>(arr), x,y);
}

void show_arr(const int* arr, const size_t xx, const size_t yy)
{
    cout<<"const int arr["<<yy<<"]["<<xx<<"] = {";
	for (size_t y=0; y<yy; ++y)
    {
        cout<< "{ ";
		for (size_t x=0; x<xx; ++x)
            cout << arr[y*xx+x] << (x+1==xx? "":",");
        cout<< "}"<< (y+1==yy? "":",");
    }
    cout<< "};\n";
}
_Bers вне форума Ответить с цитированием
Ответ


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



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