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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.12.2012, 10:10   #1
Fanyuus
Форумчанин
 
Аватар для Fanyuus
 
Регистрация: 07.05.2011
Сообщений: 169
По умолчанию Динамический массив и указатель\ссылка

В задаче, мне нужно провести ряд каких-то операций над двумерным динамическим массивом.
Причём эти операции проводить в функции.

Вопрос: Как мне в функцию передать двумерный динамический массив так, чтобы на выходе у меня был этот двумерный массив с изменениями, которые произошли в функции?

Вообще, смысл программы такой:

"зашли в главную функцию
зашли в функцию
сделали динамический массив
прибавили к каждому элементу 5
вышли в главную функцию
распечатали массив"


Пожалуйста, помоги кодом
Fanyuus вне форума Ответить с цитированием
Старый 28.12.2012, 10:49   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Способ 1: сделать в качестве двумерного массива массив массивов одинаковой длины. Передавать указатель на массив и два его измерения:
Код:
 //Сейчас мы не собираемся менять никакие элементы массива
int FindMax(const int*const* array, size_t D1, size_t D2){
  if(D1==0 || D2==0) return 0; //Подумать, что делать, если массив пуст
  
  int ret = array[0][0]; //array[0] - первый массив, array[0][0] - первый элемент первого массива
  for(size_t i=0; i<D1; ++i)
    for(size_t j=0; j<D2; ++j)
      ret = max(ret, array[i][j]);
  return ret;
}

//...
size_t size1, size2;
int **a = new int*[size1] //создаём массив указателей
for(size_t i=0; i<size1; ++i) a[i] = new int[size2]; //создаём массивы

int m = FindMax(a, size1, size2);

//Не забываем освободить память
for(size_t i=0; i<size1; ++i) delete[] a[i]; //оператор delete[], обратите внимание
delete[] a; //удаление в порядке, обратном созданию.
Способ 2: честный "двумерный" массив. При переменных размерах, индекс придётся высчитывать вручную:
Код:
//Мы не собираемся менять элементы массива
int FindMax(const int* array, size_t D1, size_t D2){
  if(D1==0 || D2==0) return 0; //Подумать, что делать, если массив пуст
  
  int ret = array[0]; //array[0*D2+0] - первый элемент первой строки
  for(size_t i=0; i<D1; ++i)
    for(size_t j=0; j<D2; ++j)
      ret = max(ret, array[i*D2+j]);
  return ret;
}

//...
size_t size1, size2;
int *a = new int[size1*size2] //создаём массив объектов

int m = FindMax(a, size1, size2);

//Не забываем освободить память
delete[] a;

Последний раз редактировалось Abstraction; 28.12.2012 в 10:51.
Abstraction вне форума Ответить с цитированием
Старый 28.12.2012, 11:24   #3
Fanyuus
Форумчанин
 
Аватар для Fanyuus
 
Регистрация: 07.05.2011
Сообщений: 169
По умолчанию

*мне можно и попроще, квадратный массив и без удалений и "защиты от дураков"))))

Так, значит у меня это будет выглядеть так:

Код:
#include "stdafx.h"
#include <conio.h>
#include <iostream>
#include <ctime>
#include "windows.h"
using namespace std;


int FindMax(const int*const* array, t)
{
  int ret = array[0][0]; //array[0] - первый массив, array[0][0] - первый элемент первого массива
  for(i=0; i<t; ++i)
    for(j=0; j<t; ++j)
      ret = max(ret, array[i][j]);
  return ret;
}

int main ()
{
	int t,i,j,size;
setlocale(0,"");

cout << "Введите размер массива\n\n";
cin >> t;

?????????

	cin.get();
cin.get();
	return 0;
}
вот что делать дальше, я совсем не поняла))

то есть, мне надо сделать квадратный динамический массив, причём рандомно его заполнить, найти минимальный элемент, удалить строчку и столбец, и распечатать массив.

Мне только важно узнать: как передать функции создание динамического массива, получить значения массива, и уже дальше с ним в main издеваться)))

