问题标签 [off-by-one]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 避免 RLE 算法中的 Python 错误
编辑:这似乎不仅仅是一个错误的错误。
我在以下简单算法中遇到了一个错误,该算法应该显示字符串中的字母数,沿run-length encoding
.
我可以看到为什么最后一个字符没有添加到结果字符串中,但是如果我增加range
ofi
我会得到index out of range
明显的原因。
我想从算法设计的角度了解这里的概念问题,以及让我的代码正常工作。
我是否需要一些特殊情况代码来处理原始字符串中的最后一项?或者将当前字符与previous
字符进行比较可能更有意义,尽管这在算法开始时会造成问题?
这种算法是否有一种通用方法,将当前元素与前一个/下一个元素进行比较,从而避免索引超出范围的问题?
python - Python循环在预期终止后迭代
下面的 Python 代码有一个奇怪的行为,我无法弄清楚。
程序调用 testQuery,它要求用户回答“是”以调用 scoreAverager,或“否”以退出程序。如果调用 scoreAverager,它会要求用户输入一系列分数,或“x”来完成,这会将用户返回到 testQuery,在那里他们可以选择对另一个测试进行平均或退出。
如果用户对几次测试(例如 2 次或更多)的结果进行平均,就会发生奇怪的事情。那时,对 testQuery 给出“否”将无法终止程序。它将为每个平均测试迭代一个额外的循环。我不明白为什么会这样。它看起来和行为都像一个错误的错误,但关闭循环的条件似乎已经满足。它可以通过“休息”来解决,但我宁愿知道更有机地解决它的问题是什么。
谁能让我知道为什么会发生这种奇怪的行为?
代码:
输入/输出示例:
algorithm - Knuth 的 TAOCP 的算法 4.3.1D 中是否存在错误?
你可以找到算法 4.3.1D 的解释,它出现在《计算机编程艺术》一书中。2(第 272-273 页)由 D. Knuth 在本问题的附录中撰写。
看来,在步骤D.6中,qhat
预计最多偏离 1。
让我们假设 base 是2^32
(即我们正在使用无符号的 32 位数字)。让u = [238157824, 2354839552, 2143027200, 0]
和v = [3321757696, 2254962688]
。该部门的预期产出是4081766756
Link
两者u
和都已经按照D.1v
中的描述进行了标准化(并且是零填充的)。v[1] > b / 2
u
循环D.3到D.7的第一次迭代是无操作的,因为qhat = floor((0 * b + 2143027200) / (2254962688)) = 0
在第一次迭代中。
在循环的第二次迭代中,qhat = floor((2143027200 * b + 2354839552) / (2254962688)) = 4081766758
Link。
我们不需要计算步骤D.4和D.5来了解为什么会出现问题。由于qhat
将在D.6中减一,因此算法的结果将作为 出来4081766758 - 1 = 4081766757
,但是,结果应该是4081766756
Link。
我认为算法中存在错误是正确的,还是我的推理存在谬误?
附录
c - 计算一个数组元素比后面的元素大多少次(差一错误)
我正在用 C 编程。我必须创建一个名为 的函数count
,它计算比同一数组中的后续元素大多少倍。例如,如果我们有一个如下所示的主代码:
计数应返回以下内容:
我已经尝试过自己,但似乎我遇到了一个我不知道如何解决的错误。
但这给出了错误的输出:
有人可以在我的代码中发现错误,或者帮助我解决这个问题吗?
c++ - 这两个循环是否等效:一个
这两个循环是一样的吗?出于某种原因,第二个循环是一对一的,我不知道为什么。
assembly - TASM 减一
我目前正在为大学实施 Snake,为此我们必须使用 TASM。
我的主要游戏数据布局如下(使用 C 语法):
问题是每帧写入方向位会覆盖大 x 位置的读取冲突位(38 是最大位置,但它发生得更早)。我说“读取冲突位”是因为我无法验证physical_game_data
实际驻留的位置,因为我不知道如何指示汇编器 ( tasm
) 和/或链接器 ( tlink
) 和/或调试器 ( td
) 向我展示那个。
我的代码中的声明是:
mov
这里我最担心的s (还有几个,但这些是使 bug 可见的两个)是这两个:
然而,看看那些会td
产生这样的结果:
然而,0x05AF 和 0x05B8 之间的差异是 9,而不是 10。我目前通过在源代码中添加 11 来“修复”该问题,这意味着该错误不会发生,但我宁愿正确修复此问题。
我假设这是我对 TASM 或 x86/x86-16 程序集的一些误解,但我不知道这种误解到底是什么。
这是展示此问题的完整文件:
用 using编译tasm MRE.ASM
,用usingtlink MRE.OBJ
打开,反编译后的代码如下:td
td MRE.EXE
同样,0x10C - 0x103 是 9。
如果有兴趣,我正在 Dosbox 下运行此代码。
谢谢!
arrays - 在 Google 表格应用脚本中更新一批单元格时遇到问题
因此,我正在运行一个程序,该程序对大型电子表格进行排序,并根据该行中单个单元格的属性将每一行组织到其他工作表中。我让宏工作了,但它非常慢,所以我返回并从头开始尝试使用块执行而不是重复读取和写入循环中的每个单元格来让它更快地工作。我在下面的 If 语句中遇到了问题。如果我正确解释了错误消息,则它不会读取二维数组的第二部分。我的代码是:
我收到的错误是
“TypeError:无法读取未定义的属性 '6'(第 20 行)”。
第20行,具体是:
我添加了一些测试行以确保信息被正确读取和处理,并且我正在拉正确的单元格。看起来像这样:
在有问题的线路之前,它按预期运行。我用左边的一个细胞进行了测试,我打算用这个细胞来确保我正确地计数了细胞。单元格按预期打印测试行,所以我知道数组实际上是 7 列宽,并且值存在于 if 语句之前的数组中。
我已经花了几天时间研究这个,我在网上找不到任何与我的情况有关的东西。我对编码很陌生,所以这可能很明显,但我会很感激任何可用的指导。
c++ - 拜托,有人能告诉我这段代码有什么问题吗?
拜托,有人能告诉我这段代码有什么问题吗?
c++ - 你如何发现或避免一次次犯错?
当我编写代码时,我创建的更常见的错误类别之一是非一错误 (OBO)。在“真实”代码中,我经常在使用 C 或 C++ 进行复杂的指针/迭代器算术时遇到这个问题,但我有时在面试和作业(例如实现合并排序)问题中也遇到过问题,而我使用了其他编程语言。
我的典型调试策略包括随机交换<
and 和<=
,++var
并将orvar++
附加到变量,直到代码看起来可以工作。我很想知道存在哪些更好的策略或工具(例如静态分析、调试器/IDE 功能等)来发现 OBO。+ 1
- 1
我对诸如“避免 C 风格的循环”、“避免指针算术”、“函数式代码”或“使用不同的编程语言”之类的答案并不特别感兴趣。是的,这些事情可以缓解这个问题,但并不总是可以做到,而且它们并不能完全消除 OBO 的危险。
作为一个例子,我相信下面的代码,一个 C(或者它也是有效的 C++)实现strcpy(3)
,没有 OBO。但正如您所见,OBO 可能会出现数十个潜在问题领域。有什么方法可以轻松确认它实际上没有 OBO 吗?