If-else构造不起作用

林兹

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

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
再次阅读帖子13和17、20。
 

羊皮

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

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,533
地点
弗吉尼亚州切萨皮克
编程经验
10+
您是否只阅读了第一页 @谢平 的调试链接,而不是后续页面?您应该阅读所有这些内容。但这是关于如何在单步执行代码时检查变量的快速提示(回想一下单步执行代码在第一页):

Now examine the value of args right after you execute the line that says:
C#:
args = new String[] { Console.ReadLine() };
(那是您的帖子#11的第37行,或您的帖子#15的屏幕截图的第54行。)

什么 are the values of the args array? How does that compare to your expected "--input-image"在第11条帖子的第39行或第15条帖子的第56行?
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,533
地点
弗吉尼亚州切萨皮克
编程经验
10+
Now as something completely meta to your current code: Why are you using Console.ReadLine() to interactively get input from the user?

By convention the variable named args of a Main() method refers to the the 命令行参数 passed to the program. This means that these are the parameters passed to the program when you run the program in the CMD or PowerShell console. You are going to confuse other people who read (and use) your code when they see that your Main() takes 命令行参数, but completely ignores them and instead interactively gets input from the user, but expects the user to type in the input as if they were command line parameters.
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
@跳伞 我认为最好坚持为什么值在首次初始化后不再在方法中的问题。我认为最好让我们的OP首先了解他们所报告的问题,然后指出他们对命令args所做的操作也可能是潜在的错误。我也觉得我们的OP也计划提供.exe"as is"请勿在外部将其与任何类型的外壳一起使用。但是请注意,我完全理解您的观点。 +1!
 

林兹

成员
已加入
2020年4月9日
留言内容
21
编程经验
Beginner
Now as something completely meta to your current code: Why are you using Console.ReadLine() to interactively get input from the user?

By convention the variable named args of a Main() method refers to the the 命令行参数 passed to the program. This means that these are the parameters passed to the program when you run the program in the CMD or PowerShell console. You are going to confuse other people who read (and use) your code when they see that your Main() takes 命令行参数, but completely ignores them and instead interactively gets input from the user, but expects the user to type in the input as if they were command line parameters.
我真的很感激。该程序将被部署为控制台应用程序。我的意思是要改进当前算法的当前实现。我们的任务是简化程序流程,使其更加用户友好,同时又不影响核心库。我引入了一个变量来评估args.length的值,并且我注意到不管提供的参数如何,该值始终为1。您认为我可以用<args.String.Split('').ToArray();> function?
 

附件

  • VS_Debug IV.png
    VS_Debug IV.png
    37.5 KB · Views: 2

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,533
地点
弗吉尼亚州切萨皮克
编程经验
10+

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
您认为我可以用<args.String.Split('').ToArray();>
不。

您正在创建相同的问题。为了了解您在做什么错,您需要返回 帖子#17,并测试我给您的代码。为什么?由于您犯的错误,我已经写了。现在,如果您已经在新应用程序中使用和测试了代码,并对其进行了实际调试,那么您将发现自己在做什么错。我什至在VS中将调试写回到输出窗口,以供您识别方法提供的输出。设置一个断点 Request_Response 并逐步介绍我给您的示例,并尝试找出原因 酒吧 以后不打印 args 重新初始化。我和其他人已经指出了您在做错什么,并且我还提供了至少三个不同的链接,如果您已阅读的话;很清楚问题出在哪里。因此,请从第13个帖子开始重新阅读该主题。
 

林兹

成员
已加入
2020年4月9日
留言内容
21
编程经验
Beginner
No.

您正在创建相同的问题。为了了解您在做什么错,您需要返回 帖子#17,并测试我给您的代码。为什么?由于您犯的错误,我已经写了。现在,如果您已经在新应用程序中使用和测试了代码,并对其进行了实际调试,那么您将发现自己在做什么错。我什至在VS中将调试写回到输出窗口,以供您识别方法提供的输出。设置一个断点 Request_Response 并逐步介绍我给您的示例,并尝试找出原因 酒吧 以后不打印 args 重新初始化。我和其他人已经指出了您在做错什么,并且我还提供了至少三个不同的链接,如果您已阅读的话;很清楚问题出在哪里。因此,请从第13个帖子开始重新阅读该主题。
好的。谢谢:我会尽快更新。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
我希望您密切注意我向您展示的内容。我不会告诉你问题所在。但这应该是 痛苦的明显 一旦您查看了代码执行时参数所发生的情况。为什么是 栏已删除 从宣言?

XoNRYSh.gif
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
您能发布您当前的更新代码吗?

让我们上一课,就是那里的文档是有原因的。还请注意,您不应使用来重新初始化变量 新的 运算符,因为这样做会更改您之前使用的实例。您还需要了解为什么这是一个问题,您完全避免在最近的答复中回答或解释该问题。您也不需要使用split(),但正如我们在离线讨论中所述,我知道为什么Skydiver链接了它。您应该做的是像这样设置string [] args的参数:
C#:
                        string[] args = {"", "", "" };
                        args[0] = "foo";
                        args[1] = "fi";
                        args[2] = "fum";
我不知道您是如何从前面的示例中了解到的。但是,如果您解决了此问题,则应该在下一篇文章24中解决。

C#:
   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 -help");
            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("\nPress any key to exit the application.");
                    Console.ReadLine();
                    return;
                }

                           
                args = new String[] { Console.ReadLine() };
