Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Передача в поток многомерных массивов по указателю - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Ошибка при обращении к классу http://www.cyberforum.ru/cpp-beginners/thread1816651.html
Есть класс для хранения элементов, к которым должен быть доступ из других классов - решил объявить как глобальный: Items.h: class Items { public: Item potion;//...etc Items() : ...
C++ передача функции указателей Сап, помогите пожалуйста разобраться с передачей указателей функции. Нужно для матрицы A (4×5) определить количество строк, сумма элементов которых положительна, нужно сделать через функции void. И... http://www.cyberforum.ru/cpp-beginners/thread1816644.html
Составить алгоритм подсчитывающий количество недель - C++ C++
количеству с n дней соответствует линейная таблица элементов, в рабочий день обозначено - 1, а нерабочий - 0. Составить алгоритм который считает: а) количество недель в месяце Примечание: Неделей...
Игра в закрашивание клеток C++
Двое ребят на клетчатом листе бумаги N × M клеток играют в такую игру: они по очереди закрашивают клетки (изначально все клетки не закрашены). За ход разрешается закрасить 1, 2, 3 или 10 любых ещё не...
C++ Класс С++ ошибка http://www.cyberforum.ru/cpp-beginners/thread1816618.html
Помогите устранить ошибку Может проблемы в переменных ( такие же переменные я использовал в другом классе) Еще думаю что проблема в пространстве имен Надеюсь поможете и объясните
C++ Вычислить значение выражения совершенно не знакома с C++ но дали задание написать код, помогите пожалуйста.... подробнее

Показать сообщение отдельно
DrOffset
7312 / 4412 / 999
Регистрация: 30.01.2014
Сообщений: 7,245
30.09.2016, 19:16
Kapex, ну например так:
C++
1
2
3
4
5
6
7
8
9
10
11
size_t const size1 = 4;
size_t const size2 = 5;
 
void worker (int (*array2d)[size2], int size1){
      
       for (int i = 0; i < size1; ++i)
            for (int j = 0; j < size2; ++j)
                  read_and_process(array2d[i][j]);
 
      /* do usefull stuff */
}
C++
1
pollThreads.push_back(thread(worker, arr2d, size1));
Но в целом все зависит от конечной цели. В том числе и "правильность".

Добавлено через 45 минут
Kapex, в принципе, если бы мне понадобилось (если бы) что-то подобное, то я бы сделал так:
Кликните здесь для просмотра всего текста
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
template <typename T>
class LightArray2d
{
public:
    LightArray2d(size_t r, size_t c)
        : m_rows(r)
        , m_columns(c)
        , m_data(new T[r * c])
    { }
    LightArray2d(LightArray2d && x)
        : m_columns(x.m_columns)
        , m_rows(x.m_rows)
        , m_data(std::move(x.m_data))
    { }
    
    T * operator[](size_t i)
    {
        return &m_data[i * m_columns];
    }
    T const * operator[](size_t i) const
    {
        return &m_data[i * m_columns];
    }
    
    T const & operator()(size_t i, size_t j) const
    {
        return m_data[i * m_columns + j];
    }
    T & operator()(size_t i, size_t j)
    {
        return m_data[i * m_columns + j];
    }                          
                      
    size_t columns() const
    {
        return m_columns;
    }
    size_t rows() const
    {
        return m_rows;
    }
    
    T * begin() 
    { 
        return &m_data[0]; 
    }
    T * end() 
    { 
        return &m_data[m_rows * m_columns]; 
    }
    T const * begin() const
    { 
        return &m_data[0]; 
    }
    T const * end() const
    { 
        return &m_data[m_rows * m_columns]; 
    }
   
private:
    size_t const m_rows;
    size_t const m_columns;
 
    std::unique_ptr<T[]> m_data;
};

или так (если размерности известны на этапе компиляции):
Кликните здесь для просмотра всего текста
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
// Версия без динамической памяти (для размеров, известных на этапе компиляции)
template <typename T, size_t R, size_t C>
class LightArray2d
{
public:
    T * operator[](size_t i)
    {
        return &m_data[i * C];
    }
    T const * operator[](size_t i) const
    {
        return &m_data[i * C];
    }
    
    T const & operator()(size_t i, size_t j) const
    {
        return m_data[i * C + j];
    }
    T & operator()(size_t i, size_t j)
    {
        return m_data[i * C + j];
    }                          
                      
    size_t columns() const
    {
        return C;
    }
    size_t rows() const
    {
        return R;
    }
    
    T * begin() 
    { 
        return &m_data[0]; 
    }
    T * end() 
    { 
        return &m_data[R * C]; 
    }
    T const * begin() const
    { 
        return &m_data[0]; 
    }
    T const * end() const
    { 
        return &m_data[R * C]; 
    }
   
private:
    std::array<T, R * C> m_data;
};

И потом спокойно бы работал с этим так:
Кликните здесь для просмотра всего текста
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
//void worker(LightArray2d<int, 5, 6> const & array2d)
void worker(LightArray2d<int> const & array2d)
{
    // var [1] 
    for(size_t i = 0; i < array2d.rows(); ++i)
    {
        for(size_t j = 0; j < array2d.columns(); ++j)
        {
            // Это исключительно для визуализации, конечно же в реальности из потока в консоль лучше ничего не писать.
            std::cout << array2d[i][j] << ' '; 
        }
    }
    std::cout << std::endl;
    // var [2]
    for(size_t i = 0; i < array2d.rows(); ++i)
    {
        for(size_t j = 0; j < array2d.columns(); ++j)
        {
            std::cout << array2d(i, j) << ' ';
        }
    }
    std::cout << std::endl;
    // var [3]
    for(int a : array2d)
    {
        std::cout << a << ' ';
    }
    /* do usefull stuff */
}
 
int main() {
    LightArray2d<int> arr2d(5, 6);
    //LightArray2d<int, 5, 6> arr2d;
    
    /* fill in the arr2d*/
    int c = 0;
    std::generate(arr2d.begin(), arr2d.end(), [&c](){ return ++c; });
    
    enum { ThreadsCount = 1 }; // 1, чтобы в демопримере не испортить вывод.
    
    vector<thread> poolThreads;
    for(int iThread = 0; iThread < ThreadsCount; iThread++)
    {
        poolThreads.emplace_back(thread(worker, std::ref(arr2d)));
    }
    
    for(int iThread = 0; iThread < ThreadsCount; iThread++)
    {
        poolThreads[iThread].join();
    }
}

Онлайн демопример: http://rextester.com/QSCDC23483
4
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru