Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / возвращение массива из функции... / 7 сообщений из 7, страница 1 из 1
11.10.2005, 00:22
    #33316147
2201
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возвращение массива из функции...
я конечно понимаю вернуть массив из функции нельзя, а вот трюки обходящие это имеются?
есть такое
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
typedef vector<string> tdurl[ 5 ];
tdurl* f(tdurl &a)
{
	tdurl* qd = new tdurl[ 5 ];
        qd[ 0 ][ 0 ].push_back("zxc");
	a[ 0 ][ 0 ]=a[ 0 ][ 0 ]+"213";
	return qd;
}
тест прога (надо что бы оно работало)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
int main()
{
	tdurl id,id2;
	id[ 0 ].push_back("asd");
	id2=f(id); // тут работать не будет никаким образом, т.к. массив из 5 элементов не может быть l-value, как тут быть?
	printf("%s \n%s \n", id[ 0 ][ 0 ].c_str(), id2[ 0 ][ 0 ].c_str());
	return  0 ;
}
предполагаю что внутри функции не выделяю память пот элементы массива, но при попытке это сделать компилятор ругается на несоответствие типов в результате возвращается неизвестно что Ж)

есть РАБОТАЮЩИЙ вариант, но он на размерность меньше
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
typedef vector<string> tdurl;

tdurl f(tdurl &a)
{
	tdurl* qd = new tdurl;
	qd[ 0 ].push_back("zxc");
	a[ 0 ]=a[ 0 ]+"213";
	(*qd)[ 0 ]=(*qd)[ 0 ]+(*qd)[ 0 ];
	return *qd;
}


int main()
{
	tdurl id,id2;
	id.push_back("asd");
	id2=f(id);
	printf("%s \n%s \n", id[ 0 ].c_str(), id2[ 0 ].c_str());
	return  0 ;
}
...
Рейтинг: 0 / 0
11.10.2005, 10:10
    #33316505
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возвращение массива из функции...
Почему нельзя-то ? Можно, возвращай на здоровье.
...
Рейтинг: 0 / 0
11.10.2005, 10:12
    #33316511
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возвращение массива из функции...
Надо просто new tdurl; писать.
...
Рейтинг: 0 / 0
11.10.2005, 10:24
    #33316539
redskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возвращение массива из функции...
1 AFAIK массив из функции вернуть нельзя (8.3.5.6)

2 Да, можно в функции выделить память и вернуть указатель на нее
2.1 Кстати, кто будет эту память чистить потом?

3 Работающий вариант №2 работает потому, что возвращает вектор, а не массив векторов.
3.1 Если уж можно использовать контейнеры stl, то зачем гемор с динамическим выделением по new? Судя по исходнику, на этих граблях вам предстоят очень веселые пляски. Может лучше не усложнять ситуацию? Ниже я привел пример, который делает то, что вам надо, но без утечек памяти :)
3.2
Если угнетает размерность, так возвращайте vector<vector<string> > и нет проблем.

4. Возвращать контейнеры по значению... ммм... моветон. IMHO куда как лучше передавать их по ссылке и делать потом с ними все, что душе угодно...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
#include <iostream>
#include <string>
#include <vector>

using namespace std;
typedef vector<string> TDur1;

TDur1 f(TDur1& a)
{
	TDur1 res;
	res.push_back("zxc");
	if(!a.empty())
		a[ 0 ] += "123";
	res[ 0 ] = res[ 0 ] + res[ 0 ];

	return res;
}

void PrintDur(TDur1& t)
{
	for(TDur1::iterator it = t.begin(); it != t.end(); it++)
		cout << *it << endl;
}

int main()
{

	TDur1 id, id2;
	id.push_back("asd");
	id2 = f(id);

	PrintDur(id);
	cout << endl;
	PrintDur(id2);
	return  0 ;
}

...
Рейтинг: 0 / 0
11.10.2005, 10:54
    #33316635
redskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возвращение массива из функции...
Если же говорить о "трюках", то можно воспользоваться тем фактом, что хотя массив вернуть из функции нельзя, можно вернуть структру. "Упаковываем" массив в struct и возвращаем ее. Если при этом еще перегрузить оператор [], то будет совсем кошерно. Пример:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
#include <iostream>
#include <string>
#include <vector>

using namespace std;
typedef struct
{
	int m[ 5 ];

	int& operator[](int indx)
	{
		return m[indx];
	}
}TDur1;

TDur1 f()
{
	TDur1 res;
	for(int i =  0 ; i <  5 ; i++)
		res.m[i] = i;
	return res;
}

void PrintDur(TDur1& t)
{
	for(int i =  0 ; i <  5 ; i++)
		cout << t.m[i] << " ";
	cout << endl;
}

int main()
{
	TDur1 t;
	t = f();

	PrintDur(t);

	t[ 0 ] =  10 ;
	t[ 1 ] =  20 ;
	t[ 3 ] = t[ 1 ];

	PrintDur(t);
	
	return  0 ;
}

Но все это велосипедостроительство. Лучше пользоваться нормальными контейнерами (п. 3.1) не забывая про п. 4 :-)
...
Рейтинг: 0 / 0
11.10.2005, 20:35
    #33318467
2201
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возвращение массива из функции...
ну есессно, это кусок кода, в полной программе память благополучно удаляется мною Ж)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
TDur1 f(TDur1& a)
{
	TDur1 res;
	res.push_back("zxc");
	if(!a.empty())
		a[ 0 ] += "123";
	res[ 0 ] = res[ 0 ] + res[ 0 ];

	return res;
}
мне казалось это работать не должно, видимо я не учёл тот факт что push_back() сам вызывает new...
и надо полагать что память у меня течёт когда я сам делаю new,а второй раз new делает push_back(), я правильно понял? или имелось в виду то что я её сам не освобождаю до завершения программы - delete[] id2; перед return 0;?

и кстати, раз уж перегрузили [], то писать можно вместо res.m = i;
просто res=i;... а то смысл применения структуры ускользает Ж))
...
Рейтинг: 0 / 0
11.10.2005, 22:35
    #33318538
2201
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
возвращение массива из функции...
да пожалуй способ с "упаковкой" массива в структуру для моей задачи наиболее приемлем...
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / возвращение массива из функции... / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]