我正在开发一个可以对PPM文件执行各种效果和操作的程序。但是出于测试原因,它使用cin而不是输入文件。它应该能够同时执行多个效果,但我甚至无法正确执行。我将在一条可以工作的行上运行一个removeBlue(),然后再尝试不同的值,它会删除红色或绿色。诸如此类的事情。有很多代码,所以我会尝试只包含必要的代码。
2
1
P3
1 1
255
50 50 50
例如,使用输入
运行它P3
1 1
255
0 50 50
将返回
2
3
P3
1 2
255
50 50 50
1 2 3
但如果我用
运行它P3
1 2
255
0 50 50
0 2 3
它返回
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
include SessionsHelper
end
我完全不知道是什么导致了这个问题,所以任何帮助都会非常感激。感谢。
答案 0 :(得分:0)
你的算法逻辑结构闻起来很多,这就是我所看到的:
lines_in_file
(对我来说很好看)effect_choice
(从代码中不清楚,在提供多个整数的行上会发生什么,但是根据您的问题描述判断第一个整数是由strToInt
函数effect
是根据effect_choice
的实际值的新效果设置的(对于每一行,最后也不是delete
effect
,因此您正在泄漏每行计数的内存。你当前的效果看起来可能是作为“进程”函数类型的静态函数实现的,所以你不需要分配它们中的每一个,只需存储所请求函数的特定内存地址。你称它为processImage
,而你只处理线,而不是整个图像。effect
针对当前行三元组运行例如输入:
2
3
P3
1 2
255
50 50 50
1 2 3
我相信(不能运行它,因为你没有提供很多代码)会发生这种情况:
读取行,并且每个特定行发生这种情况:
第“2”行:effect_choice = 2
,effect = RemoveGreen
,零三元组解析为points
,RemoveGreen::processImage()
遍历空向量,空矢量打印(即无)。
第“3”行:effect_choice = 3
,effect = RemoveBlue
,零三元组解析为points
,RemoveBlue::processImage()
遍历空向量,打印空矢量。
行“P3”:行:{"P3", "1 2", "255"}
打印,零三元组解析为points
,RemoveGreen::processImage()
遍历空向量,打印空矢量。
行“1 2”:effect_choice = 1
,effect = RemoveRed
,零三元组解析为points
,RemoveRed::processImage()
运行空向量,打印空矢量。
行“255”:effect_choice = 255
,零三元组解析为points
,RemoveRed::processImage()
运行空向量,打印空矢量。
行“50 50 50”:effect_choice = 50
,一个三元组{50, 50, 50}
已解析为points
,RemoveRed::processImage()
在其上运行,已修改三元组输出{0, 50, 50}
。< / p>
行“1 2 3”:effect_choice = 1
,effect = RemoveRed
,一个三元组{1, 2, 3}
解析为points
,RemoveRed::processImage()
遍历它,修改了三元组输出{ {1}}。
所有这一切都应该在调试器中清晰可见,同时踩过代码,所以你可能没有调试它,从而使我的问题得到了解决,随着时间的推移你会付出巨大的痛苦,因为没有调试器的调试是更难。
编写代码而不考虑算法和代码体系结构使得调试批次的可能性更大,因此通过编写代码开始浪费更多时间。
您应该首先设计一些算法和代码体系结构(处理哪些数据,何时需要新内存,如何释放它们,代码需要循环的位置,需要跳过的位置,或仅运行曾经,等等。)
只写出如何在单行注释中工作的概述,然后将过于通用的注释分成更简单的步骤,直到它们可以通过几行C ++代码实现,并移动/修改它们直到你觉得想要的算法将实施时添加了最少的“残余”(大多数评论确实如此,真正要求的是什么,例如“将红色设置为零”,并且任何处理/准备/移动/等等仅限于您无法避免的情况它通过更智能的设计)。 (例如,在您当前的代码中,您可以在不循环的情况下读取文件的标题,并且只在像素数据注入后才开始循环)
然后编写代码,开始可能有一些空的函数定义,这样你就可以在调试器中“运行”它并验证空白是否有效,然后实现你认为足够明确的注释(或者它们的一小组)实施并且可以轻松测试(对尚未实现的部件没有很大的依赖性)。 Debug +测试新代码。如果它有效,请尝试清理源代码以删除任何不需要的东西,正在进行的变量名称等等......然后验证它是否适用于最终版本。
再次执行另一条评论(组),直到实施完成。
使用单元测试使写短编码,测试+调试,清理源更加简单,特别是在这样的情况下,I / O是纯数据,因此很容易提供专门的测试输入数据进入测试,并验证预期的输出数据是否产生。