Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Передача вектора в функцию.  [new]
YUBA
Member

Откуда:
Сообщений: 751
Имеется структура Str1. На ее основе делается вектор
vector<Str1> vStr1;
и инициализируется - около 1000 значений.
Далее вектор передается в функцию типа int Foo(vector<Str1> vstr), которая должна изменить значения полей структур непосредственно самого вектора vStr1.
Всячески варианты с int Foo(vector<Str1> *vstr) и int Foo(vector<Str1> &vstr) пробовал, но они не идут. Ошибок компиляции-выполнения нет, но на выходе ахинея.)
Как, в итоге, передать вектор в функцию чтобы вектор можно было в ней редактировать?

"Есть многое на свете, друг Горацио, что и не сразу в голову придет."
М. Твен "Приключения Геккельбери Финна"
[/color ]
26 сен 19, 22:20    [21980337]     Ответить | Цитировать Сообщить модератору
 Re: Передача вектора в функцию.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48692

YUBA
Всячески варианты с int Foo(vector<Str1> *vstr) и int Foo(vector<Str1> &vstr) пробовал, но
они не идут.

Значит плохо пробовал, ибо они единственно верные. Причём второй вернее первого.

Posted via ActualForum NNTP Server 1.5

26 сен 19, 22:28    [21980350]     Ответить | Цитировать Сообщить модератору
 Re: Передача вектора в функцию.  [new]
ёёёёё
Member

Откуда:
Сообщений: 1418
YUBA
Имеется структура Str1. На ее основе делается вектор
vector<Str1> vStr1;
и инициализируется - около 1000 значений.
Далее вектор передается в функцию типа int Foo(vector<Str1> vstr), которая должна изменить значения полей структур непосредственно самого вектора vStr1.
Всячески варианты с int Foo(vector<Str1> *vstr) и int Foo(vector<Str1> &vstr) пробовал, но они не идут. Ошибок компиляции-выполнения нет, но на выходе ахинея.)
Как, в итоге, передать вектор в функцию чтобы вектор можно было в ней редактировать?

"Есть многое на свете, друг Горацио, что и не сразу в голову придет."
М. Твен "Приключения Геккельбери Финна"
[/color ]


+ Вечер халявы для сутдетов

#include "pch.h"
#include <iostream>
#include <vector>
using namespace std;
class Str1
{
public:
	int f1;
	int f2;
};

void Foo(vector<Str1> &  vStr)
{
	vStr.push_back({ 1,2 });
	vStr.push_back({ 3,4 });
	vStr.push_back({ 5,6 });
}

int main()
{
	auto vS = vector<Str1>();
	Foo(vS);

	cout << "Quantity:" << vS.size() << endl;
	for (auto it = vS.begin(); it != vS.end(); ++it)
		cout << " f1:" << (*it).f1 << " f2:" << (*it).f2 << endl;
}

26 сен 19, 22:41    [21980360]     Ответить | Цитировать Сообщить модератору
 Re: Передача вектора в функцию.  [new]
YUBA
Member

Откуда:
Сообщений: 751
ёёёёё,Спасибо, но все равно ахинея.
3	1	2	2019-06-05 12:26:00	23161	23293	132	0	0	11320071475429242422962870476408253745900439793770910684839611498339765268014404936395415376878606539060841232866515822841269990571580063744.	3364531390168509570946593670063403957102172840568483435160286401658880.
4	1	2	2019-06-05 14:42:00	23259	23386	127	0	0	71061053206767231335290419438869451027886880981547709330927643776069469033442112144793532435628496288557050928584222306862363645562622526178436991952205423341655708171533962693422776433178535765826978447360.	8429771835985078174410628294459790600472833518789130913325974186583376241988234811867690212707893510144.
5	1	2	2019-06-06 14:05:00	23610	23695	85	0	0	446081395671004514473158387440660216381247281738051093173779195884108577903292074030635862547519043877453806698526205916499236939099560046252967061089684854267063142039623707857800559963585905183585530639629813775610929217784582291206231119092652704071193423346952478654464.	21120639092390279490016543401216637531519356108297928941445795843131668552525124734886251183756315214997031922628268362749203194371375104.
6	1	2	2019-06-06 14:09:00	23618	23703	85	0	0	inf.0	inf.0
7	1	2	2019-06-07 16:13:00	24147	24625	478	0	0	inf.0	inf.0
8	1	2	2019-06-10 10:00:00	24180	24619	439	0	0	inf.0	inf.0

