例如,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
}
很难猜出您实际上想做什么
#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
评论
$ \ begingroup $
没错,但是我实际上需要了解单词类型之间的兼容性,因为tMotor不是类型,而只是规范。
$ \ endgroup $
–Genevieve
13年5月5日在18:47
$ \ begingroup $
没关系,tMotor可用作变量规范。谢谢! :D
$ \ endgroup $
–Genevieve
13年1月7日,下午1:45