【问题标题】:Switch improvement using a generic case使用通用案例进行开关改进
【发布时间】:2019-08-09 11:18:05
【问题描述】:

是否可以更改此“开关”?首先,我虽然可以改用“for”,但我认为不再需要了。目标是使此代码更有效。有谁知道如何进行这种改进以提高代码效率?我还在学习编程,我还没有那么有经验。我已经做了一些事情,但我不知道它是否缺少一些东西,我把新代码放在旧代码下面。我认为可能有必要使用 if 而不是我创建的 for 或其他函数,因为我无法更改 'PageNumber' 的值,我只需要使用它即可。也许我不需要使用任何已经在“案例”中的东西。有人可以澄清一下吗?

switch (PageNumber) {

            case 0x01:
                m = 0;
                for (n = 0; n < 8; n++) {
                    if (n < NumberOfSensor) {
                        if (n < 4) {
                            Write_string("L       ", n, 0);
                            Write_int((n + 1), n, 1);
                            write_CustonCharacter(4, n, 3); //Write the indicator "->"


Write_int(Sensor_Count[n], n, 5);
                            } else if (n > 3) {
                                Write_string("L       ", (n - 4), 10);
                                Write_int((n + 1), (n - 4), 11);
                                write_CustonCharacter(4, (n - 4), 13); //Write the indicator "->"
                                Write_int(Sensor_Count[n], (n - 4), 15);
                            }

                        }
                    }
                    break;


                    /*
                     * PAGE 2
                     */
                case 0x02:

                    m = 0;
                    for (n = 8; n < 16; n++) {
                        if (n < NumberOfSensor) {
                            if (n < 12) {
                                Write_string("L       ", (n - 8), 0);
                                Write_int((n + 1), (n - 8), 1);
                                write_CustonCharacter(4, (n - 8), 3); //Write the indicator "->"
                                Write_int(Sensor_Count[n], (n - 8), 5);
                            } else if (n > 11) {
                                Write_string("L       ", (n - 12), 10);
                                Write_int((n + 1), (n - 12), 11);
                                write_CustonCharacter(4, (n - 12), 13); //Write the indicator "->"
                                Write_int(Sensor_Count[n], (n - 12), 15);
                            }

                        }
                    }
                    break;


                    //...(This part is just repetition)

                    /*
                     * PAGE 8
                     */
                case 0x08:
                    m = 0;
                    for (n = 56; n < 65; n++) {
                        if (n < NumberOfSensor) {
                            if (n < 60) {
                                Write_string("L       ", (n - 56), 0);
                                Write_int((n + 1), (n - 56), 1);
                                write_CustonCharacter(4, (n - 56), 3); //Write the indicator "->"
                                Write_int(Sensor_Count[n], (n - 56), 5);
                            } else if (n > 59) {
                                Write_string("L       ", (n - 60), 10);
                                Write_int((n + 1), (n - 60), 11);
                                write_CustonCharacter(4, (n - 60), 13); //Write the indicator "->"
                                Write_int(Sensor_Count[n], (n - 60), 15);
                            }

                        }
                    }
                    break;
                default:
                    break;
                }
//==========================================================================
                for (PageNumber = 1; PageNumber < 9; PageNumber++) { //actually I think this for is not necessary because it receives PageNumber and then it does what it needs to do.
                    m = 0; //but does it need something else?
                    for (n = (PageNumber * 8 - 8); n < (PageNumber * 8); n++) {
                        if (n < NumberOfSensor) {
                            if (n < (PageNumber * 8 - 4)) {
                                Write_string("L       ", n - (PageNumber * 8 - 8), 0);
                                Write_int((n + 1), n - (PageNumber * 8 - 8), 1);
                                write_CustonCharacter(4, n - (PageNumber * 8 - 8), 3); //Write the indicator "->"
                                Write_int(Sensor_Count[n], n - (PageNumber * 8 - 8), 5);
                            } else if (n > (PageNumber * 8 - 5)) {
                                Write_string("L       ", n - (PageNumber * 8 - 4), 10);
                                Write_int((n + 1), n - (PageNumber * 8 - 4), 11);
                                write_CustonCharacter(4, n - (PageNumber * 8 - 4), 13); //Write the indicator "->"
                                Write_int(Sensor_Count[n], n - (PageNumber * 8 - 4), 15);
                            }

                        }
                    }

                }

【问题讨论】:

  • 您的问题有一半是已注释的代码...请在您的问题中仅提供minimal reproducible example
  • 您的代码缩进严重,拼写约定错误(write_CustonCharacterWrite_int),我不知道这些 Write* 函数的用途。您应该描述代码应该做什么。但如果它有效,那么这更适合Code Review

标签: c performance for-loop switch-statement


【解决方案1】:

首先,我想说这段代码效率不高主要是因为它在重复自己,而不是因为内存使用。

你如何在这方面改进它 - 你可以只有一个 for 循环,根本没有 switch-case。

怎么样?尝试将每个案例中的 for 循环表示为案例值的函数,然后根据其他 for 循环体对其进行概括。例如:

请注意,对于每种情况:

  • for循环的初始值始终为(PageNumber-1)*8
  • for 循环条件始终为n &lt; PageNumber*8
  • if-then 子句中的第一行始终是Write_string("L ", (n-((PageNumber-1)*8), 0));

等等。 继续概括每个随 PageNumber 变化的数字,然后你最终将只有一个 for 循环,根本没有 switch-case。

【讨论】:

  • 我试图解决它。我把新代码放在旧代码下面。你能看一下吗?
  • 不应存在外部 for 循环 - 根据问题,您的代码应该只为给定的 PageNumber 运行一次。
  • 另一个小的代码改进 - 看看你重复了多少次PageNumber * 8 - 8(实际上是(PageNumber-1) * 8)和PageNumber * 8 - 4。相反,将它们保存在两个变量中并使用这些变量。你的代码会更小更干净。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 2020-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-12
相关资源
最近更新 更多