Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача массивов в функции и процедуры, двумерные массивы 
V
    Опции темы
Mpak
Дата 21.12.2006, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 12.11.2006

Репутация: нет
Всего: 7



Например Векторы мы передаем
Код

  read_data(b);


в описании пишется

Код

read_data(float b[])
{
/*сценарий*/
}


А как с двумерными???

Это сообщение отредактировал(а) Mpak - 21.12.2006, 13:31


--------------------
В любой откомпилированной программе есть, по крайней мере, одна ошибка...
P.S. А у меня их минимум две...
PM MAIL ICQ   Вверх
albertn
Дата 21.12.2006, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: нет
Всего: 34



По-моему так:
Код

read_data(float b[][10])
{
/*сценарий*/
}

PM WWW ICQ   Вверх
TaNK
Дата 21.12.2006, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 669
Регистрация: 29.10.2006
Где: Краснодар

Репутация: нет
Всего: 1



Цитата(Mpak @ 21.12.2006,  13:30)
Например Векторы мы передаем
Код

  read_data(b);


в описании пишется

Код

read_data(float b[])
{
/*сценарий*/
}


А как с двумерными???

Код

int matr(int n, int m ,int **uc); // Прототип

===
int **pi,y;
pi = new int *[nn];
       for (i=0; i<nn; i++)
       pi[i] = new int [mm];
       y=matr(nn,mm,pi);// вот тут и передаем 



--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
Mpak
Дата 21.12.2006, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 12.11.2006

Репутация: нет
Всего: 7



alberth, почему именно [10]?

Добавлено @ 13:53 
TaNK, что значит ** и uc


--------------------
В любой откомпилированной программе есть, по крайней мере, одна ошибка...
P.S. А у меня их минимум две...
PM MAIL ICQ   Вверх
TaNK
Дата 21.12.2006, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 669
Регистрация: 29.10.2006
Где: Краснодар

Репутация: нет
Всего: 1



Цитата(Mpak @ 21.12.2006,  13:48)
alberth, почему именно [10]?

Добавлено @ 13:53 
TaNK, что значит ** и uc

** - указатель на указатель массивов
uc - название ее..если хочешь могу код полность привести, чтоб понятно было?

Добавлено @ 14:15 
только это для матрицы пример, подойдет он тебе?


--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
Mpak
Дата 21.12.2006, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 12.11.2006

Репутация: нет
Всего: 7



TaNK, Приведи, надеюсь он сильно сложный smile


--------------------
В любой откомпилированной программе есть, по крайней мере, одна ошибка...
P.S. А у меня их минимум две...
PM MAIL ICQ   Вверх
albertn
Дата 21.12.2006, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: нет
Всего: 34



Цитата(Mpak @  21.12.2006,  13:48 Найти цитируемый пост)
alberth, почему именно [10]?

Все зависит от того, как ты представляешь b
Код

float b[n][m];
// ...
read_data(float b[][m]);

Код

float **b;
// ...
read_data(float **b);

PM WWW ICQ   Вверх
TaNK
Дата 21.12.2006, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 669
Регистрация: 29.10.2006
Где: Краснодар

Репутация: нет
Всего: 1



Цитата(Mpak @ 21.12.2006,  14:22)
TaNK, Приведи, надеюсь он сильно сложный smile

да нет...не очень он и трудный этот пример
Код

