Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/75: Рейтинг темы: голосов - 75, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 02.08.2015
Сообщений: 124
1

Как вернуть вектор из функции?

06.02.2016, 21:33. Показов 15719. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как вернуть вектор strx из функции crypto чтоб значения передались
C++
1
2
pthread_join(thread1,(void**)&str1);
    pthread_join(thread2,(void**)&str2);
соответственно?
C++
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include "stdafx.h"
#include <cctype>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <locale>
#include <pthread.h>
using namespace System;
 
const int row = 26;
const int col = 26;
const int len = 3;
char mas[row][col][len];
char mas_ascii[256];
 
std::vector <std::string> str;
struct bound { int begin ; int end ; } ;
 
void *crypto (void *param)
{
std::vector<std::string> strx;  
bound *b = (bound *)param ;
for (int i = b->begin; i < b->end; i++)
            {
                std::string a = str[i];
                for(int k = 0; k < a.size(); ++k)
                {
                    for (int j = 0; j < 256; j++)
                    {
                        if(a[k]==mas_ascii[j])
                        {
                            int jx=j;
                            int xx = jx/26;
                            int yx = jx%26;                       
                            strx.push_back (mas[xx][yx]); 
                        }  
                        
                    }
                }
            }
 //return strx; //возвращение результата
}
 
 
 
int main() 
{
      
      std::string buff;
      std::vector <std::string> str1;
      std::vector <std::string> str2;
      bound b ; //границы вычислений для первого потока
      bound c ; //границы вычислений для второго потока
      std::locale current_locale("");
      std::locale::global(current_locale);
 
      //Заполняем таблицу кодирующих символов
    for (int i=0; i<row; i++)
        for (int j=0; j<col; j++)
        {
            mas[i][j][0] = i+'A';
            mas[i][j][1] = j+'A';
            mas[i][j][2] = '\0';
        }
 
    //Заполняем таблицу с символами ASCII
     for (int i = 0; i < 256; ++i)
        {   
            mas_ascii[i] = Convert::ToChar(i);
        }
 
    //Открываем файл для чтение исходного текста 
    std::ifstream ifs("in.txt", std::ios_base::binary);
    if (!ifs) std::cout << "Unable to open file in.txt" << std::endl;  
 
    while (getline(ifs, buff))
        {   
            str.push_back(buff);
        }   
 
    pthread_t thread1, thread2;
    b.begin = 0;
    b.end = str.size()/2 ;
    pthread_create(&thread1,NULL,crypto,(void *)&b);
    c.begin = str.size()/2+1;
    c.end = str.size();
    pthread_create(&thread2,NULL,crypto,(void *)&c);
 
    pthread_join(thread1,(void**)&str1);
    pthread_join(thread2,(void**)&str2);
 
    std::vector<std::string> strresult(str1);
        strresult.insert(
                    strresult.end(),
                    str2.begin(),
                    str2.end()
                  );
 
    //Открывем файл для записи шифрованного текста
    std::ofstream ofs("out.txt");
    if(ofs.is_open())
    {       
        for (int i = 0; i < strresult.size(); ++i)
            {
                ofs << strresult[i];
            }
 
        std::cout << std::endl;
        ofs.close();
    }
    else
        std::cerr << "Unable to open file out.txt" << std::endl;
    delete &str1; delete &str2 ;
    std::system("pause");
 
    return 0;
}
Добавлено через 1 час 3 минуты
Или как сделать чтоб текст обработался параллельно?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.02.2016, 21:33
Ответы с готовыми решениями:

Вернуть измененный вектор из функции
Хотел написать метод функции такой, чтобы можно в него было передать какой-то вектор, но который...

Как вернуть значение функции
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; struct list{ float data; list *next; }; void...

Как вернуть массив из функции?
int SumElementovStolbca(int M, int mas, int N) { int sum = 0; for (int i = 0; i&lt;N; i++) {...

Как вернуть массив из функции?
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; int mass(int n) { int* Mass...

18
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
06.02.2016, 22:06 2
Цитата Сообщение от ikudesnik Посмотреть сообщение
Как вернуть вектор strx из функции
Передавай в функцию вектор по ссылке, внутри функции меняй в нём всё, что тебе надо, и возвращай из функции ссылку на него же - все изменения будут сохранены:

C++
1
2
3
4
std::vector<std::string> & crypto(std::vector<std::string> & str)
{
   //тут твоя реализация функции
}
0
0 / 0 / 0
Регистрация: 02.08.2015
Сообщений: 124
06.02.2016, 22:27  [ТС] 3
Чет я не пойму, что да как сделать

Добавлено через 5 минут
Надо как я понял отправить в Функцию b и с
C++
1
2
3
4
5
6
7
 pthread_t thread1, thread2;
    b.begin = 0;
    b.end = str.size()/2 ;
    pthread_create(&thread1,NULL,crypto,(void *)&b);
    c.begin = str.size()/2+1;
    c.end = str.size();
    pthread_create(&thread2,NULL,crypto,(void *)&c);
А вернуть str1 и str2
C++
1
2
pthread_join(thread1,(void**)&str1);
    pthread_join(thread2,(void**)&str2);
только vector а не void

Добавлено через 4 минуты
Мне надо чтоб два потока параллельно шли
0
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
06.02.2016, 22:35 4
Цитата Сообщение от ikudesnik Посмотреть сообщение
C++
1
2
3
4
5
6
7
 pthread_t thread1, thread2;
    b.begin = 0;
    b.end = str.size()/2 ;
    pthread_create(&thread1,NULL,crypto,(void *)&b);
    c.begin = str.size()/2+1;
    c.end = str.size();
    pthread_create(&thread2,NULL,crypto,(void *)&c);
ikudesnik, ты в курсе, да, что итераторы работают подобно указателям? То есть, как и в указателях, значение итератора - адрес. А ты им пытаешься присваивать какие-то целые числа (результат целочисленного деления).

Цитата Сообщение от ikudesnik Посмотреть сообщение
Мне надо чтоб два потока параллельно шли
ikudesnik, никогда с потоками не работал. Насчёт распараллеливания помочь не могу.
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
06.02.2016, 22:36 5
Цитата Сообщение от gru74ik Посмотреть сообщение
Передавай в функцию вектор по ссылке, внутри функции меняй в нём всё, что тебе надо, и возвращай из функции ссылку на него же
Если уж передаётся ссылка на вектор, то зачем эту же ссылку и возвращать?
1
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
06.02.2016, 22:41 6
Цитата Сообщение от nd2 Посмотреть сообщение
Если уж передаётся ссылка на вектор, то зачем эту же ссылку и возвращать?
Для удобства.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
struct A {
    int get_value() const { return 123; }
};
 
std::ostream & operator << ( std::ostream & os, const A & a )
{
    return os << a.get_value();
}
 
int main() {
    A a;
    std::cout << a << a << std::endl;
}
2
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
06.02.2016, 22:41 7
Си-вэй: передавать все что надо только читать - в зависимости от величины типа, все что надо менять - по указателям, а возвращать инт - кот ошибки, 0 если все хорошо.
0
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
06.02.2016, 22:46 8
Цитата Сообщение от _Ivana Посмотреть сообщение
Си-вэй
_Ivana, хорош людей с пути истинного совращать, возмутитель спокойствия
Раздел-то С++, а не Си!
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
06.02.2016, 22:46 9
Цитата Сообщение от castaway Посмотреть сообщение
Для удобства.
castaway, ну тут другое. Если правильно понимаю, тут ссылка на поток возвращается, чтобы цепочку из операторов << можно было сделать.
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
06.02.2016, 22:49 10
gru74ik, не нравится c-way - пишите сразу как casta-way: через классы, поля и методы А то сначала указателей на указатели нарисуют а потом спрашивают как из функций сложные объекты возвращать - вон в соседней теме некто тоже хочет двумерный массив вернуть
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
06.02.2016, 22:51 11
Цитата Сообщение от nd2 Посмотреть сообщение
тут ссылка на поток возвращается, чтобы цепочку из операторов << можно было сделать.
Верно. А вы о чём?

Добавлено через 1 минуту
Цитата Сообщение от _Ivana Посмотреть сообщение
Си-вэй: передавать все что надо только читать - в зависимости от величины типа, все что надо менять - по указателям, а возвращать инт - кот ошибки, 0 если все хорошо.
Если это мне, то я плохо понял что вы имеете в виду.
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
06.02.2016, 22:51 12
Цитата Сообщение от castaway Посмотреть сообщение
А вы о чём?
Я о том, что зачем возвращать из функции вектор, который передаётся по ссылке?
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
06.02.2016, 22:51 13
Для удобства последовательной композиции методов через точку надо конечно возвращать ссылки на объекты, все правильно.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
06.02.2016, 22:53 14
_Ivana, nd2, просто объект проходит "транзитом", всё нормально.

Добавлено через 52 секунды
Цитата Сообщение от nd2 Посмотреть сообщение
Я о том, что зачем возвращать из функции вектор, который передаётся по ссылке?
Для тех же целей.
1
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
06.02.2016, 22:56 15
castaway, нет, не Вам, пока постил вы написали свой пост. Это вслух про то, что можно не возвращать передаваемую ссылку и что это даже идиоматично в том ключе, который я привел в пример.

Добавлено через 2 минуты
castaway, да все понятно про объект и транзит. Просто в Си нет методов - поэтому там не так удобно будет, поэтому там си-вэй Хотя можно функцию от функции от .... и т.д., но это не так наглядно. Поэтому там сначала создается исходная структура, а потом она меняется процедурами пока ошибка не выскочит или до конца не дойдем.
1
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
06.02.2016, 22:56 16
Цитата Сообщение от _Ivana Посмотреть сообщение
что можно не возвращать передаваемую ссылку
Можно возвращать, а можно не возвращать. Это как программисту удобнее.
0
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
06.02.2016, 22:56 17
Цитата Сообщение от castaway Посмотреть сообщение
просто объект проходит "транзитом", всё нормально.
В общем-то, да, может и так понадобится, например, если делать вызов такой функции в параметрах другой, которая принимает ссылку на вектор.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
06.02.2016, 22:57 18
Цитата Сообщение от _Ivana Посмотреть сообщение
Просто в Си нет методов
Функция-член - аналог метода, насколько мне известно.
Кстати, при чём тут Си?)
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
07.02.2016, 01:11 19

Не по теме:

Сорри, отходил на каток :)


Си просто упомянулся как пример подхода невозвращения переданных ссылок. Хотя и там конечно так можно делать, но все эти функции-члены и указатели на функции обработки других полей структуры как поля этой же структуры выглядят несколько неортодоксально.
0
07.02.2016, 01:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.02.2016, 01:11
Помогаю со студенческими работами здесь

Как вернуть массив из функции?
Please! #include &lt;iostream&gt; using namespace std; int _plus1 (int array ) { for (int...

Как вернуть массив из функции?
В общем есть функция: ? foo() { array&lt;array&lt;double, N&gt;, 10&gt; Wave; .... return ?; } Как...

Как вернуть массив из функции?
у меня есть две функции: Одна должна возвращать три числа, а вторая двумерный массив 10Х10; Как...

Как вернуть массив из функции?
не могу передать массив из функции mas(). Как передать массив из функции и записать в массив arr()?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru