Модераторы: 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   Вверх
Страницы: (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.0677 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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