If-else构造不起作用

林兹

成员
已加入
2020年4月9日
留言内容
21
编程经验
Beginner
我需要一名志愿者来审查C#代码。 if-else构造的一些问题与预期不符。对编程非常新。请指教。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
欢迎来到论坛。

您可以发布遇到问题的代码,以便我们看看吗?

您还可以查看我签名中的if else逻辑链接,以获取更多详细文档。

请记住使用论坛提供的代码标签发布您的代码,如下所示:

codetags-gif.884
 

林兹

成员
已加入
2020年4月9日
留言内容
21
编程经验
Beginner
C#:
namespace BinaryImage_Console
{
    /// <summary>
    /// Program Class of Console App
    /// </summary>
    class Program
    {
        /// <summary>
        /// Main entry point for Program
        /// </summary>
        /// <param name="args">Argument of main method</param>
        static void Main(string[] args)
        {
          
            Console.WriteLine("Welcome to Binary Image Maker");           
            Console.WriteLine("\nUse following command for help:");
            Console.WriteLine("dotnet ImageBinarizerApp-帮助");
            args = new String[] { Console.ReadLine() };
            
            //Test if necessary input arguments were supplied.
            if (args.Length < 8)
            {
                if(args.Length == 1 && args[0].Equals("-help"))
                {
                    Console.WriteLine("\nHelp:");
                    Console.WriteLine("\nPass the arguments as following:");
                    Console.WriteLine("\nExample with automatic RGB:\ndotnet ImageBinarizerApp --input-image c:\\a.png --output-image d:\\out.txt -width 32 -height 32");
                    Console.WriteLine("\nExample with explicit RGB:\ndotnet ImageBinarizerApp --input-image c:\\a.png --output-image d:\\out.txt -width 32 -height 32 -red 100 -green 100 -blue 100");
                }
                else
                {
                    Console.WriteLine("\nError: All necessary arguments are not passed. Please pass the arguments first.");
                }
                Console.WriteLine("\n按任意键退出应用程序。");
                Console.ReadLine();
                return;
            }
            else
            {
                String inputImagePath = "";
                String outputImagePath = "";
                int imageWidth = 0;
                int imageHeight = 0;
                int redThreshold = -1;
                int greenThreshold = -1;
                int blueThreshold = -1;

                if(args[0].Equals("--input-image") && File.Exists(args[1]))
                {
                    inputImagePath = args[1];
                }
                else
                {
                    Console.WriteLine("\nError: Input file doesn't exist.");
                    Console.WriteLine("\n按任意键退出应用程序。");
                    Console.ReadLine();
                    return;
                }

                int separatorIndex = args[3].LastIndexOf(Path.DirectorySeparatorChar);
                if (args[2].Equals("--output-image") && separatorIndex >= 0 && Directory.Exists(args[3].Substring(0, separatorIndex)))
                {
                    outputImagePath = args[3];
                }
                else
                {
                    Console.WriteLine("\nError: Output Directory doesn't exist.");
                    Console.WriteLine("\n按任意键退出应用程序。");
                    Console.ReadLine();
                    return;
                }

                if (!args[4].Equals("-width") || !int.TryParse(args[5], out imageWidth))
                {
                    Console.WriteLine("\nError: Image Width should be integer.");
                    Console.WriteLine("\n按任意键退出应用程序。");
                    Console.ReadLine();
                    return;
                }

                if (!args[6].Equals("-height") || !int.TryParse(args[7], out imageHeight))
                {
                    Console.WriteLine("\nError: Image Height should be integer.");
                    Console.WriteLine("\n按任意键退出应用程序。");
                    Console.ReadLine();
                    return;
                }

                if(args.Length > 8)
                {
                    if(args.Length < 14)
                    {
                        Console.WriteLine("\nError: All three Red, Green and Blue Thresholds should be passed.");
                        Console.WriteLine("\n按任意键退出应用程序。");
                        Console.ReadLine();
                        return;
                    }
                    else
                    {
                        if (!args[8].Equals("-red") || !(int.TryParse(args[9], out redThreshold)) || redThreshold < 0 || redThreshold > 255)
                        {
                            Console.WriteLine("\nError: Red Threshold should be in between 0 and 255.");
                            Console.WriteLine("\n按任意键退出应用程序。");
                            Console.ReadLine();
                            return;
                        }

                        if (!args[10].Equals("-green") || !(int.TryParse(args[11], out greenThreshold)) || greenThreshold < 0 || greenThreshold > 255)
                        {
                            Console.WriteLine("\nError: Green Threshold should be in between 0 and 255.");
                            Console.WriteLine("\n按任意键退出应用程序。");
                            Console.ReadLine();
                            return;
                        }

                        if (!args[12].Equals("-blue") || !(int.TryParse(args[13], out blueThreshold)) || blueThreshold < 0 || blueThreshold > 255)
                        {
                            Console.WriteLine("\nError: Blue Threshold should be in between 0 and 255.");
                            Console.WriteLine("\n按任意键退出应用程序。");
                            Console.ReadLine();
                            return;
                        }
                    }                   
                }
                else
                {
                    redThreshold = -1;
                    greenThreshold = -1;
                    blueThreshold = -1;
                }

                Console.WriteLine("\nImage Binarization in progress...");

                try
                {
                    ImageBinarizerApplication obj = new ImageBinarizerApplication();
                    obj.Binarizer(inputImagePath, outputImagePath, imageWidth, imageHeight, redThreshold, greenThreshold, blueThreshold);
                }
                catch (Exception e)
                {
                    Console.WriteLine($"\nError: {e.Message}");
                    Console.WriteLine("\n按任意键退出应用程序。");
                    Console.ReadLine();
                    return;
                }

                Console.WriteLine("\nImage Binarization completed.");
                Console.WriteLine("\n按任意键退出应用程序。");

                Console.ReadLine();
            }           
        }
    }
}
 

