Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Функции не возвращают массивы. Обход?


Автор: GrAndrey 16.1.2004, 21:02
Функции в C++ не возвращают массивы.
Как можно наиболее оптимально и красиво добиться того-же эффекта?

Автор: Waters 16.1.2004, 21:42
Использовать STL.

wbr.

Автор: Jcs 16.1.2004, 21:54
Зачем, если не секрет, возвращать массив данных? Есть куча способов получить обработанный массив, например передать его адрес одним из параметров или, если он у тебя создается динамически, вернуть его адрес.

Автор: GrAndrey 17.1.2004, 10:20
Сейчас я передаю в функцию указатель на объект, полю которого и присваиваются результаты. Но мне это не вполне нравится.

Автор: NiJazz 17.1.2004, 11:14
Можно массив использовать как глобальный, а функцией его только изменять.

Автор: maxim1000 17.1.2004, 11:52
Цитата
Как можно наиболее оптимально и красиво добиться того-же эффекта?

а что значит "оптимально"?
если программа несложная, должна занимать мало места и быстро работать, то, конечно, лучше передавать указатель на какую-то область памяти и потом ее заполнять.
если программа довольно сложная, имеет большую объектную модель, то в этом случае, действительно, лучше использовать что-нибдуь вроде STL
Цитата
объект, полю которого и присваиваются результаты

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

Автор: Chingachguk 17.1.2004, 16:57
Можно внутри процедуры выделить память (malloc, virtualalloc, etc) и верунть указатель на эту память, только потом не забыть ее вернуть. Кажется, в методе закрытия (я ничего не понимаю в си++) можно указать закрыть всю выделенную память.

Автор: __vi 21.1.2004, 18:20
Возвращай указатель

Автор: mr.DUDA 21.1.2004, 18:33
Цитата
Кажется, в методе закрытия (я ничего не понимаю в си++) можно указать закрыть всю выделенную память.

Освободить выделенный блок памяти можно только по указателю на него, и только с помощью парной функции к той, какой память была выделена (речь идёт о new/delete, malloc/free, VirtualAlloc/VirtualFree). Сразу всю выделенную память освободить одной функцией нельзя, если конечно не имеется ввиду какой-то умный сторонний движок по управлению памятью.

Автор: mi49.Ok 22.1.2004, 10:53
Мне как то такая хрень понадобилась, я тогда писал преобразователь int'а в char. Я решил её так(наверно глупо):
Код

#include <stdio.h>
char chr_return(char _chr[], int num)
{
          ...//какие-то преобразования с _chr
          return _chr[num];
}
void main()
{
          char __chr[256]={""};
          for (auto __int8 i=0;i<256;i++)
                __chr[i]=chr_return(_chr, i);
}

Автор: Alex101 22.1.2004, 11:19
Цитата(mi49 @ 22.1.2004, 07:53)
Я решил её так

Нет, тут возвращается элемент массива, а ему нужен массив.
Тип функции должен быть, например char*
А возвращать надо сам массив (по имени).

Автор: mi49.Ok 22.1.2004, 11:34
Так нет, смысл в том, что делается цикл и в нём массиву(в который надо занести значение другого массива) возвращается соответствующее значение массива(из которого надо взять значение).

Автор: shedon 22.1.2004, 11:39
Цитата
Так нет, смысл в том, что делается цикл и в нём массиву(в который надо занести значение другого массива) возвращается соответствующее значение массива(из которого надо взять значение).

lol, большего извращения не видел -smile.gif

Автор: mi49.Ok 22.1.2004, 14:50
А вообще, когда ты передаёшь в функцию массив, то передаётся адрес на первый бит массива => можно изменять массив в функции и массив, который ты передавал в функцию, тоже будет соответственно изменяться. Но надо обращаться на битам, в цикл запихать не получиться. Это я сам проверил.

Автор: bel_nikita 22.1.2004, 17:06
Цитата
А вообще, когда ты передаёшь в функцию массив, то передаётся адрес на первый бит массива => можно изменять массив в функции и массив, который ты передавал в функцию, тоже будет соответственно изменяться. Но надо обращаться на битам, в цикл запихать не получиться. Это я сам проверил.


А приче здесь битыconfused.gif

не на бит, а на элемент
точнее адрес. чтобы адресация по-битная была, токого я еще не видел

да и вообще зачем давать совет, если сам не знаешь, что советуешь

То GrAndrey
а зачем так извращаться?smile.gif
Для чего тебе это надо? Я думаю это недороботка программы.

