如何将结构属性作为参数传递
How to pass struct attributes as arguments
我正在尝试将结构部分传递给函数,这可能吗?
我想创建像下面的 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;
}
}
刚刚
robot my_robot;
setLeftMotorSpeed(&speed, &my_robot.leftMotorSpeed, &rightMotorSpeed);
这将起作用并设置 my_robot.leftMotorSpeed
的值,因为您显然需要它。
chooseRequest()
函数必须使用指向 robot
的指针才能修改它。
正如所写,您只是在修改一个本地副本,该副本在函数退出时不再存在。
如果您只是将指针传递给结构并让函数修改它需要修改的字段,您的代码将会更简单。如果函数需要从多个机器人获取信息,则只传递单个字段(或指向它们的指针)。您的 setLeftMotorSpeed
函数可能类似于:
void setLeftMotorSpeed(robot *rptr, int speed)
{
rptr->leftMotorSpeed = speed;
}
当然,这是一个微不足道的例子。 moveAtSpeed
函数也可能使用机器人指针,如果该函数的目的是仅移动一个特定的机器人。
顺便说一句,这是面向对象思想的开始。您已经构建了一个结构来描述机器人。下一步是将作用于其中一个机器人结构的函数视为对整个机器人的逻辑操作,这样就可以编写请求机器人 "speed up" 的代码,而不必担心逐位细节如何做到这一点。
PS:不推荐使用 command
的指针。简单的只读值应作为普通参数传递。每次使用 "dereference" 指针都需要额外的时间和代码,并且不需要额外的源代码复杂性。这是一个很小的差异,但是在整个程序中这样做的累积效果可能很显着。
我正在尝试将结构部分传递给函数,这可能吗?
我想创建像下面的 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;
}
}
刚刚
robot my_robot;
setLeftMotorSpeed(&speed, &my_robot.leftMotorSpeed, &rightMotorSpeed);
这将起作用并设置 my_robot.leftMotorSpeed
的值,因为您显然需要它。
chooseRequest()
函数必须使用指向 robot
的指针才能修改它。
正如所写,您只是在修改一个本地副本,该副本在函数退出时不再存在。
如果您只是将指针传递给结构并让函数修改它需要修改的字段,您的代码将会更简单。如果函数需要从多个机器人获取信息,则只传递单个字段(或指向它们的指针)。您的 setLeftMotorSpeed
函数可能类似于:
void setLeftMotorSpeed(robot *rptr, int speed)
{
rptr->leftMotorSpeed = speed;
}
当然,这是一个微不足道的例子。 moveAtSpeed
函数也可能使用机器人指针,如果该函数的目的是仅移动一个特定的机器人。
顺便说一句,这是面向对象思想的开始。您已经构建了一个结构来描述机器人。下一步是将作用于其中一个机器人结构的函数视为对整个机器人的逻辑操作,这样就可以编写请求机器人 "speed up" 的代码,而不必担心逐位细节如何做到这一点。
PS:不推荐使用 command
的指针。简单的只读值应作为普通参数传递。每次使用 "dereference" 指针都需要额外的时间和代码,并且不需要额外的源代码复杂性。这是一个很小的差异,但是在整个程序中这样做的累积效果可能很显着。