如何将struct属性作为参数传递

时间:2015-01-28 15:26:58

标签: c struct

我正在尝试将结构部件传递给函数,这可能吗? 我想创建如下setLeftMotorSpeed之类的通用函数并将它们传递给我想要的任何东西,在这种情况下我需要通过指针设置robot.leftMotorSpeed

示例:

typedef struct
{
    int maximumSpeed;
    int leftMotorSpeed;
    int rightMotorSpeed;
    int timesAboveMaximumSpeed;
    int batteryLevel;
    int collisions;

}robot;

void setLeftMotorSpeed(int *speed, int *leftMotorSpeed, int *rightMotorSpeed)
{
    *leftMotorSpeed = *speed;
}

void chooseRequest(int *command, int *speed, robot RP6)
{
    switch(*command)
    {
        case 1:
            setMaximumSpeed(speed, &RP6.maximumSpeed);
            break;
        case 2:
            getMaximumSpeed(speed, &RP6.maximumSpeed);
            break;
        case 3:
            setLeftMotorSpeed(speed, &RP6.leftMotorSpeed, &RP6.rightMotorSpeed);
            moveAtSpeed(RP6.leftMotorSpeed, RP6.rightMotorSpeed);       
            break;
        case 4:
            setRightMotorSpeed(speed, &RP6.leftMotorSpeed, &RP6.rightMotorSpeed);
            moveAtSpeed(RP6.leftMotorSpeed, RP6.rightMotorSpeed);
            break;
        case 5:
            break;
        case 6:
            break;
        case 7:
            break;
        default:
            break;
    }
}

3 个答案:

答案 0 :(得分:3)

只需

robot my_robot;

setLeftMotorSpeed(&speed, &my_robot.leftMotorSpeed, &rightMotorSpeed);

这将起作用并设置my_robot.leftMotorSpeed的值,因为你显然需要它。

答案 1 :(得分:2)

chooseRequest()函数必须指向robot,以便能够修改它。

如上所述,您只需修改函数退出时不再存在的本地副本。

答案 2 :(得分:1)

如果只是将指针传递给struct并让函数修改它需要的字段,那么代码会更简单。如果函数需要从多个机器人中提取信息,则只传递单个字段(或指向它们的指针)。您的setLeftMotorSpeed函数可能类似于:

void setLeftMotorSpeed(robot *rptr, int speed)
{
    rptr->leftMotorSpeed = speed;
}

当然,这是一个微不足道的例子。 moveAtSpeed函数也可能使用机器人指针,如果该函数的目的是仅移动一个特定的机器人。

顺便提一下,这是面向对象思维的开端。您已经构建了一个描述机器人的结构。下一步是将作用于其中一个机器人结构的函数视为整个机器人的逻辑运算,以便请求机器人的代码加速"可以编写,而不必担心如何完成的逐位细节。

PS:不建议使用指针command。简单的只读值应作为普通参数传递。每次使用都需要额外的时间和代码才能解除引用"一个指针,并不需要额外的源代码复杂性。这是一个很小的差异,但在整个程序中这样做的累积效果可能很大。