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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Linux Не срабатывает конструктор класса http://www.cyberforum.ru/cpp-beginners/thread1816044.html
Доброго времени суток. Есть код: #include <iostream> #include <string> #include <vector> #include <readline/readline.h> #define _exit "EXIT" #define hello "Welcome!" #define enter_command "\n Please, enter a command and it's arguments" using namespace std;
C++ Linux Тема диплома бакалавра Добрый вечер. В 2017 г. получаю бакалавра в МГТУ по направлению "информационная безопасность". Есть желание писать диплом не ради диплома, а чтобы это было мне полезно сейчас и для карьеры в будущем. Что-то не могу придумать ничего нормального. Натолкните пожалуйста хоть примерно на тему дипломной работы по инфо без, чтоб это было актуально. Интересны сетевые технологии, linux http://www.cyberforum.ru/cpp-beginners/thread1815700.html
C++ Linux Вывод только гласных букв слова
Подскажите как мне сделать так, чтобы программа выводила только гласные буквы слова?
Не компилируется cpp в терминале C++ Linux
Нет такого файла или каталога.
C++ Linux Смена компилятора http://www.cyberforum.ru/cpp-beginners/thread1810142.html
Добрый вечер, уважаемые форумчане! Очень надеюсь на вашу помощь! В чем проблема: Пришлось перейти на виртуальной машине c ubuntu на astralinux. Причем, на ubuntu был установлен компилятор gcc 4.6, а на astralinux уже установили 4.7.2. Попробовав собрать абсолютно рабочий проект в новой виртуалке, получили неутешительный результат. Появились ошибки при преобразовании указателей к инту. Которых...
C++ Linux Разработать программу удаления лишних пробелов во введенной пользователем строке Здравствуйте, помогите пожалуйста слабому полу:help: Может у кого то есть готовое??? 1. Составить программу на C/C++ согласно варианту задания. Программа должна со-стоять минимум из двух исходных модулей (.c или.cpp). Все входные данные в программу вводить в виде аргументов командной строки. Собрать программу, используя компилятор gcc. 2. Использовать какой-либо отладчик для трассировки... подробнее

Показать сообщение отдельно
DrOffset
6851 / 4062 / 927
Регистрация: 30.01.2014
Сообщений: 6,859
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
 
Текущее время: 23:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru