当前位置: 首页 > 知识库问答 >
问题:

Arduino到处理,字符串ArrayIndexOutOfBoundsException:18

王才
2023-03-14

我正在开发一个程序,它将消息从Arduino发送到Processing,将它们作为十进制数从Arduino打印到串行端口,然后在Processing中以字符串数组的形式提取它们。我遇到的问题是:“ArrayIndexOutOfBounds:18”,它突出显示了一行,上面写着dlay=Integer.parseInt(B[18]),我假设数组不够大,无法存储超过17的数据,我可能犯了一个非常愚蠢的错误,但我不知道如何扩展它!

有什么建议吗?

非常感谢!

import processing.serial.*; //import the Serial library

int end = 10;
String serial;
Serial port;
int c;
int d;
int e;
int f;
int g;
int a;
int b;
int C;
int p1t;
int p2t;
int p3t;
int p4t;
int p5t;
int p6t;
int p7t;
int p8t;
int pan;
int reverb;
int dlay;
int distort;
//ellipse parameters
int noteOn = 0;
int col1 = 0;
int col2 = 0;
int col3 = 0;
String[] A;
String[] B;
void setup() {
    size(600,600);
    frameRate(30);
    port = new Serial(this, Serial.list()[7], 115200);
    port.clear();
    serial = port.readStringUntil(end);
    serial = null; // initially, the string will be null (empty)
}

void draw() {

while (port.available() > 0) { 
serial = port.readStringUntil(end);

}
if (serial != null) {  //if the string is not empty, print the following

  A = split(serial, ','); 
  B = trim(A);
  c = Integer.parseInt(B[1]);
  if (c == 1){
  col1 = 255;
  col2 = 0;
  col3 = 0;
  }
  d = Integer.parseInt(B[2]);
  if (d == 1){
  col1 = 0;
  col2 = 0;
  col3 = 255;
  }
  e = Integer.parseInt(B[3]);
  if (e == 1){
  col1 = 0;
  col2 = 255;
  col3 = 0;
  }
  f = Integer.parseInt(B[4]);
  if (f == 1){
  col1 = 255;
  col2 = 0;
  col3 = 255;
  }
  g = Integer.parseInt(B[5]);
  if (g == 1){
  col1 = 255;
  col2 = 255;
  col3 = 0;
  }
  a = Integer.parseInt(B[6]);
  if (a == 1){
  col1 = 0;
  col2 = 255;
  col3 = 255;
  }
  b = Integer.parseInt(B[7]);
  if (b == 1){
  col1 = 50;
  col2 = 250;
  col3 = 130;
  }
  C = Integer.parseInt(B[8]);
  if (C == 1){
  col1 = 200;
  col2 = 90;
  col3 = 75;
  }
if(c == 1 || d == 1 || e == 1 || f == 1 || g == 1 || a == 1 || b == 1 || C == 1){
  noteOn = 1;
}
else {
  noteOn = 0;
}
p1t = Integer.parseInt(B[9]);
p2t = Integer.parseInt(B[10]);
p3t = Integer.parseInt(B[11]);
p4t = Integer.parseInt(B[12]);
p5t = Integer.parseInt(B[13]);
p6t = Integer.parseInt(B[14]);
p7t = Integer.parseInt(B[15]);
p8t = Integer.parseInt(B[16]);
pan = Integer.parseInt(B[17]);
dlay = Integer.parseInt(B[18]);
//reverb = Integer.parseInt(B[19]);
//distort = Integer.parseInt(B[18]);
} 
fill(0, 0,0, 255);
rect(0,0, 600,600);
fill(col1,col2, col3); 
ellipse(300+pan, 300, (noteOn*p8t), (noteOn*p8t));


}

共有1个答案

吴单鹗
2023-03-14

您是否知道Java中的数组(因此也包括处理)从0开始索引,而不是1?也就是说,名为exampleArray的数组的第一个元素是通过写入exampleArray[0]来访问的,第二个元素是通过exampleArray[1]等来访问的。因此,如果数组中有18个元素,那么写入B[18]实际上是试图获取一个不存在的第19个元素。

附带说明:有这么多变量被认为是糟糕的做法,尤其是有这么短的名称——我不知道abc等通过查看它们的名称来做什么,而后面的代码也没有解释它。更糟糕的是,一些字母的小写和大写版本都有!你现在知道它们是什么,但是如果你在几个月后回到这个代码,那么你必须弄清楚。

 类似资料:
  • 字符串用于存储文本。 它们可用于在LCD或Arduino IDE串行监视器窗口中显示文本。 字符串对于存储用户输入也很有用。 例如,用户在连接到Arduino的键盘上键入的字符。 Arduino编程中有两种类型的字符串 - 字符数组,与C编程中使用的字符串相同。 Arduino String,它允许我们在草图中使用字符串对象。 在本章中,我们将学习字符串,对象以及Arduino草图中字符串的使用。

  • StringBuffer 是一个字符串拼接工具,和java中的StringBuilder类似。对于那些需要大量的字符串连接的时候,用 StringBuffer 更高效一些。它实现了以下API: class StringBuffer { public function __construct($str); public function isEmpty(); publi

  • 字符串在我们平常的Web开发中经常用到,包括用户的输入,数据库读取的数据等,我们经常需要对字符串进行分割、连接、转换等操作,本小节将通过Go标准库中的strings和strconv两个包中的函数来讲解如何进行有效快速的操作。 字符串操作 下面这些函数来自于strings包,这里介绍一些我平常经常用到的函数,更详细的请参考官方的文档。 func Contains(s, substr string)

  • 函数 说明 Series.str.capitalize() 将 Series / 索引中的字符串转换为大写。 Series.str.cat([others, sep, na_rep, join]) 使用给定的分隔符连接 Series / 索引中的字符串。 Series.str.center(width[, fillchar]) 用附加字符填充 Series / 索引中字符串的左侧和右侧。 Seri

  • 在 Bash 脚本中可以调用字符串处理工具 awk 来替换内置的字符串处理操作。 样例 10-6. 使用另一种方式来截取和定位子字符串 #!/bin/bash # substring-extraction.sh String=23skidoo1 # 012345678 Bash # 123456789 awk # 注意不同字符串索引系统: # Bash 中第一个字符

  • 在DOS中,字符串是一个有序的字符集合,比如:。 编号 字符串操作 描述 1 创建字符串 字符串可以通过以下方式在DOS中创建。 2 空字符串 空的字符串 3 字符串插值 字符串插值是一种通过将常量,变量,文字和表达式中的值包含在字符串文字中来构造新的字符串值的方法。 4 字符串连接 可以使用运算符连接两个字符串,一个字符串和一个字符,或者两个字符。 以下是一个简单的例子,展示了如何使用字符串连接