powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / возвращение массива из функции...
7 сообщений из 7, страница 1 из 1
возвращение массива из функции...
    #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
возвращение массива из функции...
    #33316505
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему нельзя-то ? Можно, возвращай на здоровье.
...
Рейтинг: 0 / 0
возвращение массива из функции...
    #33316511
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо просто new tdurl; писать.
...
Рейтинг: 0 / 0
возвращение массива из функции...
    #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
возвращение массива из функции...
    #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
возвращение массива из функции...
    #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
возвращение массива из функции...
    #33318538
2201
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да пожалуй способ с "упаковкой" массива в структуру для моей задачи наиболее приемлем...
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / возвращение массива из функции...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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