Редактируются 2 последних столбца.

Функции были отлажены и работали в виде int Foo(), когда вектор был в области видимости и в функцию не передавался.
26 сен 19, 22:57    [21980366]     Ответить | Цитировать Сообщить модератору
 Re: Передача вектора в функцию.  [new]
L.Otujktd
Member

Откуда:
Сообщений: 81
YUBA
Имеется структура Str1. На ее основе делается вектор
vector<Str1> vStr1;
и инициализируется - около 1000 значений.
Далее вектор передается в функцию типа int Foo(vector<Str1> vstr), которая должна изменить значения полей структур непосредственно самого вектора vStr1.
Всячески варианты с int Foo(vector<Str1> *vstr) и int Foo(vector<Str1> &vstr) пробовал, но они не идут. Ошибок компиляции-выполнения нет, но на выходе ахинея.)
Как, в итоге, передать вектор в функцию чтобы вектор можно было в ней редактировать?

"Есть многое на свете, друг Горацио, что и не сразу в голову придет."
М. Твен "Приключения Геккельбери Финна"
[/color ]

В другой поток случайно не передаете?
26 сен 19, 22:58    [21980367]     Ответить | Цитировать Сообщить модератору
 Re: Передача вектора в функцию.  [new]
YUBA
Member

Откуда:
Сообщений: 751
L.Otujktd, нет, не передаю.
26 сен 19, 23:07    [21980375]     Ответить | Цитировать Сообщить модератору
 Re: Передача вектора в функцию.  [new]
ёёёёё
Member

Откуда:
Сообщений: 1418
YUBA
ёёёёё,Спасибо, но все равно ахинея.
3	1	2	2019-06-05 12:26:00	23161	23293	132	0	0	11320071475429242422962870476408253745900439793770910684839611498339765268014404936395415376878606539060841232866515822841269990571580063744.	3364531390168509570946593670063403957102172840568483435160286401658880.
4	1	2	2019-06-05 14:42:00	23259	23386	127	0	0	71061053206767231335290419438869451027886880981547709330927643776069469033442112144793532435628496288557050928584222306862363645562622526178436991952205423341655708171533962693422776433178535765826978447360.	8429771835985078174410628294459790600472833518789130913325974186583376241988234811867690212707893510144.
5	1	2	2019-06-06 14:05:00	23610	23695	85	0	0	446081395671004514473158387440660216381247281738051093173779195884108577903292074030635862547519043877453806698526205916499236939099560046252967061089684854267063142039623707857800559963585905183585530639629813775610929217784582291206231119092652704071193423346952478654464.	21120639092390279490016543401216637531519356108297928941445795843131668552525124734886251183756315214997031922628268362749203194371375104.
6	1	2	2019-06-06 14:09:00	23618	23703	85	0	0	inf.0	inf.0
7	1	2	2019-06-07 16:13:00	24147	24625	478	0	0	inf.0	inf.0
8	1	2	2019-06-10 10:00:00	24180	24619	439	0	0	inf.0	inf.0

Редактируются 2 последних столбца.

Функции были отлажены и работали в виде int Foo(), когда вектор был в области видимости и в функцию не передавался.

Код покажи. Весь.
26 сен 19, 23:09    [21980376]     Ответить | Цитировать Сообщить модератору
 Re: Передача вектора в функцию.  [new]
YUBA
Member

