从const void *转换为float数组

时间:2012-04-30 16:56:55

标签: c++ pointers casting rtos

我正在为mbed平台使用rtos库。我希望能够跳进线程,以恒定速率递增某个值,然后在线程结束时关闭线程。问题是从mbed RTOS库实现Thread的方法只能采用const void *参数。 这不会是一个大问题,除了我需要发送一个浮点值数组,其中一个值是指向我需要递增的值的指针(*joint),而其他值可以只是{{1控制增量的范围和速度。我以为我控制了它并在这里发现了一些整齐的代码以便正确投射,但我仍然提出0值:const

这是代码,只减少参与线程工作的两个函数。

//float (*vals)[4] = (float (*)[4])args;

提前感谢您指出正确方向的任何事情!

5 个答案:

答案 0 :(得分:2)

我建议为你的Thread args定义一个结构,而不是试图通过void *传递一个args列表,每个arg都有一个字段。填写它,然后将结构的地址作为void *。

传递

答案 1 :(得分:2)

从风格上讲,我建议使用结构将此信息传递给您的线程。这将使您的代码更具可读性并在某种程度上清除语法。

struct thread_args {
   float * joint;
   float inc;
   float target;
   int speed;
};

答案 2 :(得分:2)

我绝对是从jlunavtgrad,Pat和Burton Samograd偷了这个。我觉得他们的所有三个答案都真正回答了OP。

  1. 使用表示要传递给新线程上下文的参数的结构来更好地管理它。

  2. args数组位于堆栈上,并以thread_inc的范围为界。通过用结构替换它,您仍然无法解决此处涉及的范围问题。因此,需要以另一个线程上下文可以正确使用它们的方式分配参数(以任何形式) - 这可以通过全局或堆上完成。

  3. float *joint的{​​{1}}参数被解除引用,该值用于填充参数。这似乎不是所需的行为,因为只会修改参数数组中复制的值。

  4. 代码中建议的修改:

    thread_inc

    与此解决方案相关的最终建议不是在原始表单中使用struct thread_args { float * joint; float inc; float target; int speed; }; void increment( void const *args ) { thread_args* threadArgs = static_cast<thread_args*>( args ); float *joint = threadArgs->joint; float inc = threadArgs->inc; float target = threadArgs->target; int speed = threadArgs->speed; float start = 0.5; if( inc < 0 ){ for( *joint = start; *joint > target; *joint+=inc ) { wait( 0.1 / speed ); } } delete threadArgs; } void thread_inc( float *joint, float inc, float target, int speed ){ thread_args* threadArgs = new thread_args; threadArgs->joint = joint; threadArgs->inc = inc; threadArgs->target = target; threadArgs->speed = speed; //Thread move( increment, args ); Thread move( increment, threadArgs ); return; } new,而是使用类似的智能指针,例如delete

答案 3 :(得分:1)

您正在堆栈上创建args数组,因此在创建线程时,它会在函数返回时超出范围。你应该使用new / malloc分配args数组,初始化它然后将它传递给移动线程。完成移动线程后,您可以释放阵列。另一种选择是创建在调用函数中传递给thread_inc的数组。

答案 4 :(得分:1)

在将*关联传递给递增函数时,您将取消引用*关节,以便该函数永远不会更新该值。

试试这个:

void increment( void const *args ) { //float *joint, float inc, float target, int speed ) 
    //float (*vals)[4] = (float (*)[4])args;
    float *vals = (float* )args;

    // joint is the outside value I want to increment
    float *joint  = (float *)vals[0];
    float inc    = vals[1];
    float target = vals[2];
    int   speed  = (int)vals[3];
    float start = 0.5;


    if( inc < 0 ) 
        for( *joint = start; *joint > target; *joint+=inc ) {
             wait( 0.1 / speed );
        }
    }


void thread_inc( float *joint, float inc, float target, int speed ){
    float args[4] = { (float)joint, inc, target, (float)speed };
    //Thread move( increment, args );
    Thread move( increment, &args );
    return;
}