Pthread struct аргумент с void * - PullRequest
0 голосов
/ 19 октября 2018

Hy,

Мне было интересно, возможно ли что-то подобное без использования кучи (malloc / calloc). Предположим, у меня есть такая структура:

typedef struct {
  void* par1_;
  void* par2_;
}parameters;

и еще одна дляposition:

typedef struct {
  short x;
  short y;
}position;

Эта функция вызывается потоком.

void* car(void* arg)
{
   parameters car_type = *((parameters*) arg);
   int first_par = *(int*)&car_type.par1_;
   int second_par = *(int*)&car_type.par2_;   // can I do this?
   //if yes how do I extract now values from position struct "pos.x and pos.y" 
}

В моем основном потоке я хочу отметить позицию в структуре "position", назначить эту структуруко второму параметру "par2_", а затем отправьте его моей функциональной машине.

int main()
{
  parameters pars;
  position pos;

  pos.x = 44;
  pos.y = 25;

  pars.par1_ = (void*) CAR_TYPE; // Global Variable
  pars.par2_ = &pos;   // not sure about this?

  pthread_t tid;
  pthread_create(&tid, NULL, car, (void*) &pars);

  pthread_join(tid, NULL);

Извините, если это глупый вопрос.Очевидно, я новичок во всем этом.Еще раз, я не хочу использовать кучу.Это минимальный пример моей программы.

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Не уверен, что вы спрашиваете, поэтому я дам вам стандартный совет, который, похоже, относится к ситуации.

Время жизни

Будьте очень осторожны при передаче указателей на стек памяти.Всегда помните об этих трех вещах:

  1. Для чего будет использоваться указатель?
    Для чего он будет использоваться?Какие функции в конечном итоге с этим?Вам нужно знать это, чтобы иметь дело со следующими двумя точками.
  2. Где будет храниться указатель?
    Если указатель никогда не покидает стек, это нормально.Если указатель хранится в памяти кучи, которая может пережить кадр стека, включаются сигналы тревоги. Если указатель переживает фрейм стека, то для курса является пугающим неожиданное повреждение данных. Не допускать этого.
  3. Когда будет использоваться указатель?
    Что-нибудь в иливызывается стековым фреймом, в котором память используется впервые - ОК.Что-нибудь выше этого, и память не твоя, чтобы играть с.Удостоверьтесь, что вы никогда НИКОГДА КОГДА-ЛИБО НИКОГДА не возвращаете указатель на стековую память, которую вы только что получили.

Для повторения:

Делайте:

#include <stdio.h>

int main(int argc, char *argv[]) {
    int nums = {12, 630, 43, 0};
    printf("%d", sum(nums));
}

int sum(int *num_pointer) {
    int count = 0;
    for (; *num_pointer; num_pointer += 1) {
        add(&count, *num_pointer);
    }
    return count;
}

void add(int *a, int b) {
    *a += b;
}

Не:

int main(int argc, char *argv[]) {
    print_int(get_int(7));
}

int *get_int(int value) {
    return &value;
}

void print_int(int *num) {
    printf("%d", *num);
}

Кроме того, не читайте, когда вам не нужно.Это большой знак, указывающий на плохой дизайн программы;рассмотрите возможность его пересмотра.

0 голосов
/ 19 октября 2018

Я думаю, вы хотите что-то более похожее на это;

void* car(void* arg)
{
   parameters car_type = *((parameters*) arg);
   int first_par = car_type.par1_; // This is CAR_TYPE is it really an int?
   position *second_par = (position *)car_type.par2_; 

   second_par->x, second_par->y;
}

Хотя вы можете просто захотеть изменить структуру параметров, чтобы включить типы, которые вы действительно хотите.

typedef struct {
  int par1_;
  position* par2_;
}parameters;
void* car(void* arg)
{
   parameters car_type = *((parameters*) arg);
   int first_par = car_type.par1_; // This is CAR_TYPE is it really an int?
   car_type.par2_->x; //access like this
}
...