Указатель внутри структуры / потока - PullRequest
0 голосов
/ 23 декабря 2010


У меня есть это предупреждение "предупреждение: назначение из несовместимого типа указателя" в этой строке:

data1->transformed_block[l] = &transformed_block[l];

-

void print_message_function ( void *ptr )  
{  
  dt *data;  
  data = (dt *) ptr;  
  printf("Dentro da thread Numero0: %ld\n", data->L_norm_NewBlock);  
  pthread_exit(0);  
}  

typedef struct data_thread  
{  
    long L_norm_NewBlock;  
    int Bsize_X;      
    int Bsize_Y;  
    int *transformed_block[MAX_LEVEL];  
    long L_norm_OrigBlock;      
} dt;  

void function()  
{  
  int *transformed_block[MAX_LEVEL];  
  pthread_t thread1;  
  dt *data1;  
  pthread_attr_t attr;  
  pthread_attr_init(&attr);

  //Fills structure  
  data1 = (dt *) malloc(sizeof(dt));    
  data1->transformed_block[l] = &transformed_block[l];

  data1->L_norm_NewBlock=0;  
  data1->Bsize_Y = Bsize_Y;  
  data1->Bsize_X = Bsize_X;  

  pthread_create(&thread1, &attr, (void *) &print_message_function, (void *) &data1);  
}

Я хочу избавиться от этого предупрежденияи значения, которые я получаю внутри потока, неверны.Например, data1-> L_norm_NewBlock = 0;в потоке подсказывает мне другое значение (не 0, как должно быть).

Ответы [ 3 ]

1 голос
/ 23 декабря 2010

Что такое transmed_block?Предполагая, что это то же самое, что и переменная, определенная в структуре, вы пытаетесь присвоить адрес l-го элемента (указатель на указатель int) на l-й элемент data1-> transformed_block (указатель на int).

data1->transformed_block[l] = &transformed_block[l];
// int* = &(int*)

Разве вы не пытаетесь просто помочь?

data1->transformed_block[l] = transformed_block[l];
0 голосов
/ 23 декабря 2010

У вас есть массив указателей на int в вашей структуре, который объявлен как локальная переменная в вашей функции, однако вы никогда не назначаете его, чтобы указывать на что-либо.

Если вы пытаетесь использовать локальный массив в функции (), вы должны объявить int transform_block [MAX_LEVEL], а не int * transform_block [MAX_LEVEL]. Это должно убрать предупреждение.

void function()
{
int transformed_block[MAX_LEVEL]; pthread_t thread1;
// * removed from above line
dt *data1;
...
0 голосов
/ 23 декабря 2010

Значения внутри потока в порядке.Я удалил & в функции

pthread_create (& thread1, & attr, (void *) & print_message_function, (void *) & data1);, (void *) & print_message_function, (void *) data1);

Но я до сих пор не избавился от этого предупреждения ...

...