您应该注意代码扰流器中突出显示的行。
 

林兹

成员
已加入
2020年4月9日
留言内容
21
编程经验
Beginner
您能发布您当前的更新代码吗?

让我们上一课,就是那里的文档是有原因的。还请注意,您不应使用来重新初始化变量 新的 运算符,因为这样做会更改您之前使用的实例。您还需要了解为什么这是一个问题,您完全避免在最近的答复中回答或解释该问题。您也不需要使用split(),但正如我们在离线讨论中所述,我知道为什么Skydiver链接了它。您应该做的是像这样设置string [] args的参数:
C#:
                        string[] args = {"", "", "" };
                        args[0] = "foo";
                        args[1] = "fi";
                        args[2] = "fum";
我不知道您是如何从前面的示例中了解到的。但是,如果您解决了此问题,则应该在下一篇文章24中解决。

C#:
   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 -help");
            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("\nPress any key to exit the application.");
                    Console.ReadLine();
                    return;
                }

                           
                args = new String[] { Console.ReadLine() };
您应该注意代码扰流器中突出显示的行。
非常感谢你的帮助。我真的很感激。老实说,我是编程新手。我尚未解决在#24上提出的问题。我正在浏览文档以获得更好的理解。我按照建议使用了调试器,它帮助我正确地重新分配了if-else构造的范围。
 

林兹