Откуда:
Сообщений: 751
L.Otujktd, вот результаты той-же Foo(), без передачи в нее вектора.
23	1	2	10.07.2019 16:13	24921	25335	414	357.8913329	56.10866711	5127.906932	71.60940533	429.5007382	286.2819276
24	1	2	10.07.2019 17:33	24832	25303	471	358.2976702	112.7023298	5513.170345	74.25072623	432.5483964	284.0469439
25	1	2	10.07.2019 19:18	24791	25210	419	358.7810337	60.21896631	5886.387968	76.72279953	435.5038332	282.0582342
26	1	2	10.07.2019 19:20	24788	25785	997	360.2920523	636.7079477	6418.846007	80.11770096	440.4097532	280.1743513
27	1	2	11.07.2019 11:28	24680	25301	621	362.147348	258.852652	6961.566938	83.43600505	445.583353	278.7113429
28	1	2	11.07.2019 11:30	24630	25300	670	364.405094	305.594906	7525.255574	86.74823096	451.153325	277.656863
26 сен 19, 23:11    [21980377]     Ответить | Цитировать Сообщить модератору
 Re: Передача вектора в функцию.  [new]
bk0010
Member

Откуда:
Сообщений: 4851
Ребилдол - лекарство от головной боли у программиста: сотрите все объектники и сделайте полную пересборку. Было однажды такое, когда добавил пару полей в тип, по которому создавался вектор.
26 сен 19, 23:56    [21980410]     Ответить | Цитировать Сообщить модератору
 Re: Передача вектора в функцию.  [new]
YUBA
Member

Откуда:
Сообщений: 751
ёёёёё, ваш код
class Str1
{
public:
	int f1;
	int f2;
};

void Foo(vector<Str1> &  vStr)
{
	vStr.push_back({ 1,2 });
	vStr.push_back({ 3,4 });
	vStr.push_back({ 5,6 });
}

int main()
{
	auto vS = vector<Str1>();
	Foo(vS);

	cout << "Quantity:" << vS.size() << endl;
	for (auto it = vS.begin(); it != vS.end(); ++it)
		cout << " f1:" << (*it).f1 << " f2:" << (*it).f2 << endl;
}
Теперь унесем вектор и его определение из области видимости функции Foo. Cаму Foo() поместим в класс, оставив в его области видимости только определение Str1
struct Str1
{

	int f1;
	int f2;
};
(вектор как public переменная находится в другом классе не состоящем в родственных и никаких отношениях с классом где находится Foo())
И уже в функции определим вектор Foo(vector<Str1> vstr1). И & в представленном виде перестает работать.
27 сен 19, 01:22    [21980427]     Ответить | Цитировать Сообщить модератору
 Re: Передача вектора в функцию.  [new]
YUBA
Member

Откуда:
Сообщений: 751
Да, все оч. грустно, все это работать не будет.
Если вектор имеет определенный пользователем тип данных, то тип должен реализовать соответствующую конструкцию
 копирования, чтобы вектор мог быть модифицирован функцией, где он называется ссылкой, если функция обновляет вектор в 
результате push_back локальной переменной этого UDT...

Передача векторов в функцию, значение vs reference С++
27 сен 19, 02:27    [21980436]     Ответить | Цитировать Сообщить модератору
 Re: Передача вектора в функцию.  [new]
ёёёёё
Member

Откуда:
Сообщений: 1418
YUBA
ёёёёё, ваш код
class Str1
{
public:
	int f1;
	int f2;
};

void Foo(vector<Str1> &  vStr)
{
	vStr.push_back({ 1,2 });
	vStr.push_back({ 3,4 });
	vStr.push_back({ 5,6 });
}

int main()
{
	auto vS = vector<Str1>();
	Foo(vS);

	cout << "Quantity:" << vS.size() << endl;
	for (auto it = vS.begin(); it != vS.end(); ++it)
		cout << " f1:" << (*it).f1 << " f2:" << (*it).f2 << endl;
}
Теперь унесем вектор и его определение из области видимости функции Foo. Cаму Foo() поместим в класс, оставив в его области видимости только определение Str1
struct Str1
{

	int f1;
	int f2;
};
(вектор как public переменная находится в другом классе не состоящем в родственных и никаких отношениях с классом где находится Foo())
И уже в функции определим вектор Foo(vector<Str1> vstr1). И & в представленном виде перестает работать.

Только что так сделал - все работает отлично.
27 сен 19, 02:37    [21980440]     Ответить | Цитировать Сообщить модератору
 Re: Передача вектора в функцию.  [new]
YUBA
Member