Автор: GrAndrey 23.1.2004, 17:09
Цитата(bel_nikita @ 22.1.2004, 17:06)
То GrAndrey
а зачем так извращаться?smile.gif
Для чего тебе это надо? Я думаю это недороботка программы.

Почему извращаться? Разве редко в результате работы функции должен измениться массив? Как я писал, задачу решил, но не уверен что такой подход достаточно красивый ( я пишу прогу - тестовое задание, красота кода важна wink.gif )

Автор: bel_nikita 24.1.2004, 01:13
GrAndrey
чтобы возвращать массив тебе придется обернуть его в класс и ..., короче гемор
лучше для этого использовать STL.
типа того (пример возврата)
Код
template <typename T = std::allocator<T> > T copyArray_20(const T &Array)
{
 T newArray(Array.size());
 copy(Array.begin(),Array.end(),newArray.begin());
 return newArray;
}

template <typename T = std::allocator<T> > T copyArray_21(const T &Array)
{
  T newArray; T::const_iterator elem=Array.begin();
  for(;elem<=Array.end();++elem) newArray.push_back(*elem);
  //while(elem!=Array.end()) newArray.push_back(*elem++);
  return newArray;
}


Код
 deque<int> Array(10);
 deque<int> Massiv;

 for(i=0;i<10;++i)
   Array[i]=i+10;

 Massiv=copyArray_21(Array);

 for(i=0;i<10;++i)
   printf("%d ",Massiv[i]);

Автор: Stalk 24.1.2004, 01:30
А почему нельзя юзать union?

Автор: shedon 24.1.2004, 01:44
Может, я чего не понял с тем, что нужно, но если надо возвращать масиив, то можно просто возвращать указатель, например так:
Код

// Объявляем функцию которая будет возвращать массив
int *FuncRetArr(int *ifArr);

// Сам массив
int iArr[] = {12, 587, 10, 39, 78};

int main()
{
     int *iTemp = FuncRetArr(iArr);
     // Для получения, например, второго элемента из массива можно сделать так
    int iNum = FuncRetArr(iArr)[2];
     for(int i= 0; i < sizeof(iTemp )/sizeof(int); i++)
    {
         printf("%d", iTemp[I]);
    }

  return 0;
}

int *FuncRetArr(int *ifArr)
{
 // Что то делаем с ifArr
//....
 // Возвращаем массив
 return ifArr;
//
}

Автор: mi49.Ok 24.1.2004, 07:43
2 bel_nikita:
Цитата
да и вообще зачем давать совет, если сам не знаешь, что советуешь

Самый умный? Так скажи сам что-нибудь.

Автор: GrAndrey 24.1.2004, 13:15
Цитата(bel_nikita @ 24.1.2004, 01:13)
GrAndrey
лучше для этого использовать STL.
типа того (пример возврата)
Код
template <typename T = std::allocator<T> > T copyArray_20(const T &Array)
{
 T newArray(Array.size());
 copy(Array.begin(),Array.end(),newArray.begin());
 return newArray;
}

template <typename T = std::allocator<T> > T copyArray_21(const T &Array)
{
  T newArray; T::const_iterator elem=Array.begin();
  for(;elem<=Array.end();++elem) newArray.push_back(*elem);
  //while(elem!=Array.end()) newArray.push_back(*elem++);
  return newArray;
}


Код
 deque<int> Array(10);
 deque<int> Massiv;

 for(i=0;i<10;++i)
   Array[i]=i+10;

 Massiv=copyArray_21(Array);

 for(i=0;i<10;++i)
   printf("%d ",Massiv[i]);

У меня, вроде, всё проще smile.gif Но, тем не менее спасибо. Нашёл в коде интересные вещи.

Автор: mr.DUDA 24.1.2004, 15:56
2 Stalk,
Цитата
А почему нельзя юзать union?

А при чём здесь union ?...

Автор: Stalk 25.1.2004, 09:26
А при том, что в него можно запихнуть массив.

Автор: shedon 25.1.2004, 12:41
Цитата
А при том, что в него можно запихнуть массив.

Может тогда отдельный класс создать, в который запихнуть массив, и возвращать его. smile.gif

Автор: Stalk 25.1.2004, 17:11
Этот вариант уже предложен.

Автор: C'hoosen++ 28.1.2004, 17:43
Использовать ссылочный вариант передачи массивов как аргументов.

Автор: FreshMeat 30.1.2004, 16:29
Возвращать контейнер обернутый std::auto_ptr

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)