我正在尝试在RobotC中编程高级功能,但是我不太确定自己是否做对了。我想指定我正在使用的电机端口,但是我为所有电机分配了名称。有趣的是,它们与常规变量并不完全相同。

例如,motor [port7]的替代名称是light_blue。 >
我不确定这些变量是新变量还是仅仅是规范。无论如何,这是变量的签名: />但是,对于int / motor混合变量/ unidentified,我不确定这样做的效果如何。还是完全没有。

#1 楼

#pragma更像是名称的#define,而不是变量声明。

您的代码非常接近;像这样的东西会很好;

#pragma config(Motor,  motorA,          light_blue,    tmotorNXT, PIDControl, encoder)

void testThing (tMotor  motor_name)
{
    motor[motor_name] = 20;   // set power to 20
}

task main()
{
    testThing(light_blue);
}


tmotor的实际类型是枚举(并且像int一样使用),其定义可以在RobotCintrinsics.c中找到。

用于示例;

#if (1)

  // the actual 'enum' values for 'tMotor' are automatically defined by the ROBOTC compiler. Each platform
  // and circuit board type has its own set of "enum names" and it was becoming too hard to manage them in
  // this file. So they are automatically configured by the compiler which has better utilities for managing
  // differences between platform types.

  typedef enum tMotor;

#else

    // The old definitions are temporarily maintained here as well until the new implementation is confirmed
  // to be working well!

  #if defined(NXT) || defined(TETRIX)

        typedef enum
        {
          motorA = 0,
          motorB = 1,
          motorC = 2,
          mtr_S1_C1_1 =  3,

    ... etc


如果我要看你的代码,并接受其功能为原义,则以下方法会起作用;

#pragma config(Motor,  motorA,          light_blue,    tmotorNXT, PIDControl, encoder)
#pragma config(Motor,  motorB,          light_green,   tmotorNXT, PIDControl, encoder)

void testThing (tMotor&  motor_name)
{
    tmotor_name = light_green;
}

task main()
{
    tmotor motor_to_use = light_blue;
    testThing(motor_to_use);
    motor[motor_to_use] = 20; // will actually move light_green since testThing function changed its value
}


很难猜出您实际上想做什么

评论


$ \ begingroup $
没错,但是我实际上需要了解单词类型之间的兼容性,因为tMotor不是类型,而只是规范。
$ \ endgroup $
–Genevieve
13年5月5日在18:47

$ \ begingroup $
没关系,tMotor可用作变量规范。谢谢! :D
$ \ endgroup $
–Genevieve
13年1月7日,下午1:45

#2 楼

我想我看到您很困惑,并且注意到电动机变量与常规变量有些不同是正确的。

#pragma config( )实际上为您做了很多繁重的工作,因为这是一个“预处理程序指令”。换句话说,在您编写的代码和编译器看到的代码之间存在一个隐藏的步骤—预处理。预处理程序是为什么您可以访问motor[ ]数组(在使用之前无需声明)的原因,以及为什么给motor分配值会导致您的实际电机运动(将“正常”变量)。预处理器生成的代码使您不必自己编写许多设置代码,但是它还使外观正常的变量可以执行某些意外操作。

在您的情况下,这是电动机配置您写的行:

#pragma config(Motor,  port7,           light_blue,    tmotorVex393, openLoop)


这告诉预处理器生成一些执行以下操作的代码:


声明变量类型为tMotor并将其存储在motor[light_blue]

motor[light_blue]的端口设置为port7

添加一个函数,当您将值分配给motor[light_blue]时,该函数将被直接转换为该值到Vex 393理解的功率电平信号(并在port7上输出该信号)。换句话说,使用开环控制而不是PID控制。这些名称都不正确。在代码中引用该电动机的正确方法是light_blue。换句话说,motor[port7]motor[light_blue]数组的索引。

Spiked3发布的代码将是设置函数的正确方法:

#pragma config(Motor,  motorA,          light_blue,    tmotorNXT, PIDControl, encoder)

void testThing (tMotor  motor_name)
{
    motor[motor_name] = 20;   // set power to 20
}

task main()
{
    testThing(light_blue);
}


评论


$ \ begingroup $
很好的猜测:)实际上motor []更像是一个输出端口数组。它是一个内置变量,由于#pragma而不生成。 light_blue只是一个索引。 RobotC的怪异编译之处在于motor [idx]与motor(idx)相同-且确实会造成混淆,因为样本是双向写入的。它是类似于“ C”的语言,但无论如何都不是纯粹的“ C”。
$ \ endgroup $
–秒杀3
13年1月5日,18:31



$ \ begingroup $
我同意motor是一个内置变量,但是我说的是它源自预处理器-并非特定于#pragma config()。它很可能是某个头文件的一部分,该头文件作为自动#include的一部分被拉入每个项目。
$ \ endgroup $
–伊恩
2013年1月6日18:13



$ \ begingroup $
是的,这是正确的。特别是固有字属性(电机,propertyMotorPower,kNumbOfTotalMotors,tMotor);将RobotC变量等同于固件变量。我只是想指出一点,在这种情况下,预处理器实际上没有任何其他生成的代码。
$ \ endgroup $
–秒杀3
2013年1月6日在22:13