Откуда:
Сообщений: 751
ёёёёё, коли так, если не затруднит.
Пусть вектор будет, скажем:
struct Str1
{
string s;
double a;
double b;
double c=0;
}
Заполняем массив vector<Str1> str; кроме str.с.
Далее функция ко всему массиву
void Foo(vector<Str1> &str1)
{
int I = str1.size();
for(int i=0;i<I;i++) {str1[i].c = str1[i].a+str[i].b}
}
У меня подобная конструкция по ссылке не работает.
27 сен 19, 03:00    [21980443]     Ответить | Цитировать Сообщить модератору
 Re: Передача вектора в функцию.  [new]
Dima T
Member

Откуда:
Сообщений: 14114
YUBA
У меня подобная конструкция по ссылке не работает.

Так и пишет "sorry, this construct does not work" ? Подробнее надо ошибку описывать.

С виду код вполне рабочий, проверяй наполнение вектора, скорее всего там косяк.
27 сен 19, 05:22    [21980450]     Ответить | Цитировать Сообщить модератору
 Re: Передача вектора в функцию.  [new]
AmKad
Member

Откуда:
Сообщений: 5111
YUBA
int I = str1.size();
for(int i=0;i<I;i++) {str1[i].c = str1[i].a+str[i].b}

1) str или str1?
2) С++11 и выше:
for (auto& v : str1)
    v.c = v.a + v.b;
27 сен 19, 09:55    [21980531]     Ответить | Цитировать Сообщить модератору
 Re: Передача вектора в функцию.  [new]
teo609
Member

Откуда: Рязань
Сообщений: 119
ёёёёё
YUBA
ёёёёё,Спасибо, но все равно ахинея.
3	1	2	2019-06-05 12:26:00	23161	23293	132	0	0	11320071475429242422962870476408253745900439793770910684839611498339765268014404936395415376878606539060841232866515822841269990571580063744.	3364531390168509570946593670063403957102172840568483435160286401658880.
4	1	2	2019-06-05 14:42:00	23259	23386	127	0	0	71061053206767231335290419438869451027886880981547709330927643776069469033442112144793532435628496288557050928584222306862363645562622526178436991952205423341655708171533962693422776433178535765826978447360.	8429771835985078174410628294459790600472833518789130913325974186583376241988234811867690212707893510144.
5	1	2	2019-06-06 14:05:00	23610	23695	85	0	0	446081395671004514473158387440660216381247281738051093173779195884108577903292074030635862547519043877453806698526205916499236939099560046252967061089684854267063142039623707857800559963585905183585530639629813775610929217784582291206231119092652704071193423346952478654464.	21120639092390279490016543401216637531519356108297928941445795843131668552525124734886251183756315214997031922628268362749203194371375104.
6	1	2	2019-06-06 14:09:00	23618	23703	85	0	0	inf.0	inf.0
7	1	2	2019-06-07 16:13:00	24147	24625	478	0	0	inf.0	inf.0
8	1	2	2019-06-10 10:00:00	24180	24619	439	0	0	inf.0	inf.0

Редактируются 2 последних столбца.

Функции были отлажены и работали в виде int Foo(), когда вектор был в области видимости и в функцию не передавался.

Код покажи. Весь.


Поддерживаю. Интересно уже посмотреть код.
Если ахинея - это длинная последовательность цифр, то возможно ошибка в функции вывода, например предполагается вывод строки %s, а в параметрах вместо строки объект, у которого нет преобразования в строку или оно не вызывается.
27 сен 19, 10:06    [21980542]     Ответить | Цитировать Сообщить модератору
 Re: Передача вектора в функцию.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2521
YUBA,
Ждем твой код. У всех работает
21951094
27 сен 19, 11:31    [21980669]     Ответить | Цитировать Сообщить модератору
 Re: Передача вектора в функцию.  [new]
mayton
Member

Откуда: loopback
Сообщений: 42981
YUBA, считаю целесообразным изучить макет вашего кода на котором эта ошибка воспроизводится.
27 сен 19, 11:33    [21980679]     Ответить | Цитировать Сообщить модератору
 Re: Передача вектора в функцию.  [new]
ёёёёё
Member

Откуда:
Сообщений: 1418
YUBA
ёёёёё, коли так, если не затруднит.
Пусть ...
.

Пустая болтовня. Делаешь минимальное приложение, воспроизводящие 'проблему', и выкладываешь сюда.
Только рабочий код, без сказок.
27 сен 19, 12:44    [21980779]     Ответить | Цитировать Сообщить модератору
 Re: Передача вектора в функцию.  [new]
ну я
Member

Откуда: Stalingrad
Сообщений: 1195
YUBA
Имеется структура Str1. На ее основе делается вектор
vector<Str1> vStr1;
и инициализируется - около 1000 значений.
Далее вектор передается в функцию типа int Foo(vector<Str1> vstr), которая должна изменить значения полей структур непосредственно самого вектора vStr1.
Всячески варианты с int Foo(vector<Str1> *vstr) и int Foo(vector<Str1> &vstr) пробовал, но они не идут. Ошибок компиляции-выполнения нет, но на выходе ахинея.)
Как, в итоге, передать вектор в функцию чтобы вектор можно было в ней редактировать?

"Есть многое на свете, друг Горацио, что и не сразу в голову придет."
М. Твен "Приключения Геккельбери Финна"
[/color ]

Такие косяки случаются когда хранимый в контейнере тип не имплементирует необходимые для контейнеров операции по-правильному, скажем оператор копирования или конструктор копирования. Контейнеры это неявно используют, а дефолтная реализация от языка может накосячить с какими-нибудь указателями.
27 сен 19, 14:40    [21980943]     Ответить | Цитировать Сообщить модератору
 Re: Передача вектора в функцию.  [new]
YUBA
Member

Откуда:
Сообщений: 751
ну я
Такие косяки случаются когда хранимый в контейнере тип не имплементирует необходимые для контейнеров операции по-правильному, скажем оператор копирования или конструктор копирования. Контейнеры это неявно используют, а дефолтная реализация от языка может накосячить с какими-нибудь указателями.
Тоже склоняюсь к этому варианту. Тем более, что вопрос вполне описан в
YUBA
Если вектор имеет определенный пользователем тип данных, то тип должен реализовать соответствующую конструкцию
 копирования, чтобы вектор мог быть модифицирован функцией, где он называется ссылкой, ...

Передача векторов в функцию, значение vs reference С++
что и имеет место быть.
Думаю попробовать поместить вектор в класс и работать с вектором не непосредственно или по ссылке, а через функции класса имеющие доступ непосредственно к телу вектора.
27 сен 19, 16:38    [21981123]     Ответить | Цитировать Сообщить модератору
 Re: Передача вектора в функцию.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2521
YUBA
что и имеет место быть.
Думаю попробовать поместить вектор в класс и работать с вектором не непосредственно или по ссылке, а через функции класса имеющие доступ непосредственно к телу вектора.
а не проще исправить глючный класс в векторе?
27 сен 19, 19:46    [21981287]     Ответить | Цитировать Сообщить модератору
 Re: Передача вектора в функцию.  [new]
YUBA
Member

Откуда:
Сообщений: 751
PetroNotC Sharp, Как? Ошибок в коде нет. Исполнение в норме.
Foo() - работает штатно. Вектор в том-же классе.
Foo(vector<Str1> &vstr1) - полностью идентична, но находится в другом классе и работает со ссылкой на вектор. На выходе функции ахинея, вектор нормально не редактируется.
Мне почти очевидно, что дело не в самом коде, а в
Если вектор имеет определенный пользователем тип данных, то тип должен реализовать соответствующую конструкцию
 копирования, чтобы вектор мог быть модифицирован функцией, где он называется ссылкой, ...
Передача векторов в функцию, значение vs reference С++
27 сен 19, 20:33    [21981315]     Ответить | Цитировать Сообщить модератору
 Re: Передача вектора в функцию.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2521
YUBA
Как?
тебе 10 раз сказали - дать тестовый пример.

YUBA
Мне почти очевидно, что дело не в самом коде, а в
а в классе который написал ты?
27 сен 19, 20:49    [21981328]     Ответить | Цитировать Сообщить модератору
 Re: Передача вектора в функцию.  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2521
YUBA,
Там написано, что класс St1 должен быть с правильными или дефолтными конструкторами.
27 сен 19, 20:50    [21981329]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / C++ Ответить