2016-10-13 4 views
0

Я хочу передать 2D-массив в мою функцию потока, которая должна иметь параметры (void * args). Когда я хочу итерации через массив в моей функции, я продолжаю приводить к следующей ошибке:Передача 2D-массива функции потока

подстрочное значение не является массивом, указателем или вектором sumArrays + = args [i] [j];

Я не уверен, как обойти это. Значения, переданные функции потока, также являются целыми числами.

Любая помощь была бы замечательной!

Благодаря

+3

Показать минимальный пример, который воспроизводит вашу проблему. – 2501

+1

При передаче в качестве параметра функции массив распадается на указатель на его первый элемент. Поэтому, если вы передаете массив как параметр 'args' потока, ваша функция потока должна назначить его переменной указателя, которая является указателем на тип элемента. Вместо того, чтобы напрямую передавать массив, вы можете использовать элемент типа 'struct', чтобы указать на него, и передать указатель на' struct' как 'args' вашего потока. Затем функция потока может передать ее соответствующему типу типа 'struct'. –

+0

Если вы используете 'pthreads', это отличный учебник. Даже если это не так, концепции одинаковы: https://computing.llnl.gov/tutorials/pthreads/ – yano

ответ

-1

Вместо использования struct, можно также создать локальную переменную с правильным типом:

#define ROWS 3 
#define COLS 3 

/* Sum the values in a 3x3 array. */ 
/* This would be your thread entry point. */ 
void sum(void *args) { 
    int (*array)[ROWS][COLS] = args; // Declare and initialize a pointer to a ROWSxCOLS array of ints. 

    int row; 
    int col; 
    int total = 0; 
    for(row = 0; row < ROWS; row++) { 
     for (col = 0; col < COLS; col++) { 
      total += (*array)[row][col]; // Access [row][col] from the array pointed to by "array". 
     } 
    } 

    (void) total; 
} 

int main(int argc, char** argv) { 
    int arrayIn[ROWS][COLS] = { 
     {0, 1, 2}, 
     {3, 4, 5}, 
     {6, 7, 8} 
    }; 

    sum(arrayIn); 
} 

struct раствор, предложенный @ Иан-Abbott имеет преимущество позволяет легко добавление более сложных данных, передаваемых вашему потоку (например, размеры массива).

Смежные вопросы