林兹

成员
已加入
2020年4月9日
留言内容
21
编程经验
Beginner
欢迎来到论坛。

您可以发布遇到问题的代码,以便我们看看吗?

您还可以查看我签名中的if else逻辑链接,以获取更多详细文档。

请记住使用论坛提供的代码标签发布您的代码,如下所示:

codetags-gif.884
谢谢您的关注。主题代码已发布。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,524
地点
悉尼,澳大利亚
编程经验
10+
请准确解释问题的根源,即代码中的位置(突出显示的不是“ if”语句)以及预期发生的情况和实际发生的情况。如果异常行为是特定于数据的,那么当时正在播放的特定数据也可能会有所帮助。
 

林兹

成员
已加入
2020年4月9日
留言内容
21
编程经验
Beginner
请准确解释问题的根源,即代码中的位置(突出显示的不是“ if”语句)以及预期发生的情况和实际发生的情况。如果异常行为是特定于数据的,那么当时正在播放的特定数据也可能会有所帮助。

一旦运行程序,就只能输入参数,直到“ -help”为止,然后控制台应用程序退出(无论输入其他有效参数/参数如何)。请查看随附的调试控制台快照以进行澄清。我希望能够输入代码中指定的参数,并使程序流依每次选择的参数顺序运行。
 

附件

  • Console_Debug.png
    Console_Debug.png
    37.6 KB · Views: 10

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,524
地点
悉尼,澳大利亚
编程经验
10+
您是否真的调试过代码,即设置断点并逐行浏览代码,检查每一步的状态?如果没有,则需要先执行此操作。您必须对每个步骤都会发生的事情有一个期望,然后才能知道它是否会发生。一旦代码的行为与预期的不同,您就会发现一个特定的问题,可以对此进行更详细的研究。您不能仅通过阅读代码来解决问题。您必须观看实际操作。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
主要的 通常是在Program.Cs文件中设置的项目的启动方法 那么您到底如何将参数传递给 主要的 方法?

好的,在第18行,您的逻辑存在重大问题。如果用户输入会怎样? dotnet ImageBinarizerApp-帮助?那应该成为论点吗,因为会吗?因为您正在呼吁用户反馈。但是您没有检查该反馈是什么。这样就成为新args的参数。请参阅下面的示例示例:

C#:
        internal static void Main(string[] args)
        {

            new Thread(() => Request_Response(new string[0]))
            {
                Name = "Executor"
            }.Start();
        }
        internal static void Request_Response(string[] args)
        {
            Console.WriteLine("Welcome to Binary Image Maker");
            Console.WriteLine("\nUse following command for help:");
            Console.WriteLine("dotnet ImageBinarizerApp-帮助");
            args = new String[] { Console.ReadLine() };
        }
您需要做的是从我签名中的调试器教程开始(单击扰流板),按照该教程阅读和学习调试,然后逐步浏览所拥有的代码或本示例中的代码,您将找到为什么您的当前代码一开始就存在问题。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,533
地点
弗吉尼亚州切萨皮克
编程经验
10+
问题出在代码的第34和35行上。他为用户编写了一个误导性消息:"按任意键退出应用程序。" on line 34. Then on line 35, he programmed a call to Console.ReadLine() which will actually accept any key presses from the user until presses the Enter key. So the effect of all this is that after all the help text is printed out, the user enters a command thinking that they are entering something into the command prompt when it actually just the Console.ReadLine() that is reading in a string until the user presses Enter. After that the program exits.

