我尝试在Processing中转换以下程序,在Kevinsa5的帮助下从txt文件中读取变量,但我不知道为什么不起作用。我做错了什么?程序运行时没有显示任何错误,只是打开的画布不会显示任何颜色。
static final int ribbon_length = 255, H = 200;
void setup() {
size(ribbon_length, H);
}
void draw() {
String[] lines = loadStrings("input.txt");
float p = float(split(lines[0], "=")[1]);
int up_y = int(split(lines[1], "=")[1]);
int wide = int(split(lines[2], "=")[1]);
int high = int(split(lines[3], "=")[1]);
float a = pow (ribbon_length, 1-p);
float colour = 0;
for (int step = 0; step <= 255; step++) {
colour = a * pow (step, p);
fill(colour,0,0);
rect(wide*step, up_y, wide, high);
noStroke();
}
}
答案 0 :(得分:2)
删除分号是一个好主意,因为它简化了代码必须执行的操作。但是,沿着=
分割字符串会为您提供"float p "
和" 5"
- 注意5之前的空格!字符串中数字前面的空格使其无法解析:
println("with a space: \t" + int(" 5"));
println("without a space: \t" + int("5"));
给出了这个输出:
with a space: 0
without a space: 5
现在,到你的代码。您绝对不需要每秒读取文本文件60次,因此请将其从draw()
移至setup()
。由于您希望在每个值的值之前删除该空格,因此您可以像使用分号一样编辑文本文件,或者只是更改分割它的方式。不要在"="
上拆分,而是拆分" = "
。这代表了上述变化:
static final int ribbon_length = 255, H = 200;
float p;
int up_y, wide, high;
void setup() {
size(ribbon_length, H);
String[] lines = loadStrings("input.txt");
p = float(split(lines[0], " = ")[1]);
println(p);
up_y = int(split(lines[1], " = ")[1]);
println(up_y);
wide = int(split(lines[2], " = ")[1]);
println(wide);
high = int(split(lines[3], " = ")[1]);
println(high);
}
void draw() {
float a = pow (ribbon_length, 1-p);
float colour = 0;
for (int step = 0; step <= 255; step++) {
colour = a * pow (step, p);
fill(colour,0,0);
rect(wide*step, up_y, wide, high);
noStroke();
}
}
这是输入:
float p = 5
int up_y = 10
int wide = 5
int high = 10
当您遇到您不期望的行为时,首先要进行调试的工作通常是使用println()
来查看变量的值。在你的代码中,它会为大多数人打印0
,表明你的文本文件中的数字不会变成变量(要么你读错了要么你解错了)。然后,打印像println(split(lines[0], "=")[1])
这样的东西,如果你仔细观察,就会显示出额外的空间。然后你可以在几分钟内得到你的答案,而不是等待16个多小时让某人回答这个问题:)
答案 1 :(得分:1)
如果您的输入符合您对Sanjeevs评论的回复(例如,浮点数p = 5; int up_y = 10;等),那么您遇到问题是因为您不只是将数字加载到变量中,而是也加载了分号。
例如,取文本文件的第一行'float p = 5;'。当你将这个字符串拆分为'='时,这两个部分将是'float'和'5;'。变量类型float不能处理半冒号。
要解决这个问题,我建议编辑'intput.txt'并删除每行末尾的分号。然后,您应该只将数字加载到变量中。