【问题标题】:Pointer inside a struct / thread结构/线程内的指针
【发布时间】:2010-12-23 16:28:08
【问题描述】:


我有这个警告“警告:来自不兼容的指针类型的赋值 " 在这一行:

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 )。

【问题讨论】:

  • 请使用 {} 按钮格式化您的代码。
  • 我不知道transformed_block(不在结构中的那个)是在哪里声明的。是全球性的吗?它是什么类型的?

标签: c multithreading pointers data-structures pthreads


【解决方案1】:

什么是 transform_block ?假设它与结构中定义的变量相同,您试图将第 l 个元素的地址(指向 int 指针的指针)分配给 data1->transformed_block 的第 l 个元素(指向 int 的指针)。

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

你不是想简单地做个屁吗?

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

【讨论】:

  • 与结构体中的变量相同。我不应该使用 & 给出地址,以便指针 data1->transformed_block[l] 指向该值吗?附言我如何像你的那样格式化代码?标签是什么?
  • @bruno 不,data1->transformed_block[l] 是指向 int 的指针,而不是指向数组元素的指针。按照 Rod 的建议去做,两个元素都会指向同一个 int
【解决方案2】:

您的结构中有一个 int 指针数组,并在函数中声明为局部变量,但是您从不将其分配为指向任何东西。

如果你想在 function() 中有一个本地数组,你应该声明 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;
...

【讨论】:

    【解决方案3】:

    线程内的值现在可以了。我删除了函数中的 &

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

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

    但我仍然没有摆脱那个警告......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 1970-01-01
      • 2012-04-22
      相关资源
      最近更新 更多