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

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

Войти
Регистрация
Восстановить пароль
 
red_square
2 / 2 / 2
Регистрация: 07.10.2013
Сообщений: 48
#1

Ошибка при передаче двумерного массива в функцию std::thread - C++

07.06.2014, 16:31. Просмотров 702. Ответов 3
Метки нет (Все метки)

Здравствуйте! Написал программу на потоки, теперь нужно передать туда двумерный массив.
Пытаюсь передать по ссылке, но каждый раз выскакивает это сообщение:
error C2664: "void (int **,int,int)": невозможно преобразовать аргумент 1 из "int" в "int **"

Если кто-нибудь знает, как исправить, подскажите.
Заранее спасибо!

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
#include "stdafx.h"
#include <functional>
#include <stdio.h>
#include <thread>
#include <chrono>
#include <iostream>
#include <mutex>
#include <vector>
 
#define size 1000
 
int arr[size][size];
int sum;
int mid;
 
std::mutex                          g_lock;
std::mutex                          g_mutex;
std::vector<std::exception_ptr>     g_exceptions;
 
/* Функция, выполняющая поток */
void threadFunction(int** a, int begin_ct, int end_ct){
 
    std::cout << "Присоединяюсь к потоку " << std::this_thread::get_id() << std::endl;
    
    int z;
    int v;
    for (z = begin_ct; z <= end_ct; ++z){
        for (v = begin_ct; v <= end_ct; ++v){
            sum = sum + a[z][v];
        }
    }
    std::this_thread::sleep_for(std::chrono::seconds(rand() % 10));
    std::cout << "Покидаю поток " << std::this_thread::get_id() << std::endl;
 
}
 
/* Главная функция программы */
int _tmain(int argc, _TCHAR* argv[])
{
    int i;
    int j;
    /* Создание массива данных*/
    std::cout << "Программа находит среднее арифметическое двумерного массива из " << size << " x " << size<< " элементов";
    std::cout << "Статус программы:";
    for (i = 0; i <= size; i++){
        for (j = 0; j <= size; j++){
            arr[i][j] = rand() % (1000);
        }
    }
    std::cout << "Cоздание массива завершено";
 
    /* Создание потоков и передача данных в них*/
    std::thread thr1(threadFunction, std::ref(arr[i][j]), 0, size / 4);
    std::thread thr2(threadFunction, std::ref(arr[i][j]), size / 4, size / 2);
    std::thread thr3(threadFunction, std::ref(arr[i][j]), size / 2, 3 * size / 4);
    std::thread thr4(threadFunction, std::ref(arr[i][j]), 3 * size / 4, size);
 
    /* Присоединение к потокам */
    thr1.join();
    thr2.join();
    thr3.join();
    thr4.join();
    return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2014, 16:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка при передаче двумерного массива в функцию std::thread (C++):

Ошибка при передаче двумерного массива в функцию - C++
Помогите пожалуйста, никак не могу разобраться. Я хочу чтобы функция createBlankGameField() ввела данные в массив gameField созданный в...

Ошибка при передаче двумерного массива в функцию - C++
cannot convert 'int (*)' to 'int**' for argument '1' to 'void func(int**, int, int)' #include&lt;iostream&gt; using namespace std; ...

Ошибка при передаче в функцию указателя на элемент массива - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;cstdlib&gt; #include &lt;cmath&gt; const int n = 20; int...

Трабл в передаче двумерного массива в функцию! - C++
--------------------- void input (int **a, int n, int m); void output (int **a, int n, int m); --------------------- int _tmain(int...

Написать процедуру для суммирования матриц. Ошибка при передаче массива в функцию - C++
Помогите пожалуйста! Дано задание: Написать процедуру для суммирования матриц. С ее помощью сложить исходную матрицу и...

Ошибка при создании потока std::thread - C++
Внутри класса есть функция void move(); Нужно, чтобы она работала в отдельном потоке. Проблема : неправильно указываю параметры....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
07.06.2014, 16:35 #2
Ты передаешь в поток ссылку на элемент массива, а пытаешься получить двойной указатель.

Добавлено через 1 минуту
+ в 47-й строке выход за пределы массива.
0
red_square
2 / 2 / 2
Регистрация: 07.10.2013
Сообщений: 48
07.06.2014, 16:39  [ТС] #3
Спасибо за ответ! Теперь я передаю не элемент массива, а весь массив( std::ref(arr) ), но выдаёт уже другую ошибку: "error C2090: функция возвращает массив". Как её устранить?
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
07.06.2014, 16:53 #4
Попробуй убрать std::ref.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.06.2014, 16:53
Привет! Вот еще темы с ответами:

Ошибка компиляции "no instance of constructor 'std::thread::thread' matches the argument list" - C++
Не могу сообразить почему возникает ошибка. У меня в классе есть метод, который должен работать в нескольких потоках одновременно. Вот он: ...

Ошибка при передаче в функцию - C++
Хочу передать в функцию строку и там ее заполнить, подчеркивает void karta(MyStruct s.karta,int size); И пишет: 1 IntelliSense:...

Ошибка при передаче параметра в функцию - C++
В ДЗ есть пример кода, помогите пожалуйста исправить, до работающего варианта (VS2015). Ошибки: (32) error C2660: strcpy_s: функция не...

Мусор в элементах массива при передаче в функцию - C++
Доброго времени суток, столкнулся с данной проблемой в CLI, попробовал реализовать аналог для консольного приложения всё работает, почему...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
07.06.2014, 16:53
Ответ Создать тему
Опции темы

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