int matr(int n, int m ,int **uc); // Пототип

    void main()
     {
       int **pi,y;
       int nn,mm;

       cout << "Vvedite n = ";
       cin>>nn;
       cout << "Vvedite m = ";
       cin>>mm;
       int i,j;
       pi = new int *[nn];
       for (i=0; i<nn; i++)
       pi[i] = new int [mm];
       y=matr(nn,mm,pi);
       for (i=0; i<nn; i++)
         {
           cout << "Ctroka " << i+1 << ":";
           for(j=0; j<mm; j++)
           cout << "\t" << pi[i][j];
           cout << endl;
         }
        cout << "Min elemnt = " << y;
       for (i=0; i<nn; i++)
       delete pi[i];
       delete pi;
       getch();
     }

    int matr (int n, int m, int **uc)
      {
        int a = 0,i,j;

        for (i=0; i<n; i++)
           for (j=0; j<m; j++)
         {
             cout << "Vvedite elmenti matr = ";
             cin >> uc[i][j];
              if (a>uc[i][j])
                        a = uc[i][j];

         }

        return a;
      }
//---------------------------------------------------------------------------



--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
jonie
Дата 22.12.2006, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



Цитата

** - указатель на указатель массивов
хм.. а по мне так сдается просто указатель на указатель на элемент... а то что там массив дальше ... хех...
alberth всеж имхо прав, говоря о передаче именно массива. Скобки только левые крайнии могут не содержать размера. При этом sizeof(такое) вовсе вам не даст  размер массива.. даст размер указателя) Передается только он.

всеж синтаксически если говорить тогда так:
Код

//указатель на массив из int
int (*pointer2array)[ARRAY_SIZE] = new int[1][ARRAY_SIZE];
delete pointer2array;

//указатель на двумерный массив из int
int (*lp22Darray)[ARRAY_SIZE_Y][ARRAY_SIZE_X] = new int[1][ARRAY_SIZE_Y][ARRAY_SIZE_X];
delete lp22Darray;

и малоли что никто не пишет.. я вот недавно в реальном проекте такое увидел....долго думал)

как вариант можно использовать void* в параметрах ф-ции) на любителя...

Это сообщение отредактировал(а) jonie - 22.12.2006, 01:41


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
TaNK
Дата 22.12.2006, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 669
Регистрация: 29.10.2006
Где: Краснодар

Репутация: нет
Всего: 1



извините ерунду сморозил - 
int **uc - указатель на массив указателей! в примере выше


--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
jonie
Дата 22.12.2006, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



Цитата

int **uc - указатель на массив указателей! в примере выше
ну где там массив-то?) указатель на указатель я вижу только.
вот так это выглядит в памяти при разыменовании... 
Код

+-----------------+         +-----------------+         +---------------+
|  uc(тип int**)  |   --->  | *uc (тип int*)  |    ---> | **uc (тип int)|
+-----------------+         +-----------------+         +---------------+

массива там нет. Да, при доступе это выглядит как доступ к массиву (потому как раскрывается uc[i][j]  компилятором как *((*uc + i)+j) что через sizeof() распишется как *((*uc + i*sizeof(int*))+j*sizeof(int)) что в точности дает доступ к элементу), но имхо называть это массивом никак нельзя.. Указатель на указатель и не более.


Цитата

....указатель на массив указателей...

а это выглядит воообще как : int* (*name)[];

Это сообщение отредактировал(а) jonie - 22.12.2006, 11:49


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
TaNK
Дата 22.12.2006, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 669
Регистрация: 29.10.2006
Где: Краснодар

Репутация: нет
Всего: 1



Значит Хомоненко - тоже ерунду сморозил...это я кажется там посмотрел....


--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
Anikmar
Дата 22.12.2006, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата

ну где там массив-то?) указатель на указатель я вижу только.
вот так это выглядит в памяти при разыменовании... 


Немного поправлю.

Объявление вида
int *a;
int b[100];

Второе - однозначно массив, а первое указатель. Но:
a = new int[100];
Теперь a является массивом

Пу сути дела - имя массива с точки зрения типа С++ является указателем на тип массива. Поэтому говорить, что вижу указатель, но не вижу массива немножко односторонне.

К многомерным массивам это также относится.
Объявление вида
int a[2][3] является по сути указателем на массив указателей т.е. int*[2];
Это два указателя на массивы из трех элементов. А так как массив (имя массива) это и есть указатель - то значит два указателя на указатели.

Данное и реализуется приведенным выше примером работы с матрицами

PM MAIL ICQ   Вверх
jonie
Дата 22.12.2006, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



Цитата

Поэтому говорить, что вижу указатель, но не вижу массива немножко односторонне.
я имел в виду "синтаксически" как выглядит масссив и указатель...
Цитата

a = new int[100];
Теперь a является массивом

ф-ция в С не может возращать ф-ции или массивы....указатели на них может (ANSI ISO\IEC 14882-2003(E) вроде гдето там есть имеенно такое определение.... )...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
JackYF
Дата 22.12.2006, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Anikmar @  22.12.2006,  15:22 Найти цитируемый пост)
int a[2][3] является по сути указателем на массив указателей т.е. int*[2];
Это два указателя на массивы из трех элементов. А так как массив (имя массива) это и есть указатель - то значит два указателя на указатели.


Таки нет.

Эта штука создаст массив в стеке из 6 элементов. Никаких указателей на указатели.

Другое дело, что локально a[i][j] будет обрабатываться компилером нормально, но по-другому:
Что-то типа:

*(a + i*n + j);

где n - вторая размерность массива.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Xenon
Дата 22.12.2006, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Anikmar,  следует не забывать, что b - const int* 

Это сообщение отредактировал(а) Xenon - 22.12.2006, 16:43


--------------------
user posted image  
PM MAIL   Вверх
Anikmar
Дата 22.12.2006, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата

ф-ция в С не может возращать ф-ции или массивы....указатели на них может (ANSI ISO\IEC 14882-2003(E) вроде гдето там есть имеенно такое определение.... )... 


Естественно не может, но если попробовать так:
Код

struct a
{
  char b[100];
}

MyFun(a); - Структура передается по значению вместе с массивом;



Цитата(Xenon @  22.12.2006,  16:43 Найти цитируемый пост)
Anikmar,  следует не забывать, что b - const int*

Спору нет - естественно.


Цитата(JackYF @  22.12.2006,  16:14 Найти цитируемый пост)
Таки нет.

Эта штука создаст массив в стеке из 6 элементов. Никаких указателей на указатели.

Другое дело, что локально a[i][j] будет обрабатываться компилером нормально, но по-другому:
Что-то типа:

*(a + i*n + j);


В статическом варианте при попытке сделать так:
char **a;
char b[3][2];

a = b;

Компилятор выдаст ошибку о преобразовании типов и напишет примерно следующее
"Не могу преобразовать char*[2] в char**

У меня именно так выдал - из этого я сделал вывод, что статическое объявление компилятор также считает массивом указателей.


PM MAIL ICQ   Вверх
KelTron
Дата 22.12.2006, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: нет
Всего: 38



Цитата(Anikmar @  22.12.2006,  15:22 Найти цитируемый пост)

Пу сути дела - имя массива с точки зрения типа С++ является указателем на тип массива.

Если точнее то имя массива - указатель на его первый элемент
Цитата(Anikmar @  22.12.2006,  15:22 Найти цитируемый пост)

int a[2][3] является по сути указателем на массив указателей т.е. int*[2];

Скорее массивом указателей int *a[2], а указателем на массив указателей является a
(int** a)



--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
JackYF
Дата 22.12.2006, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Anikmar @  22.12.2006,  16:55 Найти цитируемый пост)
У меня именно так выдал - из этого я сделал вывод, что статическое объявление компилятор также считает массивом указателей.


У всех так выдает. Но это ситуации не меняет.

Читаем Страуструпа и Стандарт.

Компилер в этом случае трактует получившееся как массив указателей.
Но указателя на указатели там нет.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Anikmar
Дата 22.12.2006, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(JackYF @  22.12.2006,  17:09 Найти цитируемый пост)
Компилер в этом случае трактует получившееся как массив указателей.
Но указателя на указатели там нет.


Это уже к семантике русского языка.
Массив указателей или указатель на указатели...

В общем вы поняли  smile 


Цитата(KelTron @  22.12.2006,  17:06 Найти цитируемый пост)
Если точнее то имя массива - указатель на его первый элемент

Я имел в ввиду типы переменных.

объявление 
int a[5];

С точки зрения С++ типом переменной a является "Указатель на int"
А вот значение этого указателя указывает на первый элемент массива.
PM MAIL ICQ   Вверх
KelTron
Дата 22.12.2006, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: нет
Всего: 38



Anikmar, так тоже верно  smile 


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
JackYF
Дата 22.12.2006, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Anikmar @  22.12.2006,  17:20 Найти цитируемый пост)
Это уже к семантике русского языка.
Массив указателей или указатель на указатели...


Нет, не к семантике русского языка.

Цитата(Anikmar @  22.12.2006,  17:20 Найти цитируемый пост)
С точки зрения С++ типом переменной a является "Указатель на int"

Нет, не является. Читаем, опять-таки, Страуструпа.
a - не переменная даже, так как она не имеет типа.

При объявлении массива char a[3][2];
в памяти не выделяется ни байта ни под один указатель.


Это сообщение отредактировал(а) JackYF - 22.12.2006, 17:44


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
lasalexx
Дата 21.2.2007, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 19.7.2004
Где: Tbilisi

Репутация: нет
Всего: 1



вот уже несколько дней думаю как можно передать статистический масив функции. в конце концов сделал вот так:

Код

#include <stdio.h>
#include <conio.h>

void show(int (*a)[], int m, int n)
{
int i,j,x;
for (i=0; i<m; i++){
   for (j=0; j<n; j++){
      x=*(*(a+i)+j);
      printf ("%d ",x);
    }
   printf ("\n");
    }
}

main ()
{
int a[3][4]={{4,6,8,10}, {14,16,18,20}, {24,26,28,30}};

show(a,3,4);
getche();
}


но выдает ошибку:
Цитата

Size of the type 'int[]' is unknown or zero


а ведь когда делаю с одномерным масивом
Код

void show (int a[], int n);

всё нормально получается.
Так в чём разница?
И можно ли вообще сделать то что я хочу не используя динамическую память?
PM MAIL WWW ICQ MSN   Вверх
Daevaorn
Дата 22.2.2007, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Код

#include <stdio.h>
#include <conio.h>


typedef int MyArray[3][4];

void show(MyArray& a, int m, int n)
{
    int i,j,x;
    for (i=0; i<m; i++){
        for (j=0; j<n; j++){
            x=*(*(a+i)+j);
            printf ("%d ",x);
        }
        printf ("\n");
    }
}

int main ()
{
    
    MyArray a = { {4,6,8,10}, {14,16,18,20}, {24,26,28,30}};

    show(a,3,4);
    getche();
    return 0;
}


PM MAIL WWW   Вверх
lasalexx
Дата 22.2.2007, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 19.7.2004
Где: Tbilisi

Репутация: нет
Всего: 1



Цитата(Daevaorn @ 22.2.2007,  00:49)
Код

#include <stdio.h>
#include <conio.h>


typedef int MyArray[3][4];

void show(MyArray& a, int m, int n)
{
    int i,j,x;
    for (i=0; i<m; i++){
        for (j=0; j<n; j++){
            x=*(*(a+i)+j);
            printf ("%d ",x);
        }
        printf ("\n");
    }
}

int main ()
{
    
    MyArray a = { {4,6,8,10}, {14,16,18,20}, {24,26,28,30}};

    show(a,3,4);
    getche();
    return 0;
}


Но тут MyArray матрица 3х4, а я хочу что б функция работала на все размеры.
PM MAIL WWW ICQ MSN   Вверх
vinter
Дата 23.2.2007, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



JusTalionis, тогда используй двойной указатель(**) и динамическое выделение памяти


--------------------
Мой блог
PM MAIL WWW   Вверх
threef
Дата 23.2.2007, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: 9
Всего: 10



Нет необходимости использовать динамическое выделение памяти. А вот внутри функции придется "попотеть" - две квадратных скобки работать откажутся. 
Код


void f(float **p,int x1,int x2)
{
    //float r=p[1][2];// runtime
    float q=*((float*)p + 1*x2+2);//ok 
    cout<<q<<'\n';
}
main()
{
    float x[3][4]={{1,2,3,4},{11,12,13,14},{21,22,23,24}};
    f((float**)x,3,4);

    float y[5][6]={{11,12,13,14},{1,2,3,4},{21,22,23,24}};
    f((float**)y,5,6);

}



Добавлено @ 17:25 
или проще :


Код


#include <iostream.h>
void f(double *p,int x1,int x2)
{
    //double r=p[1][2];// runtime
    double q=*(p + 1*x2+2);//ok 
    cout<<q<<'\n';
}
main()
{
    double x[3][4]={{1,2,3,4},{11,12,13,14},{21,22,23,24}};
    f((double*)x,3,4);

    double y[5][6]={{11,12,13,14},{1,2,3,4},{21,22,23,24}};
    f((double*)y,5,6);

}


Это сообщение отредактировал(а) threef - 23.2.2007, 17:23
PM MAIL   Вверх
Daevaorn
Дата 23.2.2007, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(lasalexx @  22.2.2007,  10:49 Найти цитируемый пост)
Но тут MyArray матрица 3х4, а я хочу что б функция работала на все размеры. 

Ну если С-style не принципиален, то:
Код

#include <stdio.h>
#include <conio.h>

template< typename ArrayT >
void show(ArrayT& a, int m, int n)
{
    int i,j,x;
    for (i=0; i<m; i++){
        for (j=0; j<n; j++){
            x=*(*(a+i)+j);
            printf ("%d ",x);
        }
        printf ("\n");
    }
}

int main ()
{
    
    int a[][] = { {4,6,8,10}, {14,16,18,20}, {24,26,28,30}};

    show(a,3,4);
    getche();
    return 0;
}


Это сообщение отредактировал(а) Daevaorn - 23.2.2007, 17:31
PM MAIL WWW   Вверх
vinter
Дата 23.2.2007, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



]threef, это извращения, зачем так издеваться над своим (и чужим мозгом), когда проще выделить память динамически..


--------------------
Мой блог
PM MAIL WWW   Вверх
threef
Дата 23.2.2007, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: 9
Всего: 10



vinter,  извращения - это то, к чему ты не привык ? Так и пиши, "мне это не нравится". Остальное - тема для обсуждения, а не "извращения". Посчитай обращения к менеджеру кучи при динамическом выделении памяти так, как это предлагаешь ты. А не хочешь издеваться над мозгом - пользуй готовые коллекции.
PM MAIL   Вверх
ip127001
Дата 23.2.2007, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 24.11.2006
Где: Omsk

Репутация: -2
Всего: -1



зачем такой гимар с указателями...шаблоны самый удобный способ!

template<typename Type, const int size_i, const int j>
                                 void func(Type (&mas)[size_i][size_j]){}

int main()
{
    int mas[10][10];

      func(mas);
      return 0;
}

--------------------
aqua currit et debere currere ut currere solebat
PM MAIL   Вверх
JackYF
Дата 24.2.2007, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



ip127001, извини, не понял вообще твоей задумки...

Это на каждый размер массива будет свой экземпляр функции...

гм... вообще неожиданный вариант. Не знаю. Мне не очень нравится. Гораздо понятнее и "принятее"
все-таки передавать размеры в функцию и не мучится.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
ip127001
Дата 24.2.2007, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 24.11.2006
Где: Omsk

Репутация: -2
Всего: -1



в теме написанно, что нужно передать двумерный массив...что может быть проще этого?

а размеры передавать..так же для каждой размерности свою фукцию!
только если размерность ограниченна....скажем 3.
ток тогда можно типа этого написать
Код

template<tymename Mas> void func(Mas *array,int i=0,int j=0,int m=0)
{
// тут уже проверять какой массив 1,2,3 мерный.


}
int main()
{
    const int i=10,j=10,m=10;
    int mas[i][j][m];
    int mas1[i][j];
       
       func(mas,i,j,m);
       func(mas1,i,j);   
       return 0;
}

так? иль я что-то не понял?
--------------------
aqua currit et debere currere ut currere solebat
PM MAIL   Вверх
Daevaorn
Дата 24.2.2007, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(ip127001 @  24.2.2007,  18:35 Найти цитируемый пост)
так? иль я что-то не понял? 

а как с ним работать внутри функции?
PM MAIL WWW   Вверх
ip127001
Дата 24.2.2007, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 24.11.2006
Где: Omsk

Репутация: -2
Всего: -1



с чем?

если ты про этот пример...то так же как с обычным массивом...
Код

template<typename Type, const int size_i, const int j>
                                 void func(Type (&mas)[size_i][size_j]){
      cout<<mas[0][1];
//выводит 1234

}

int main()
{
    int mas[10][10];
//пример
      mas[0][1]=1234;         
      func(mas);
      return 0;
}

--------------------
aqua currit et debere currere ut currere solebat
PM MAIL   Вверх
Daevaorn
Дата 24.2.2007, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(ip127001 @  24.2.2007,  18:35 Найти цитируемый пост)
template<tymename Mas> void func(Mas *array,int i=0,int j=0,int m=0)

Цитата(ip127001 @  24.2.2007,  23:43 Найти цитируемый пост)
template<typename Type, const int size_i, const int j>
                                 void func(Type (&mas)[size_i][size_j]){

немного отличаетсяsmile
PM MAIL WWW   Вверх
ip127001
Дата 24.2.2007, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 24.11.2006
Где: Omsk

Репутация: -2
Всего: -1



то что разное это я знаю......при том чушь я какую-то написал 2 раз...пардон...нормально 2 мерный массив передавать указателю...стыдно, стыдно smile:
--------------------
aqua currit et debere currere ut currere solebat
PM MAIL   Вверх
tonjo
Дата 24.2.2007, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 20.7.2006

Репутация: нет
Всего: нет



Цитата(TaNK @  21.12.2006,  13:48 Найти цитируемый пост)
int matr(int n, int m ,int **uc); // Прототип
===
int **pi,y;
pi = new int *[nn];
       for (i=0; i<nn; i++)
       pi[i] = new int [mm];
       y=matr(nn,mm,pi);// вот тут и передаем 


При работе с двумерными массивами работаю именно так, но вот при создании таким способом нескольких массивов больших размеров [32][256]  типа int и double, программа вылетает с сообщением, что больше она не может создать ничего с помощью new (2-3 массива создает лекго!). Пишу на C++.NET
 Вопрос: кто-нибудь сталкивался с подобным? и ещё вопрос: можно ли ненужные уже массивы удалять из памяти? Использование delete вызывает ошибку памяти. Что делать?
PM MAIL   Вверх
Daevaorn
Дата 24.2.2007, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(tonjo @  25.2.2007,  00:39 Найти цитируемый пост)
При работе с двумерными массивами работаю именно так, но вот при создании таким способом нескольких массивов больших размеров [32][256]  типа int и double, программа вылетает с сообщением, что больше она не может создать ничего с помощью new 

значит где-то "не так" работаешь - портишь кучу. выходишь за пределы или что-то похожее...
Цитата(tonjo @  25.2.2007,  00:39 Найти цитируемый пост)
Использование delete вызывает ошибку памяти. 

по той же причине.
PM MAIL WWW   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1115 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.