Последний раз редактировалось Fanyuus; 28.12.2012 в 11:27.
Fanyuus вне форума Ответить с цитированием
Старый 28.12.2012, 11:54   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
как передать функции создание динамического массива
В обоих вариантах a - созданный динамический массив, его создание можно вынести в функцию. Только вот делать это, как правило, не очень хорошая идея - потому что выделение памяти получается в одном месте, освобождение в другом: не забыть бы.

Как бы то ни было, если функция создаёт/заполняет массив, то она возвращает соответствующий указатель - Type** либо Type*, в зависимости от используемого варианта.

"Удалить столбец" - это странное действие. По сути, это означает "пересоздать массив", потому что элемент из середины массива выкинуть нельзя. Чуть больше на эту тему.
Abstraction вне форума Ответить с цитированием
Старый 28.12.2012, 12:02   #5
Fanyuus
Форумчанин
 
Аватар для Fanyuus
 
Регистрация: 07.05.2011
Сообщений: 169
По умолчанию

нет, весь прикол в том, что я удалять ничего не буду.
просто когда надо будет распечатать, если i=номеру столбца, не печатаем, и так же с j (по номеру строки)

Мне вот именно надо как массив создать, найти мин элемент.

Может быть мне в функции мин элемент искать?
тогда это упростит задачу, а вернуть мне надо будет 2 значения.

это как мне сделать?
Fanyuus вне форума Ответить с цитированием
Старый 28.12.2012, 12:10   #6
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
тогда это упростит задачу, а вернуть мне надо будет 2 значения.

это как мне сделать?
Как вернуть из функции два значения? Способ 1 - std :: pair:
Код:
std::pair<int,int> MyFunc(void){
  return std::pair<int,int>(3,17);
}

//...
std::pair<int,int> result = MyFunc();
assert(result.first()==3);
Способ 2 - выходные параметры:
Код:
void MyFunc(int* outArg1, int* outArg2){
  *outArg1=3;
  *outArg2=17;
}

//...
int a,b;
MyFunc(&a, &b);
assert(a==3);
Abstraction вне форума Ответить с цитированием
Старый 28.12.2012, 12:21   #7
Fanyuus
Форумчанин
 
Аватар для Fanyuus
 
Регистрация: 07.05.2011
Сообщений: 169
По умолчанию

нет-нет, допустим....


Код:
функция
{
здесь я узнала два новых числа, а и в
мне надо их вывести
}

функция main
{
функция;
а и в сюда вывести
}
вот я о чём))
Fanyuus вне форума Ответить с цитированием
Старый 28.12.2012, 12:35   #8
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

Вам же и написали как это сделать.
ICQ: 677936656 Gmail: ekEmbed@gmail.com
Ezhik Kihze вне форума Ответить с цитированием
Старый 28.12.2012, 12:35   #9
Fanyuus
Форумчанин
 
Аватар для Fanyuus
 
Регистрация: 07.05.2011
Сообщений: 169
По умолчанию

то етсь мне надо найти элемент массива, надо найти его номер строки и номер столбца.
я вот о чём)))
Fanyuus вне форума Ответить с цитированием
Старый 28.12.2012, 12:37   #10
Fanyuus
Форумчанин
 
Аватар для Fanyuus
 
Регистрация: 07.05.2011
Сообщений: 169
По умолчанию

а разве return a,b;

мне выведет 2 значения??
я не могу понять эти ссылки и указатели... но мне надо вывести либо эти а и в (номер строки и столбца) или вывести элемент массива (но с теми же номерами что а и в)
Fanyuus вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Указатель на массив структур t2skler Общие вопросы C/C++ 2 02.12.2011 12:50
Динамический массив - или всё таки не динамический? vedro-compota Общие вопросы C/C++ 30 10.12.2010 23:22
Указатель на массив указателей на массив char'ов... SrgGld Общие вопросы C/C++ 0 19.11.2010 23:35
указатель на массив Cpluser Общие вопросы C/C++ 6 23.09.2009 21:46
Ссылка на динамический диапазон данных NikolayGVB Microsoft Office Excel 2 13.01.2009 18:00