Проблема с передачей массивов структур в качестве аргументов в pthread_create - PullRequest
0 голосов
/ 03 апреля 2019

Я пишу небольшую программу управления шаговым двигателем, для которой мне нужен отдельный поток, который проверяет, требуется ли обновление какого-либо из двигателей.

Я застреваю, когда передаю свою структуру данных в pthread_create () и изменяю значение статуса test_motor2. Следующий код должен дать представление о том, чего я пытаюсь достичь:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

typedef struct motor{
    int motor_status; 
} motor;

typedef struct argstruct{
    int *vect;
    struct motor *allmotors;
} args;

void *test(void *arg){

    struct argstruct *arguments = arg;
    int *a_array = arguments->vect;
    a_array[0] = 80;

    // HERE I GET STUCK
    struct motor *motors = arguments->allmotors;
    // set test_motor2 status to 1

}

int main(){

    pthread_t sidethread;

    struct motor test_motor;
    struct motor test_motor2;
    test_motor.motor_status = 0;
    test_motor2.motor_status = 0;

    int a[3];
    a[0] = 8; a[1] = 3; a[2] = 2;

    struct motor *all_motors[2];
    all_motors[0] = &test_motor;
    all_motors[1] = &test_motor2;

    struct argstruct motors_and_a;
    motors_and_a.allmotors = all_motors;
    motors_and_a.vect = a;

    if (pthread_create(&sidethread, NULL, test, (void *)&motors_and_a)){
        printf("Thread could not be started\n");
    }

    pthread_join(sidethread, NULL);

    // Check that a[0] has been set to 80
    printf("a[0]: %d\n", a[0]);
    // Check that test_motor2 status is now 1
    printf("Status of test_motor2: %d\n", test_motor2.motor_status);

}

Пример работает для массива a, но я не могу заставить его работать для двигателей.

Не могли бы вы помочь мне с поиском решения?

Спасибо!

Макс

1 Ответ

1 голос
/ 03 апреля 2019

предупреждение о присвоении

 motors_and_a.allmotors = all_motors;

недопустимо, поскольку all_motors является motor* [2], а не motor*, как ожидается motors_and_a.allmotors, поэтому использование после не определено

Вы должны указать только один двигатель * вместо массива двигатель * или изменить определение argstruct наиметь struct motor **allmotors; и, конечно, его использование

Потому что

// HERE I GET STUCK
struct motor *motors = arguments->allmotors;
// set test_motor2 status to 1

Я полагаю, вы хотите:

typedef struct argstruct{
    int *vect;
    struct motor ** allmotors; /* MODIFIED */
} args;

void *test(void *arg){

    struct argstruct *arguments = arg;
    int *a_array = arguments->vect;
    a_array[0] = 80;

    struct motor ** motors = arguments->allmotors; /* MODIFIED */

    motors[1]->motor_status = 1; /* MODIFIED */

    return 0;
}

Остальное не изменилось.

Компиляция и выполнение:

pi@raspberrypi:~ $ gcc -g -pedantic -Wextra -Wall m.c -lpthread
pi@raspberrypi:~ $ ./a.out
a[0]: 80
Status of test_motor2: 1

выполнение под valgrind :

pi@raspberrypi:~ $ valgrind ./a.out
==4083== Memcheck, a memory error detector
==4083== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==4083== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==4083== Command: ./a.out
==4083== 
a[0]: 80
Status of test_motor2: 1
==4083== 
==4083== HEAP SUMMARY:
==4083==     in use at exit: 0 bytes in 0 blocks
==4083==   total heap usage: 2 allocs, 2 frees, 1,160 bytes allocated
==4083== 
==4083== All heap blocks were freed -- no leaks are possible
==4083== 
==4083== For counts of detected and suppressed errors, rerun with: -v
==4083== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 3)

Возврат также отсутствует в тест

...