成员
已加入
2020年4月9日
留言内容
21
编程经验
Beginner
请找到更新的代码。虽然它仍然需要一些工作。 :(

当前实施:
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("-help");
            args = new String[] { Console.ReadLine() };

            //Test if necessary input arguments were supplied.
            if (args.Length == 1 && args[0].Equals("-help"))
            {
                Console.WriteLine("\nHelp:");
                Console.WriteLine("\nPass the arguments as following:");
                Console.WriteLine("\nExample with automatic RGB:\n--input-image c:\\a.png --output-image c:\\Images\\out.txt -width 32 -height 32");
                Console.WriteLine("\nExample with explicit RGB:\n--input-image c:\\a.png --output-image c:\\Images\\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("\nPress any key to exit the application.");
                Console.ReadLine();
                return;
            }

            string inputImagePath =" ";
            string outputImagePath =" ";
            int imageWidth = 0;
            int imageHeight = 0;
            int redThreshold = -1;
            int greenThreshold = -1;
            int blueThreshold = -1;

            string readline = Console.ReadLine();
            string[] args1 = readline.Split(' ');

            if (args1.Length == 8)
            {
                if (args1[0].Equals("--input-image") && File.Exists(args1[1]))
                {
                    inputImagePath = args1[1];
                }
                else
                {
                    Console.WriteLine("\nError: Input file doesn't exist.");
                    Console.WriteLine("\nPress any key to exit the application.");
                    Console.ReadLine();
                    return;
                }

                int separatorIndex = args1[3].LastIndexOf(Path.DirectorySeparatorChar);

                if (args1[2].Equals("--output-image") && separatorIndex >= 0 && Directory.Exists(args1[3].Substring(0, separatorIndex)))
                {
                    outputImagePath = args1[3];
                }
                else
                {
                    Console.WriteLine("\nError: Output Directory doesn't exist.");
                    Console.WriteLine("\nPress any key to exit the application.");
                    Console.ReadLine();
                    return;
                }

                if (!args1[4].Equals("-width") || !int.TryParse(args1[5], out imageWidth))
                {
                    Console.WriteLine("\nError: Image Width should be integer.");
                    Console.WriteLine("\nPress any key to exit the application.");
                    Console.ReadLine();
                    return;
                }

                if (!args1[6].Equals("-height") || !int.TryParse(args1[7], out imageHeight))
                {
                    Console.WriteLine("\nError: Image Height should be integer.");
                    Console.WriteLine("\nPress any key to exit the application.");
                    Console.ReadLine();
                    return;
                }
            }

            else
            {
                if (args1.Length > 8)
                {
                    if (args1.Length < 14)
                    {
                        Console.WriteLine("\nError: All three Red, Green and Blue Thresholds should be passed.");
                        Console.WriteLine("\nPress any key to exit the application.");
                        Console.ReadLine();
                        return;
                    }
                    else
                    {
                        if (args1[0].Equals("--input-image") && File.Exists(args1[1]))
                        {
                            inputImagePath = args1[1];
                        }
                        else
                        {
                            Console.WriteLine("\nError: Input file doesn't exist.");
                            Console.WriteLine("\nPress any key to exit the application.");
                            Console.ReadLine();
                            return;
                        }

                        int separatorIndex = args1[3].LastIndexOf(Path.DirectorySeparatorChar);

                        if (args1[2].Equals("--output-image") && separatorIndex >= 0 && Directory.Exists(args1[3].Substring(0, separatorIndex)))
                        {
                            outputImagePath = args1[3];
                        }
                        else
                        {
                            Console.WriteLine("\nError: Output Directory doesn't exist.");
                            Console.WriteLine("\nPress any key to exit the application.");
                            Console.ReadLine();
                            return;
                        }

                        if (!args1[4].Equals("-width") || !int.TryParse(args1[5], out imageWidth))
                        {
                            Console.WriteLine("\nError: Image Width should be integer.");
                            Console.WriteLine("\nPress any key to exit the application.");
                            Console.ReadLine();
                            return;
                        }

                        if (!args1[6].Equals("-height") || !int.TryParse(args1[7], out imageHeight))
                        {
                            Console.WriteLine("\nError: Image Height should be integer.");
                            Console.WriteLine("\nPress any key to exit the application.");
                            Console.ReadLine();
                            return;
                        }
                        if (!args1[8].Equals("-red") || !(int.TryParse(args1[9], out redThreshold)) || redThreshold < 0 || redThreshold > 255)
                        {
                            Console.WriteLine("\nError: Red Threshold should be in between 0 and 255.");
                            Console.WriteLine("\nPress any key to exit the application.");
                            Console.ReadLine();
                            return;
                        }

                        if (!args1[10].Equals("-green") || !(int.TryParse(args1[11], out greenThreshold)) || greenThreshold < 0 || greenThreshold > 255)
                        {
                            Console.WriteLine("\nError: Green Threshold should be in between 0 and 255.");
                            Console.WriteLine("\nPress any key to exit the application.");
                            Console.ReadLine();
                            return;
                        }

                        if (!args1[12].Equals("-blue") || !(int.TryParse(args1[13], out blueThreshold)) || blueThreshold < 0 || blueThreshold > 255)
                        {
                            Console.WriteLine("\nError: Blue Threshold should be in between 0 and 255.");
                            Console.WriteLine("\nPress any key to exit the application.");
                            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("\nPress any key to exit the application.");
                    Console.ReadLine();
                    return;
                }

            

                Console.WriteLine("\nImage Binarization completed.");
                Console.WriteLine("\nPress any key to exit the application.");

                Console.ReadLine();
          
        }
    }
}
 

林兹

成员
已加入
2020年4月9日
留言内容
21
编程经验
Beginner
你好
您能发布您当前的更新代码吗?

让我们上一课,就是那里的文档是有原因的。还请注意,您不应使用来重新初始化变量 新的 运算符,因为这样做会更改您之前使用的实例。您还需要了解为什么这是一个问题,您完全避免在最近的答复中回答或解释该问题。您也不需要使用split(),但正如我们在离线讨论中所述,我知道为什么Skydiver链接了它。您应该做的是像这样设置string [] args的参数:
C#:
                        string[] args = {"", "", "" };
                        args[0] = "foo";
                        args[1] = "fi";
                        args[2] = "fum";
我不知道您是如何从前面的示例中了解到的。但是,如果您解决了此问题,则应该在下一篇文章24中解决。

C#:
   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 -help");
            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("\nPress any key to exit the application.");
                    Console.ReadLine();
                    return;
                }

                         
                args = new String[] { Console.ReadLine() };
您应该注意代码扰流器中突出显示的行。
您好...考虑更新的代码。您知道我如何在14到197之间进行迭代,而不是使其成为一种单向应用程序。我想为用户提供退出应用程序或重复该过程的选项。如果他指示他想重复该过程,我希望代码从第14行恢复(更新的代码)。
 

林兹

成员
已加入
2020年4月9日
留言内容
21
编程经验
Beginner
Hello

您好...考虑更新的代码。您知道我如何在14到197之间进行迭代,而不是使其成为一种单向应用程序。我想为用户提供退出应用程序或重复该过程的选项。如果他指示他想重复该过程,我希望代码从第14行恢复(更新的代码)。
我一直通过引入while循环来实现迭代。:) while (args[0].Equals("yes"))
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,533
地点
弗吉尼亚州切萨皮克
编程经验
10+
这是时候回答我的元问题了,为什么您的行为就像用户在传递命令行参数一样,而实际上却有一个交互式控制台。我认为,如果您的目标是让用户在受限于控制台UI的情况下更轻松地与ImageBinarizerApp类进行交互,那么与回答严格的命令行相比,用户回答问题/提示要容易得多,参数格式。回想一下,命令行界面与控制台界面之间是有区别的。
 

林兹

成员
已加入
2020年4月9日
留言内容
21
编程经验
Beginner
这是时候回答我的元问题了,为什么您的行为就像用户在传递命令行参数一样,而实际上却有一个交互式控制台。我认为,如果您的目标是让用户在受限于控制台UI的情况下更轻松地与ImageBinarizerApp类进行交互,那么与回答严格的命令行相比,用户回答问题/提示要容易得多,参数格式。回想一下,命令行界面与控制台界面之间是有区别的。
我正在准备使事情变得更简单所需的复杂任务。我喜欢用户响应提示的想法。我也考虑过要添加的许多功能,但目前尚不足以实现它。该应用程序被要求作为控制台应用程序交付。感谢您在此方面坚持不懈。我希望在我了解更多信息的同时为您提供更新。
 
最佳 底部