对象之外的变量未被识别 java - 已过时
Variable not being recognized out side of object java - OUTDATED
这是我的第一个问题,所以不完全确定这一切是如何工作的。
所以,我一直在为 FTC(第一技术挑战赛)编写机器人代码。我最近开始使用一个新的 class 来存储大部分代码并定义所有内容,这样我就可以在我们 运行 的程序中调用它。但是我遇到了一个问题。我确实发现了一个解决方案。但我想知道我所做的有什么问题。这是我之前的:
private Gamepad gamepad1;
void variables() {
int m;
if(gamepad1.left_stick_x < 0) {
m = -1;
}
else {
m =1;
}
int n;
if(gamepad1.left_stick_y < 0) {
n=1;
}
else {
n=-1;
}
float x = m * ((float) Math.sqrt(1 - Math.pow((double) gamepad1.left_stick_x, 2)) - 1);
float y = n * ((float) Math.sqrt(1 - Math.pow((double) gamepad1.left_stick_y, 2)) - 1);
float r = gamepad1.right_stick_x;
}
void driving_Full() {
variables();
frontLeftMotor.setPower(-y - x + r);
frontRightMotor.setPower(y - x + r);
backRightMotor.setPower(y + x + r);
backLeftMotor.setPower(-y + x + r);
}
void driving_Quarter() {
variables();
frontLeftMotor.setPower(0.25 * (-y - x + r));
frontRightMotor.setPower(0.25 * (y - x + r));
backRightMotor.setPower(0.25 * (y + x + r));
backLeftMotor.setPower(0.25 * (-y + x + r));
}
void driving_Tenth() {
variables();
frontLeftMotor.setPower(0.1 * (-y - x + r));
frontRightMotor.setPower(0.1 * (y - x + r));
backRightMotor.setPower(0.1 * (y + x + r));
backLeftMotor.setPower(0.1 * (-y + x + r));
}
我遇到的问题是在 variables() 对象之外无法识别 r 变量。
我目前想到的解决方案是将 float r = gamepad1.right_stick_x;
放入每个驱动对象中。
第一个有什么问题?
你在这里遇到的问题与变量范围有关。我要详细说明一下:
根据变量的定义方式,变量有多个作用域。在这里你有一个很棒的explanation。简短的版本是我们可以考虑 3 个范围:
- class:它们是属性,它们可用于class.
中定义的所有方法
- 方法:这些是函数内部定义的变量。它们仅适用于该功能。
- loop:指在循环中创建的变量,只能在该循环中访问。
你的问题是你的方法 variables()
中的变量只能在它上面访问。获得所需内容的正确方法是创建 class 属性。
此外,您应该考虑向 class 添加一个构造函数来初始化变量。这是您在 variables()
中所做的基本操作,但方式正确。创建对象时总是调用构造函数方法。假设您有一个名为 gamepad
的 class。当您执行 gamepad gp = new gamepad()
时,将调用构造函数并初始化您的变量。
您所说的对象 variables()
实际上是一种方法。在方法内部声明的变量仅在该方法中可用。
如果您希望在 class/object 中的任何位置访问变量,您需要在方法体外部(在 class 的顶部)声明该变量。
在您的程序上下文中,您可以执行以下操作:
public class Foo {
private Gamepad gamepad1;
private float r;
(其中 Foo 是您的 class 的名称)
现在您已经声明了变量,您需要更改
float r = gamepad1.right_stick_x;
至:
r = gamepad1.right_stick_x;
对 r 所做的任何更改都将反映在整个对象中。
这是我的第一个问题,所以不完全确定这一切是如何工作的。
所以,我一直在为 FTC(第一技术挑战赛)编写机器人代码。我最近开始使用一个新的 class 来存储大部分代码并定义所有内容,这样我就可以在我们 运行 的程序中调用它。但是我遇到了一个问题。我确实发现了一个解决方案。但我想知道我所做的有什么问题。这是我之前的:
private Gamepad gamepad1;
void variables() {
int m;
if(gamepad1.left_stick_x < 0) {
m = -1;
}
else {
m =1;
}
int n;
if(gamepad1.left_stick_y < 0) {
n=1;
}
else {
n=-1;
}
float x = m * ((float) Math.sqrt(1 - Math.pow((double) gamepad1.left_stick_x, 2)) - 1);
float y = n * ((float) Math.sqrt(1 - Math.pow((double) gamepad1.left_stick_y, 2)) - 1);
float r = gamepad1.right_stick_x;
}
void driving_Full() {
variables();
frontLeftMotor.setPower(-y - x + r);
frontRightMotor.setPower(y - x + r);
backRightMotor.setPower(y + x + r);
backLeftMotor.setPower(-y + x + r);
}
void driving_Quarter() {
variables();
frontLeftMotor.setPower(0.25 * (-y - x + r));
frontRightMotor.setPower(0.25 * (y - x + r));
backRightMotor.setPower(0.25 * (y + x + r));
backLeftMotor.setPower(0.25 * (-y + x + r));
}
void driving_Tenth() {
variables();
frontLeftMotor.setPower(0.1 * (-y - x + r));
frontRightMotor.setPower(0.1 * (y - x + r));
backRightMotor.setPower(0.1 * (y + x + r));
backLeftMotor.setPower(0.1 * (-y + x + r));
}
我遇到的问题是在 variables() 对象之外无法识别 r 变量。
我目前想到的解决方案是将 float r = gamepad1.right_stick_x;
放入每个驱动对象中。
第一个有什么问题?
你在这里遇到的问题与变量范围有关。我要详细说明一下:
根据变量的定义方式,变量有多个作用域。在这里你有一个很棒的explanation。简短的版本是我们可以考虑 3 个范围:
- class:它们是属性,它们可用于class. 中定义的所有方法
- 方法:这些是函数内部定义的变量。它们仅适用于该功能。
- loop:指在循环中创建的变量,只能在该循环中访问。
你的问题是你的方法 variables()
中的变量只能在它上面访问。获得所需内容的正确方法是创建 class 属性。
此外,您应该考虑向 class 添加一个构造函数来初始化变量。这是您在 variables()
中所做的基本操作,但方式正确。创建对象时总是调用构造函数方法。假设您有一个名为 gamepad
的 class。当您执行 gamepad gp = new gamepad()
时,将调用构造函数并初始化您的变量。
您所说的对象 variables()
实际上是一种方法。在方法内部声明的变量仅在该方法中可用。
如果您希望在 class/object 中的任何位置访问变量,您需要在方法体外部(在 class 的顶部)声明该变量。
在您的程序上下文中,您可以执行以下操作:
public class Foo {
private Gamepad gamepad1;
private float r;
(其中 Foo 是您的 class 的名称)
现在您已经声明了变量,您需要更改
float r = gamepad1.right_stick_x;
至:
r = gamepad1.right_stick_x;
对 r 所做的任何更改都将反映在整个对象中。