请参阅第6个帖子中的图片。请注意,他在"按任意键退出应用程序。"在显示有关应用程序退出的最终输出之前。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
@跳伞。看起来一目了然。它将为我们的OP进行调试。 (y)
 

林兹

成员
已加入
2020年4月9日
留言内容
21
编程经验
Beginner
您是否真的调试过代码,即设置断点并逐行浏览代码,检查每一步的状态?如果没有,则需要先执行此操作。您必须对每个步骤都会发生的事情有一个期望,然后才能知道它是否会发生。一旦代码的行为与预期的不同,您就会发现一个特定的问题,可以对此进行更详细的研究。您不能仅通过阅读代码来解决问题。您必须观看实际操作。

感谢您的帮助。我能够按照您的指示设置断点,并在观察到流量的情况下能够稍微重新排列构造。我取得了一些进展,但遇到了新情况。尽管在开始时对其进行了初始化,但第41行的InputhImagePath处于非活动状态。
无效的String变量:
   static void Main(string[] args)
        {
            String inputImagePath = "";
            String outputImagePath = "";
            int imageWidth = 0;
            int imageHeight = 0;
            int redThreshold = -1;
            int greenThreshold = -1;
            int blueThreshold = -1;


            Console.WriteLine("Welcome to Binary Image Maker");
            Console.WriteLine("\nUse following command for help:");
            Console.WriteLine("dotnet ImageBinarizerApp-帮助");
            args = new String[] { Console.ReadLine() };

            //Test if necessary input arguments were supplied.
            if (args.Length < 8)
            {
                if (args.Length == 1 && args[0].Equals("-help"))
                {
                    Console.WriteLine("\nHelp:");
                    Console.WriteLine("\nPass the arguments as following:");
                    Console.WriteLine("\nExample with automatic RGB:\ndotnet ImageBinarizerApp --input-image c:\\a.png --output-image c:\\out.txt -width 32 -height 32");
                    Console.WriteLine("\nExample with explicit RGB:\ndotnet ImageBinarizerApp --input-image c:\\a.png --output-image c:\\out.txt -width 32 -height 32 -red 100 -green 100 -blue 100");
                }
                else
                {
                    Console.WriteLine("\nError: All necessary arguments are not passed. Please pass the arguments first.");

                    Console.WriteLine("\n按任意键退出应用程序。");
                    Console.ReadLine();
                    return;
                }

                            
                args = new String[] { Console.ReadLine() };

                if (args[0].Equals("--input-image") && File.Exists(args[1]))
                {
                    inputImagePath = args[1];
                }
                else
                {
                    Console.WriteLine("\nError: Input file doesn't exist.");
                    Console.WriteLine("\n按任意键退出应用程序。");
                    Console.ReadLine();
                    return;
                }

                int separatorIndex = args[3].LastIndexOf(Path.DirectorySeparatorChar);
                if (args[2].Equals("--output-image") && separatorIndex >= 0 && Directory.Exists(args[3].Substring(0, separatorIndex)))
 

林兹

成员
已加入
2020年4月9日
留言内容
21
编程经验
Beginner
请在附件中找到调试控制台的快照。提供了文件路径的参数(第37行)之后,if-construct会跳至第43行,因为inputImagePath是非活动的,因此文件不存在。有什么事吗
 

附件

  • Console_Debug II.png
    Console_Debug II.png
    28.9 KB · Views: 4

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,533
地点
弗吉尼亚州切萨皮克
编程经验
10+
User your debugger. Look closely at the value of args[0]. Notice that it doesn't match the string you are expecting, so the Boolean expression on line 39 short circuits to false (and therefore does not throw an array out of bounds exception). Since there expression is false, the code goes to the else clause and you seem the error message indicating that the file does not exist.

If you are assuming that putting the call to Console.ReadLine() inside curly braces and assigning it to a string array will automatically parse the input into an array of strings, then as you can see, your assumption is wrong. You only get an array with a single string because ReadLine() on returns a single string.
 

林兹

成员
已加入
2020年4月9日
留言内容
21
编程经验
Beginner
问题出在代码的第34和35行上。他为用户编写了一个误导性消息:"按任意键退出应用程序。" on line 34. Then on line 35, he programmed a call to Console.ReadLine() which will actually accept any key presses from the user until presses the Enter key. So the effect of all this is that after all the help text is printed out, the user enters a command thinking that they are entering something into the command prompt when it actually just the Console.ReadLine() that is reading in a string until the user presses Enter. After that the program exits.

请参阅第6个帖子中的图片。请注意,他在"按任意键退出应用程序。"在显示有关应用程序退出的最终输出之前。
太感谢了。这帮助我改善了当前的实施。
 

林兹

成员
已加入
2020年4月9日
留言内容
21
编程经验
Beginner
User your debugger. Look closely at the value of args[0]. Notice that it doesn't match the string you are expecting, so the Boolean expression on line 39 short circuits to false (and therefore does not throw an array out of bounds exception). Since there expression is false, the code goes to the else clause and you seem the error message indicating that the file does not exist.

If you are assuming that putting the call to Console.ReadLine() inside curly braces and assigning it to a string array will automatically parse the input into an array of strings, then as you can see, your assumption is wrong. You only get an array with a single string because ReadLine() on returns a single string.
谢谢你。请看一下这个快照。您知道为什么inputImagePath变量无效吗?
 

附件

  • VS_Debug.png
    VS_Debug.png
    60.7 KB · Views: 6

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
如果您想了解为什么您的代码无法正常工作。你应该;我恳请您运行此代码,并在阅读“输出”窗口后告诉我。为什么初始化foobar时,foo和bar不再位于字符串数组中?
当您查看此示例代码时,看起来似乎很明显?此代码与您刚犯的错误没有什么不同。

解决这些问题后,请查看您自己的代码,然后告诉我们问题出在哪里?

C#:
        internal static void Main(string[] args) => new Thread(() => Request_Response()) { Name = "Executor" }.Start();
        internal static void Request_Response()
        {
            string[] args = new string[3];
            args[0] = "foo";
            args[1] = "bar";
            foreach (string str in args)
            {
                if (!string.IsNullOrEmpty(str))
                    Debug.WriteLine($"Before declaring args new string[] {str}");
            }
            args = new string[] { "foobar" };
            foreach (string str in args)
            {
                Debug.WriteLine($"After declaring args as new string[] {str}");
            }
        }
我刚喝了一瓶酒,仍然可以看到你的问题。 :)
 

林兹

成员
已加入
2020年4月9日
留言内容
21
编程经验
Beginner
如果您想了解为什么您的代码无法正常工作。你应该;我恳请您运行此代码,并在阅读“输出”窗口后告诉我。为什么初始化foobar时,foo和bar不再位于字符串数组中?
当您查看此示例代码时,看起来似乎很明显?此代码与您刚犯的错误没有什么不同。

解决这些问题后,请查看您自己的代码,然后告诉我们问题出在哪里?

C#:
        internal static void Main(string[] args) => new Thread(() => Request_Response()) { Name = "Executor" }.Start();
        internal static void Request_Response()
        {
            string[] args = new string[3];
            args[0] = "foo";
            args[1] = "bar";
            foreach (string str in args)
            {
                if (!string.IsNullOrEmpty(str))
                    Debug.WriteLine($"Before declaring args new string[] {str}");
            }
            args = new string[] { "foobar" };
            foreach (string str in args)
            {
                Debug.WriteLine($"After declaring args as new string[] {str}");
            }
        }
我刚喝了一瓶酒,仍然可以看到你的问题。 :)
哈哈。谢谢。我看过你的代码。我有点理解逻辑,但是无法有效地利用调试控制台来确定流程。我将仔细查看您的扰流板,以获取有关C#编程的进一步说明。
 

林兹

成员
已加入
2020年4月9日
留言内容
21
编程经验
Beginner
是的。重新阅读您刚刚引用的帖子。
你有什么建议?请参考附件。调用了相同的算法(直接从cmd调用),并且该算法似乎已正确执行,尽管未顺序执行(此处,它一次获取了所有参数)。我希望能够利用```args.Length>1`'',以便可以从控制台考虑其他参数。
 

附件

  • Console_Debug III.png
    Console_Debug III.png
    71.4 KB · Views: 2

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
我有点理解逻辑,但是无法有效地利用调试控制台来确定流程。
将此using指令添加到代码文件的顶部。
using System.Diagnostics;
然后通过查看=打开“输出”选项卡> Output or Crtl + W
您认为打印数据有什么问题?

因为您是新手,所以您需要学习自己解决问题。因为,如果您已经阅读了Microsoft网站(MSDN)上有关初始化和重新初始化对象的文档,则可以发现问题。
 
最佳 底部