С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ikudesnik
0 / 0 / 0
Регистрация: 02.08.2015
Сообщений: 123
#1

Разбить на потоки - C++

05.02.2016, 21:31. Просмотров 268. Ответов 4
Метки нет (Все метки)

Есть программа рабочая:
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
#include "stdafx.h"
#include <cctype>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <locale>
using namespace System;
 
const int row = 26;
const int col = 26;
const int len = 3;
char mas[row][col][len];
char mas_ascii[256];
 
int main() 
{
      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';
        }
 
        // Выводим на экран таблицу шифрования
 /* 
    for (int i=0; i<row; i++)
    {
        for (int j=0; j<col; j++)
            std::cout<<mas[i][j]<<" ";
        std::cout<<std::endl;
    }
*/
 
    //Заполняем таблицу с символами ASCII
     for (int i = 0; i < 256; ++i)
        {   
            mas_ascii[i] = Convert::ToChar(i);
        }
    //Выводим на экран массив ascii
/* 
    for (int i = 0; i < 256; ++i)
    {
    std::cout << i << " " << mas_ascii[i]<< std::endl;
    }
*/
 
 
    //Открываем файл для чтение исходного текста
    std::vector <std::string> str;
    std::string buff;
    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);
        }   
 
/*
    for (int i = 0; i < str.size(); i++)
        {
            std::cout << str[i];
        }
    std::cout << std::endl;
*/
    std::vector <std::string> strresult;
    //Открваем файл для записи шифрованного текста
    std::ofstream ofs("out.txt");
    if(ofs.is_open())
    {       
        for (int i = 0; i < str.size(); 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;
                            ofs << mas[xx][yx];                        
                            strresult.push_back(mas[xx][yx]); 
                        }  
                        
                    }
                }
            }
 
        for (int i = 0; i < strresult.size(); i++)
            {
                std::cout << strresult[i];
            }
        std::cout << std::endl;
        ofs.close();
    }
    else
        std::cerr << "Unable to open file out.txt" << std::endl;
    std::system("pause");
    return 0;
}
Хочу разбить на потоки:
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
// ConsoleApplication4.cpp: главный файл проекта.
 
#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> *strresult;
std::vector <std::string> str;
 
struct bound { int begin ; int end ; } ;
 
void *crypto (void *param)
 
{
 
 
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;                       
                            strresult.push_back(mas[xx][yx]); 
                        }  
                        
                    }
                }
            }
return (void *) strresult; //возвращение результата
}
 
 
 
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';
        }
 
        // Выводим на экран таблицу шифрования
 /* 
    for (int i=0; i<row; i++)
    {
        for (int j=0; j<col; j++)
            std::cout<<mas[i][j]<<" ";
        std::cout<<std::endl;
    }
*/
 
    //Заполняем таблицу с символами ASCII
     for (int i = 0; i < 256; ++i)
        {   
            mas_ascii[i] = Convert::ToChar(i);
        }
    //Выводим на экран массив ascii
/* 
    for (int i = 0; i < 256; ++i)
    {
    std::cout << i << " " << mas_ascii[i]<< std::endl;
    }
*/
 
 
    //Открываем файл для чтение исходного текста
    
    
    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);
        }   
 
