【问题标题】:For, While, Do Loops causing strange error in iteration, concerning variablesFor, While, Do 循环在迭代中导致奇怪的错误,关于变量
【发布时间】:2019-02-05 22:54:22
【问题描述】:

所以我是一个菜鸟,请把它放在上下文中。如果我遗漏了任何明显的内容,我很抱歉。

观察以下方法:

public static void DrawImageRepeatHoriz(Bitmap i, int y)
{
    int counter = 0;                
    while (counter < 4)
    {
        paint_order.Enqueue(() => buffer.Graphics.DrawImage(i, new 
        Point(50 * counter, 0)));
        counter++;                    
    }

    /*paint_order.Enqueue(() => buffer.Graphics.DrawImage(i, new 
    Point(0 * 50, 0)));
    paint_order.Enqueue(() => buffer.Graphics.DrawImage(i, new 
    Point(1 * 50, 0)));
    paint_order.Enqueue(() => buffer.Graphics.DrawImage(i, new 
    Point(2 * 50, 0)));
    paint_order.Enqueue(() => buffer.Graphics.DrawImage(i, new 
    Point(3 * 50, 0)));*/
}

该方法应该接受一个 Image 和一个 Y 值。它的作用是在那个 y 值下,图像将被绘制几次 - 足以让它至少填满屏幕。

所以它会沿着 y 轴上的点在屏幕上重复图像。

如您所见,我已经删除了大部分逻辑,因为我必须调试一些妨碍我的东西。

  • 当我使用与存在的 while 循环等效的 for 循环或 while 循环本身时,int counter 似乎在循环结束之前变得不可用。我的意思是,将 50 乘以计数器的逻辑只发生一次,尽管它运行了多次。这导致的原因是,重复产生的图像不是四张,而是只有一张——四张中的最后一张。

  • 当然,我已将代码屏蔽为注释,其中手动完成重复操作。我的意思是,当然,它应该工作,for 和 while 循环也应该工作。但不知何故,当计数器变量被用于迭代时,逻辑就动摇了。

这里的其他内容是 buffer 已通过使用当前上下文和由 SomeForm.CreateGraphics() 返回的g 正确分配所以请不用担心图形按我说的手动做就好了。buffer有效,使用的参数有效。

提前致谢。

这很令人沮丧。

编辑:愚蠢的我,我没有解释paint_order

static Queue<Action> paint_order = new Queue<Action>(20);

【问题讨论】:

  • 代码一遍又一遍地将同一个对象排入队列。所以所有队列条目都与最后一个相同。使用新的 Bitmap(Image) 构造函数创建一个真实的副本。
  • 这发生在我身上,我试过了,也许我在尝试时做错了什么。我会再试一次。
  • @HansPassant 好的,所以我尝试过,但又失败了。但是现在我想起来了,如果它是手动工作的,那意味着被排队的Actions 是不一样的。这也可以从以下事实中看出:尽管使用了相同的图像,但始终会创建 new Point 对象。所以他们不可能是一样的吧?

标签: c# winforms for-loop while-loop gdi+


【解决方案1】:

似乎总是有相同的引用 counter 变量传递给你排队的 lambdas 并且在循环运行后调用这些函数(这样每次它引用 counter 它将是 3) - 我已经介绍了新的每次需要计算新值时实例化变量:

for (int counter = 0; counter < 4; counter ++)
{
    var pointCoord = 50 * counter;
    paint_order.Enqueue(() => buffer.Graphics.DrawImage(i, new 
    Point(pointCoord, 0)));
}

【讨论】:

  • 好的,我马上试试!谢谢!如果它有效,我一定会喜欢这个。
  • 是的,它有效。太奇怪了,我不能直接使用它,我必须习惯这个。
  • 几个月前这让我大吃一惊
  • @Dominic 当您在问题中直接使用counter 时,所有排队的函数都引用同一个counter 变量(内存中的相同位置),因此当它们被执行时(在您的方法结束之后) 内存中存储counter 的位置已设置为3(循环结束后)。我的响应中的代码在每次迭代时都会创建新变量(在内存中的新位置),因此每个函数都引用不同的值
  • It's so weird that I can't use it directly though @Dominic 理解这一点的关键是要意识到虽然每个循环迭代(即其中 4 个)都有一个单独的 pointCoord 变量,但只有 一个 counter.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多