0

したがって、ブール属性lettersと、それnumbersを使用してどのような文字を書き込むことができるクラスがあります。コンマとスペースも許可したいので、次の方法を試しました。

  boolean check(char letter){
    if(this.letters){
      if((letter >= 'a' && letter <= 'z') || (letter >= 'A' && letter <= 'Z')){
        return true;
      }
    }
    if(this.numbers){
      if(letter >= '0' && letter <= '9'){
        return true;
      }
    }
    if(letter == ' ' || letter == ','){
      return true;
    }
    return false;
  }

何らかの理由で、if(letter == ' ' || letter == ',')押されたキーがコンマまたはスペースバーであっても if ステートメントが実行されません。これが機能しないのはなぜですか?

4

3 に答える 3

0

あなたのコードの簡略版を試してみましたが、うまくいきました。これがあなたが試してみたいかもしれない私の完全なスケッチです:

boolean g_letters = true;
boolean g_numbers = true;

void setup() {}
void draw() {}

void keyPressed()
{
  if(g_letters){
      if((key >= 'a' && key <= 'z') || (key >= 'A' && key <= 'Z')){
        println("Pressed: letter");
        return;
      }
    }
    if(g_numbers){
      if(key >= '0' && key <= '9'){
        println("Pressed: number");
        return;
      }
    }
    if(key == ' ' || key == ','){
      println("Pressed: Comma / space");
      return;
    }
}

そのスケッチが機能する場合、問題はコードの別の場所にあります。問題はkey、関数でグローバル変数を照会していることだと思いますcheck()(これは明らかに組み込みのキー ハンドラーの 1 つではありません)。それが必ずしも正しくないというわけではなく、時にはうまくいくように見えるかもしれません。ただし、注意しないとkey、関数が認識する前に他のコードまたはイベントが変更されている可能性があります。

より良いアプローチはkey、キー処理関数 (たとえばkeyPressed()、または使用しているもの) で値を取得し、それを引数としてcheck()関数に渡すことです。そうすれば、オブジェクト指向プログラミングでは(通常)悪い習慣であるグローバル状態に依存しません。

以上のことから、ここでは、コードがユーザー入力に直接応答するように設計されていることを前提としています。実際に文字列などに格納されている文字を処理している場合、グローバル変数のクエリkeyは完全に間違っています。これはユーザー入力専用に設計されているためです。ただし、修正は同様です。値check()の代わりに文字を関数に渡すだけです。key

于 2013-11-06T10:23:00.203 に答える