/*
    for (int i = 0; i < str.size(); i++)
        {
            std::cout << str[i];
        }
    std::cout << std::endl;
*/  
    
    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::ofstream ofs("out.txt");
    if(ofs.is_open())
    {       
        
        /*for (int i = 0; i < strresult.size(); ++i)
            {
                ofs << strresult[i];
            }
 
        for (int i = 0; i < strresult.size(); i++)
            {
                std::cout << 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;
}
Действую по аналогу:
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
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
int A[100], B[100] ; //два вектора
struct bound //структура, определяющая границы вычислений потоков
{ int begin ; int end ; } ;
//стартовая функция для обоих порожденных потоков
void * func (void *param)
{
bound *b = (bound *)param ; //преобразование из void* в bound*
int *sum ; //скалярное произведение
sum = new int ;
int i ; //счетчик для цикла
//вычисление скалярного произведения
for (i=b->begin, *sum=0 ; i<b->end ; i++) *sum += A[i]*B[i] ;
return (void *)sum ; //возвращение результата
}
int main()
{
int i ; //счетчик для цикла
int *sum1 ; //для получения результата вычислений первого потока
int *sum2 ; //для получения результата вычислений второго потока
bound b ; //границы вычислений для первого потока
9
bound c ; //границы вычислений для второго потока
for (i=0 ; i<100 ; i++)
{ //заполнение массивов А и В случайными числами от 0 до 10
A[i] = (int)(random()/(RAND_MAX/10)) ;
B[i] = (int)(random()/(RAND_MAX/10)) ;
}
//идентификаторы для созданных потоков
pthread_t thread1, thread2 ;
b.begin = 0 ; b.end = 50 ;
//создание первого потока, производящего вычисления от 0 до 50
pthread_create(&thread1,NULL,func,(void *)&b) ;
c.begin = 50 ; c.end = 100 ;
//создание первого потока, производящего вычисления от 50 до 100
pthread_create(&thread2,NULL,func,(void *)&c) ;
//ожидание завершения первого потока, в sum1 записывается адрес
//результата вычислений первого потока
pthread_join(thread1,(void **)&sum1) ;
//ожидание завершения второго потока
pthread_join(thread2,(void **)&sum2) ;
fprintf(stdout,"Скалярное произведение = %d",*sum1+*sum2) ;
delete sum1 ; delete sum2 ;
return 1 ;
}
Возникла проблемка :
C++
1
strresult.push_back(mas[xx][yx]);  // выражение должно иметь тип класса.
Может я вообще не то делаю, пожалуйста подскажи.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.02.2016, 21:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Разбить на потоки (C++):

Разбить программу на потоки - C++
Помогите пожалуйста разбить программу на потоки. Всего у нас три суммы в программе, т.е. должно быть три потока, которые в итоге выводят...

Что такое потоки ввода, потоки вывода? - C++
Здарова всем! Не так давно уже прогаю на С++ и все НИКАК не могу понять, что такое потоки ввода, потоки вывода..! вот допустим...

Потоки. - C++
Можете сказать что такое потоки и привести примеры на C++. P.S не надо давать ссылку на википедию.

Потоки - C++
Как именно применять многозадачность языка С++? Я тут где то прочитал что это потоки, но там не указывался метод использования. ...

Потоки - C++
Здравствуйте, помогите пожалуйста преподаватель сказал нужно добавить код в третьем потоке(thread3), чтобы событие не происходила пока не...

Потоки в C++ - C++
Господа, можете посоветовать хорошую книгу по потокам в C++ или мануалы какие-то что ли ? Не советуйте материал найденный в поисковике,...

4
Olej
144 / 138 / 16
Регистрация: 25.03.2012
Сообщений: 552
05.02.2016, 21:44 #2
Если это C++ (не C), то не нужно пользоваться POSIX API pthread_t (pthread_create() и др.), а пользуйтес классом thread (который C++ заимствовал из Boost).
0
ikudesnik
0 / 0 / 0
Регистрация: 02.08.2015
Сообщений: 123
05.02.2016, 21:51  [ТС] #3
C++
1
2
int *sum ;
sum = new int ;
можно ли идентично сделать с

C++
1
std::vector <std::string> *strresult;
Olej, а так работать не будет?
0
Olej
144 / 138 / 16
Регистрация: 25.03.2012
Сообщений: 552
05.02.2016, 22:35 #4
Цитата Сообщение от ikudesnik Посмотреть сообщение
можно ли идентично сделать с
А почему нет?
C++
1
vector<string> *strresult = new vector<string>( 20 );
Будет ли пример работать? Не знаю...
Нельзя выкладывать на просмотр такие большие куски кода, да ещё и плохо структурированного.
0
ikudesnik
0 / 0 / 0
Регистрация: 02.08.2015
Сообщений: 123
06.02.2016, 07:47  [ТС] #5
Olej, а в скобочках 20 что означает, сколько максимум строк можно положить в вектор?

Добавлено через 27 минут
В примере после объявления
C++
1
2
int *sum ;
sum = new int ;
производят операцию
C++
1
*sum+=A[i]*A[i] ;
а мне после объявления
C++
1
vector<string> *strresult = new vector<string>( 20 );
как провести операцию?
C++
1
strresult.push_back(mas[xx][yx]);
0
06.02.2016, 07:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2016, 07:47
Привет! Вот еще темы с ответами:

Потоки - C++
Есть такой файл: Andriy aa 1 2 3 Petro dd 1 1 1 Vasa rdg 5 5 88 Ivan n 5 5 5 И нужно определить такое имя, у которого есть...

Потоки - C++
Я нашел в интернете отличную статью про потоки и многопоточность и на её основе написал следующую программу: #include &quot;stdafx.h&quot; ...

Потоки - C++
Доброго времени суток! Задание такое Создание списка слов отсортированных по алфавиту (выбрать алгоритм с возможностью...

Потоки с++11 - C++
Подскажите, где почитать про потоки в новом стандарте плюсов


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.