Внешний цикл for вложенного цикла for будет игнорироваться при выполнении - PullRequest
0 голосов
/ 10 декабря 2018

К сожалению, я застрял на базовом цикле for во время совместного проектирования FPGA.Я хотел бы перебрать массив пикселей.Для этого я хотел бы использовать следующий c-код:

#define WIDTH 640
#define HEIGHT 480 

...

int y = 0;
int x = 0;

for(; y < HEIGHT; y++)
    for(; x < WIDTH; x++)
    printf("X: %4i  Y: %4i Color: %x \n", x, y, (0x3FF & x) << 11 | (0x1FF & y) << 2 | col);

Вывод отладочного терминала следующий:

X:    0  Y:    0 Color: 1 
X:    1  Y:    0 Color: 801 
X:    2  Y:    0 Color: 1001 
X:    3  Y:    0 Color: 1801 
...

Я понятия не имею, почему внешний цикл будет полностью игнорироватьсяа внутренний работает нормально?Внешний цикл останется со значением индекса «0», что не должно иметь место.

Если я инициализирую значения цикла в индексируемом состоянии условия цикла, он будет работать, как и ожидалось.

#define WIDTH 640
#define HEIGHT 480 

...

int y;
int x;

for(y = 0; y < HEIGHT; y++)
    for(x = 0; x < WIDTH; x++)
    printf("X: %4i  Y: %4i Color: %x \n", x, y, (0x3FF & x) << 11 | (0x1FF & y) << 2 | col);

В чем причина того, что первый фрагмент кода не работает?(скомпилировано с gcc, а также с некоторым встроенным компилятором vivado).

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

В конце вашего внутреннего цикла for значение x будет иметь значение WIDTH.Любые итерации подпоследовательности этого цикла x начнутся с WIDTH.Вам нужно будет сбросить значение х в 0 каждый раз.Вот почему ваш второй фрагмент работает, вы сбрасываете x на 0.

for (; y < HEIGHT; ++y)
    for ( x = 0; x < WIDTH; ++x )
        // ...
0 голосов
/ 10 декабря 2018

Давайте посмотрим на петли поближе:

for(; y < HEIGHT; y++)
    for(; x < WIDTH; x++)

Сначала вы войдете во внешний цикл, где y равно 0.Затем вы вводите внутренний цикл, который будет повторять x от 0 до WIDTH.

Затем завершается внутренний цикл, и внешний цикл повторяется, и y становится 1.Затем вы снова попадаете во внутренний цикл, где x равно WIDTH.Таким образом, внутренний цикл никогда не будет повторяться, позволяя внешнему циклу повторяться до тех пор, пока y не достигнет HEIGHT.

Вам необходимо сбрасывать x каждый раз, когда вы начинаете с внутреннего цикла:

for(; y < HEIGHT; y++)
    for(x = 0; x < WIDTH; x++)

Это было бы очень очевидным, если бы вы просто попытались отладить вашей программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...