【问题标题】:Nested switch/case inside while loop and !Console.KeyAvailable C#在while循环和!Console.KeyAvailable C#中嵌套开关/案例
【发布时间】:2020-11-02 19:28:03
【问题描述】:

我目前正在开展一个项目,该项目利用编码器来跟踪一系列丝杠的位置。此代码块用于获取每个编码器的位置并通过 while 循环(未按下任何键)将其显示给用户,同时还为他们提供将三个位置中的任何一个重置为零的选项(通过按下任一键盘上的“x”、“y”或“z”)。

按原样,用户需要按“x”键一次将 x 位置归零,按“y”键 2 次将 y 位置归零,按“z”键 3 次归零z 位置和 4 次结束程序。为了使开关/案例发生而需要按下键的次数对应于它在案例列表中的数字位置。但是,我需要每个键只按一次以执行操作。我将如何着手修复开关/案例结构(或其他任何东西)以实现这一目标?

此外,它似乎不喜欢第一个 switch 语句中的 !Console.KeyAvaible 来检查是否已按下某个键。错误是“无法将 bool 转换为 System.ConsoleKey”。还有另一种说法吗?

while (true){
     long Position0 = encoder0.Position;
     long Position1 = encoder1.Position;
     long Position2 = encoder2.Position;
     ConsoleKeyInfo input = Console.ReadKey();
     switch (input.Key){
          case !Console.KeyAvailable:
               // initialize encoder positions and do math to convert to mm 
               float Position0f = Convert.ToSingle(Position0);
               float Position1f = Convert.ToSingle(Position1);
               float Position2f = Convert.ToSingle(Position2);
               float LinearPosition0 = Position0f / 400;
               float LinearPosition1 = Position1f / 400;
               float LinearPosition2 = Position2f / 400;

               Console.SetCursorPosition(0, 0);
               Console.WriteLine("x Position: {0:0.0000##} mm", LinearPosition0);
               Console.SetCursorPosition(0, 1);
               Console.WriteLine("y Position: {0:0.0000##} mm", LinearPosition1);
               Console.SetCursorPosition(0, 2);
               continue;

               default:
                    switch (input.Key){
                         case ConsoleKey.X:
                              Console.WriteLine("\nYou selected X!");
                              Position0 = 0;
                              break;

                         case ConsoleKey.Y:
                              Console.WriteLine("\nYou selected Y!");
                              Position1 = 0;
                              break;

                         case ConsoleKey.Z:
                              Console.WriteLine("\nYou selected Z!");
                              Position2 = 0;
                              break;

                         case ConsoleKey.Escape:
                              Console.WriteLine("\nYou selected Esc! Exiting program.");
                              break;

                         default:
                              break;
                    }
               break;
}

}

除了键的问题外,第一个if语句中显示的位置没有变化。我应该在哪里初始化 Position0/1/2 以便它们可以在第二个 if 语句中重置为零,同时仍然在第一个循环中更新?

【问题讨论】:

    标签: c# while-loop switch-statement keypress encoder


    【解决方案1】:

    在读取密钥之前需要检查密钥是否可用,例如:

      long Position0 = 0;
      long Position1 = 0;
      long Position2 = 0;
      bool isEnd = false;
      while ( !isEnd )
      {
        Position0 = encoder0.Position;
        Position1 = encoder1.Position;
        Position2 = encoder2.Position;
        //Position0++; Position1++; Position2++;
        float LinearPosition0 = Convert.ToSingle(Position0) / 400;
        float LinearPosition1 = Convert.ToSingle(Position1) / 400;
        float LinearPosition2 = Convert.ToSingle(Position2) / 400;
        Console.SetCursorPosition(0, 0);
        Console.WriteLine("x Position: {0:0.0000##} mm", LinearPosition0);
        Console.SetCursorPosition(0, 1);
        Console.WriteLine("y Position: {0:0.0000##} mm", LinearPosition1);
        Console.SetCursorPosition(0, 2);
        Console.WriteLine("z Position: {0:0.0000##} mm", LinearPosition2);
        if ( Console.KeyAvailable )
          switch ( Console.ReadKey(true).Key )
          {
            case ConsoleKey.X:
              Console.WriteLine("\nYou selected X!");
              Position0 = 0;
              break;
            case ConsoleKey.Y:
              Console.WriteLine("\nYou selected Y!");
              Position1 = 0;
              break;
            case ConsoleKey.Z:
              Console.WriteLine("\nYou selected Z!");
              Position2 = 0;
              break;
            case ConsoleKey.Escape:
              Console.WriteLine("\nYou selected Esc! Exiting program.");
              isEnd = true;
              break;
          }
      }
    

    如果需要,您也可以隐藏光标。

    Console.CursorVisible = false;
    

    Animated GIF

    【讨论】:

    • 是的,这个想法是它一遍又一遍地打印位置,直到它被触发以通过按键执行其他操作。感谢您的建议。
    • 所以我终于开始考虑你的建议了,Oliver。但是,归零部分不会更改第一个 if 语句中打印的位置。我假设这是因为 position = 0 没有连接到第一个 if 语句中编码器给出的位置。降低该价值的最佳方法是什么?我知道第二个 if 语句正在工作,因为它仍然打印出 WriteLine()。
    • 我在这个问题上添加了一个修正以提供更多信息。最初我认为为了提出这个问题而简化我的代码会有所帮助,但现在我意识到这可能不是一个好主意。非常感谢您对我的帮助和耐心——我是一名刚毕业的机械工程师,他们让我参与了我设计的机械装置的编程——所以我已经脱离了我的元素。
    • 隐藏光标是一个很好的建议——让它一直闪烁会分散注意力。对我来说,这个位置仍然没有归零,这真的没有意义。我会继续玩它的。其他一切都很好。再次感谢你的帮助。我真的很感激。
    • 没关系,我知道它是什么——一切都被摆平了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多