crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V  < 1 2  
Тема закрытаНачать новую тему
> Время жизни переменных, не понимаю одного момента
Andrew Selivanov
  опции профиля:
сообщение 4.2.2008, 11:37
Сообщение #11


Участник
**

Группа: Участник
Сообщений: 249
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 3

Спасибо сказали: 15 раз(а)




Репутация:   6  


Цитата(Tonal @ 4.2.2008, 11:16) *
А вот auto_ptr с массивом использовать не надо - убъёть! :)

Litkevich Yuriy Проще всего переделать код на использование vector<int>.
С ним твоя исходная функция будет выглядеть так:
vector<int> func (foo foovar)
{
  vector<int> foodim;
  ...
  return foodim;
}

А использовать её будешь так:
vector<int> pntr;
int  b;
pntr = func(foovar);
b=pntr[2];

Написано об этом очень хорошо у Страуструпа в самом начале "Язык программирования С++ 3ед." - книжка, которую каждый уважающий себя программист на С++ должен прочитать и понять. :)


Мммм... вариант, но мне кажется, что так будет несколько неудобно обрабатывать ошибку (т.е. нулевое значение при возврате), кроме того ( поправьте если ошибаюсь), из временного внутреннего вектора будет лишнее копирование. Мне кажется, корректней будет так:
int func(int foovar, std::vector<int>& data)
{
    if(shit_happens)
   {
      //неуспешное завершение
      return -1;
    }
    data.push_back(val1);
    data.push_back(val2);
    data.push_back(val3);
    //успешное завершение
    return 0;
}

//использование
std::vector<int> data;
int retval = func(3,data);
if(retval)
{
    //что то не так...
}


Ну и typedef не забыть если это конкретный тип, или сделать сразу шаблончик из функции :)

И еще вариант: можно вернуть итератор...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 5.2.2008, 8:37
Сообщение #12


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


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

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

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

Сообщение отредактировал Tonal - 5.2.2008, 8:37
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.2.2008, 10:58
Сообщение #13


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Tonal @ 5.2.2008, 11:37) *
видно что размерчик ему известен

Да известен, это буфер для работы с UART'ом, собственно, некоторые функции кладут в этот буфер в определенное место свои данные, потом буфер уезжает к внешнему девайсу, максимальный размер буфера в котором ЦЕЛЫХ 28 байт (для девайса это много).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 5.2.2008, 13:39
Сообщение #14


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(Tonal @ 4.2.2008, 11:16) *
А вот auto_ptr с массивом использовать не надо - убъёть! :)

Litkevich Yuriy Проще всего переделать код на использование vector<int>.
С ним твоя исходная функция будет выглядеть так:
vector<int> func (foo foovar)
{
  vector<int> foodim;
  ...
  return foodim;
}

А использовать её будешь так:
vector<int> pntr;
int  b;
pntr = func(foovar);
b=pntr[2];

Написано об этом очень хорошо у Страуструпа в самом начале "Язык программирования С++ 3ед." - книжка, которую каждый уважающий себя программист на С++ должен прочитать и понять. :)

Полностью согласен с данным автором. На мой взгляд, если и делать подобное, то, как указано выше. А вообще не советовал бы возвращать указатель на локальный массив. Лучше бы завести его глобально или через namespace.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V  < 1 2
Тема закрытаНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 17:28