Поскольку, Пока, Делают Циклы, вызывающие странную ошибку в итерации, относительно переменных - PullRequest
0 голосов
/ 31 августа 2018

Так что я нуб, пожалуйста, отнеси это к контексту. Извините, если я что-то упустил очевидное.

Соблюдайте следующий метод:

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)));*/
}

Метод должен принимать изображение и значение Y. Что он делает с ними, так это то, что при этом значении y изображение будет нарисовано несколько раз - этого достаточно, чтобы хотя бы заполнить экран.

Таким образом, изображение повторяется по экрану вдоль точки на оси Y.

Как видите, я удалил большую часть этой логики, потому что мне нужно отлаживать что-то, что мешает мне.

  • Когда я использую цикл for, эквивалентный присутствующему циклу while, или сам цикл while, кажется, что int counter становится недоступным, пока цикл не завершится. под этим я подразумеваю, что логика, которая умножает 50 на счетчик, происходит только один раз, несмотря на то, что он запускается несколько раз. Это объясняется тем, что вместо четырех изображений, полученных в результате повторения, остается только одно изображение - последнее изображение из четырех.

  • Естественно, код, который я заблокировал как комментарий, в котором повторение выполняется вручную, работает. Я имею в виду, конечно, это должно работать, и так должно быть для циклов for и while. Но почему-то, по какой-то причине, когда переменная счетчика используется для итерации, логика просто дает сбой.

Другое дело, что buffer был создан должным образом путем распределения с использованием текущего контекста и g, который был возвращен SomeForm.CreateGraphics() Так что, пожалуйста, не Не беспокойтесь о графике, она работает нормально, когда я делаю это вручную, как я сказал. buffer допустимо, а используемые параметры действительны.

Заранее спасибо.

Это очень расстраивает.

РЕДАКТИРОВАТЬ: Глупый я, я не объяснил paint_order.

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

1 Ответ

0 голосов
/ 31 августа 2018

Кажется, что всегда есть одна и та же ссылка на переменную counter, переданную в лямбда-выражения, которые вы ставите в очередь, и эти функции вызываются после запуска цикла (таким образом, каждый раз, когда он ссылается на counter, это будет 3) - я ввел новый Переменная создается каждый раз, когда необходимо вычислить новое значение:

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