将结构数组作为参数输入pthread_create

时间:2019-04-03 16:02:29

标签: c arrays pointers struct pthreads

我正在编写一个小的步进电机控制程序,为此我需要一个单独的线程来检查是否有任何电机需要更新。

在将数据结构传递到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 个答案:

答案 0 :(得分:1)

警告作业

 motors_and_a.allmotors = all_motors;

无效,因为all_motors不是motor* [2]所期望的motor*motors_and_a.allmotors,因此之后的使用具有未定义的行为。

您只需给出一个 motor * 而不是一个 motor * 数组,或者将 argstruct 的定义更改为具有{ {1}}及其使用

因为

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;
}
valgrind 下执行

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

test

中也缺少返回值