2015-10-16 3 views
-1

У меня есть упражнение, в котором я должен создать определенное количество pthreads для снятия шума с изображения, но у меня возникают проблемы с моими указателями. Каждый поток получает input_image, но затем все потоки должны быть способны записывать в тот же файл output_image. Вот те части, которые актуальны.Изменение содержания с помощью указателей

struct task{ 
    int start_row, stop_row, window_size; 
    image_matrix input_image; 
    image_matrix * output_image; //holds the address of the original output_matrix 
}; 

void* func(void* arg){ 
    task* t_arg = (task*)arg; 

    image_matrix& input = t_arg->input_image; 

    //image_matrix& output = t_arg->output_image; 
    image_matrix * matrix_address= t_arg->output_image; //<----- 

    for(int y = start; y<=stop; y++){ 
     for(int x=0;x<input.get_n_cols();x++){ 
      float filtered_value = median_filter_pixel(input, y, x, window_size); 
      *matrix_address.set_pixel(y,x,filtered_value); //<------2 
     } 
    } 
    pthread_exit(NULL); 
} 


    //This is how I set the output_image in main() but I'm pretty sure 
    //this is good. Filtered image is just 
    td[j].output_image = &filtered_image; 

Это дает нижеприведенную ошибку, но я не понимаю, почему. Значение, на которое указывает matrix_address, имеет тип image_matrix, поэтому он должен иметь все атрибуты image_matrix. Я пробовал все, что имеет смысл для меня, но ничего не работает. Также, когда я забираю оператор разыменования из строки с пометкой 2, он дает ту же ошибку, которая также не имеет смысла для меня.

request for member ‘set_pixel’ in ‘output_address’, which is of pointer 
    type ‘image_matrix*’ (maybe you meant to use ‘->’ ?) 
+1

Pthreads так заранее 2011 ... – user4581301

+2

Честно говоря, даже не заморачиваться с Pthreads. Вид ошибки, которую вы видите, является явным признаком того, что любая идея потока находится за пределами вашего уровня. Сожалею. – SergeyA

+0

У меня есть сильное чувство, что ваш output_image будет поврежден –

ответ

1

В C++, доступа к члену через . и вызов функции () как связать сильнее, чем указатель разыменования через *. Другими словами, код обрабатывается как:

*((matrix_address.set_pixel)(y, x, filtered_value)) 

Конечно, matrix_address является указателем и, как таковой, он не имеет членов доступа. Вам необходимо ввести круглые скобки:

(*matrix_address).set_pixel(y, x, filtered_value) 

Конечно, было бы очень утомительно писать. Вот почему C++ есть "оператор-член pointee доступа" а ->:

matrix_address->set_pixel(y, x, filtered_value) 
+0

OMG такое простое решение проблемы, за которое я так долго застрял. Он работал и вышел из строя. Спасибо. – Alex

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