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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вопрос по передаче массива в функцию 
V
    Опции темы
Чoо
Дата 13.9.2010, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Читаю книжку Бондарева и возник вопрос.
Он пишет:
Цитата

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

Код

void f(const large &a, const large *b);



Массив транслятором воспринимается как указатель на первый элемент массива (получается не ссылка).  Что ж.. Передаю указатель, и по указателю меняю значения массива А:
Код

#include <iostream>
using namespace std;

void f(int *a)
{
    int *A=a;
  for (int i=9; i>=0; --i)
    {
      *(A++)=i;
  }
  return;
}

int main()
{
    int a[]={0,1,2,3,4,5,6,7,8,9};
    for (int i=0; i<10; ++i)
      cout << a[i];
    cout << endl;
    f(a);
    for (int i=0; i<10; ++i)
      cout << a[i];
    cout << endl;
    return 0;
}


Пробовал передать и ссылку на массив:
Код

#include <iostream>
using namespace std;

void f(int &a)
{
    int *A=&a;
  for (int i=9; i>=0; --i)
    {
      *(A++)=i;
  }
  return;
}

int main()
{
    int a[]={0,1,2,3,4,5,6,7,8,9};
    for (int i=0; i<10; ++i)
      cout << a[i];
    cout << endl;
    f(*a);
    for (int i=0; i<10; ++i)
      cout << a[i];
    cout << endl;
    return 0;
}

После выхода из функции значения элементов массива A поменялись. На вид - разницы ни какой.
Так как массив передавать правильно? smile


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
toxx
Дата 13.9.2010, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

void f(int a[])
{
  for (int i=9; i>=0; --i)
    {
      *(a++)=i;
  }
  return;
}
int main()
{
    int a[]={0,1,2,3,4,5,6,7,8,9};

    f(a);
    ....
}


можно так..
PM MAIL   Вверх
Crafty
Дата 13.9.2010, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Можно так передавать, если в массиве будет меньше или больше элементов, то будет ошибка.
Код

void f(int (&a)[10])
{
    int A=0;
  for (int i=9; i>=0; --i)
    {
      a[A++]=i;
  }
  return;
}

int main()
{
    int a[]={0,1,2,3,4,5,6,7,8,9};
    for (int i=0; i<10; ++i)
      cout << a[i];
    cout << endl;
    f(a);
    for (int i=0; i<10; ++i)
      cout << a[i];
    cout << endl;
    return 0;
}


А для чего работать с ссылкой, и брать указатель? как вы делаете во второй функции.

Это сообщение отредактировал(а) Crafty - 13.9.2010, 18:09
PM MAIL   Вверх
ИванМ
Дата 13.9.2010, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Чoо, там было написано const & а не просто &. Поэтому и поменялись. Вообще, если честно, для меня откровение передавать массив по ссылке. Я обычно передаю как const *. И то редко. Обычно массивами вообще не пользуюсь.
PM MAIL   Вверх
Чoо
Дата 13.9.2010, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



в принципе получается, что мои два варианта и предложенные ниже - практически одно и тоже (по времени и памяти)?

Цитата(ИванМ @  13.9.2010,  18:00 Найти цитируемый пост)
там было написано const & а не просто &

да.. Просто const мне не нужно было, т.к. меняю значения smile но тогда вопрос: будет ли отличаться const int &i от const int *i? (кроме как передачей параметров в функцию)


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
Crafty
Дата 13.9.2010, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Указатель нужно разыменовывать, а ссылку нет.
PM MAIL   Вверх
Чoо
Дата 13.9.2010, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Crafty @  13.9.2010,  17:59 Найти цитируемый пост)
А для чего работать с ссылкой, и брать указатель? как вы делаете во второй функции.

если передавать массив как f(a), то сборщик ругается:

Цитата

/home/oem/Developed/Cpp/study-build-desktop/../study/main.cpp:18: error: invalid initialization of non-const reference of type ‘int&’ from a temporary of type ‘int*’



Это сообщение отредактировал(а) Чoо - 13.9.2010, 18:44


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
Crafty
Дата 13.9.2010, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Чoо, посмотрите как я передаю массив по ссылке http://forum.vingrad.ru/index.php?showtopi...t&p=2211959

PM MAIL   Вверх
Чoо
Дата 13.9.2010, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Crafty, но такой способ не подойдет, если я буду передавать массив, размер которого определяется во время выполнения программы.
ну в принципе идея ясна. Всем спасибо, за помощь. Вопрос считаю решенным. 


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
Crafty
Дата 13.9.2010, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Чoо @  13.9.2010,  20:10 Найти цитируемый пост)
массив, размер которого определяется во время выполнения программы

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

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


Опытный
**


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

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



ну это естественно.. 
А я вообще рано начал разбираться с  массивами, оказывается дальше по книге написано про мой вопрос user posted image (читаю книгу последовательно, не забегая вперед, а зря, оказывается).
Объявление массива в функции:
Код

float f(float a[], int n); //n - количество элементов
...
float f(float *a, int n);
...
float f(float a[100500], int n); //компилятор игнорирует константу в квадратных скобках
...
float f(float *begin, float *end); //указатели на первый элемент массива и на последний.

ну и остаются способы, рассмотренные выше smile.


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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