gpt4 book ai didi

c - 为什么我的小C循环不能正确打印到帧缓冲区,但是展开的版本可以打印?

转载 作者:行者123 更新时间:2023-12-04 07:48:53 24 4
gpt4 key购买 nike

我正在尝试编写一个简单的C程序,该程序在位置(x,y)=(50,50)处绘制4x4像素的白色实心正方形。

这个想法是直接写入Linux帧缓冲区,该缓冲区始于映射的内存fb-> fp。

现在,问题在于以下代码运行良好:

uint16_t color = 0xffff;

memcpy(fb->fp + (50+0) * fb->line_length + (50+0) * fb->bytes_per_pixel, &color, fb->bytes_per_pixel);
memcpy(fb->fp + (50+0) * fb->line_length + (50+1) * fb->bytes_per_pixel, &color, fb->bytes_per_pixel);
memcpy(fb->fp + (50+0) * fb->line_length + (50+2) * fb->bytes_per_pixel, &color, fb->bytes_per_pixel);
memcpy(fb->fp + (50+0) * fb->line_length + (50+3) * fb->bytes_per_pixel, &color, fb->bytes_per_pixel);

memcpy(fb->fp + (50+1) * fb->line_length + (50+0) * fb->bytes_per_pixel, &color, fb->bytes_per_pixel);
memcpy(fb->fp + (50+1) * fb->line_length + (50+1) * fb->bytes_per_pixel, &color, fb->bytes_per_pixel);
memcpy(fb->fp + (50+1) * fb->line_length + (50+2) * fb->bytes_per_pixel, &color, fb->bytes_per_pixel);
memcpy(fb->fp + (50+1) * fb->line_length + (50+3) * fb->bytes_per_pixel, &color, fb->bytes_per_pixel);

memcpy(fb->fp + (50+2) * fb->line_length + (50+0) * fb->bytes_per_pixel, &color, fb->bytes_per_pixel);
memcpy(fb->fp + (50+2) * fb->line_length + (50+1) * fb->bytes_per_pixel, &color, fb->bytes_per_pixel);
memcpy(fb->fp + (50+2) * fb->line_length + (50+2) * fb->bytes_per_pixel, &color, fb->bytes_per_pixel);
memcpy(fb->fp + (50+2) * fb->line_length + (50+3) * fb->bytes_per_pixel, &color, fb->bytes_per_pixel);

memcpy(fb->fp + (50+3) * fb->line_length + (50+0) * fb->bytes_per_pixel, &color, fb->bytes_per_pixel);
memcpy(fb->fp + (50+3) * fb->line_length + (50+1) * fb->bytes_per_pixel, &color, fb->bytes_per_pixel);
memcpy(fb->fp + (50+3) * fb->line_length + (50+2) * fb->bytes_per_pixel, &color, fb->bytes_per_pixel);
memcpy(fb->fp + (50+3) * fb->line_length + (50+3) * fb->bytes_per_pixel, &color, fb->bytes_per_pixel);


但是,以下不是。
它产生1x4线,而不是4x4正方形。

uint16_t color = 0xffff;

int i = 0;
int j = 0;
for (; j < 4; j++) {
for (; i < 4; i++) {

int y_offset = 50 + j;
int x_offset = 50 + i;

memcpy(fb->fp + y_offset * fb->line_length + x_offset * fb->bytes_per_pixel,
&color, fb->bytes_per_pixel);
}
}


据我所知,它们应该是等效的。
我从编译器获得的程序集版本看起来不太容易理解。

它在ARM嵌入式Linux设备中运行。
此时,没有X服务器或其他任何东西写入帧缓冲区。

fb-> bytes_per_pixel等于2。

我找不到有关如何将帧缓冲区映射到内存的任何文档。我得到的偏移量来自我在Google上找到的随机代码。

这些偏移量可能有问题。
但是至少这两个代码应该等效,不是吗?
我要疯了吗?

最佳答案

这是问题所在:

for (; j < 4; j++) {
for (; i < 4; i++) {
//some code
}
}


外部 for循环应执行4次,这必须执行,因为主体中没有条件 break;语句。
但是,内部的 for循环需要更改。对于外部 for循环的第一次迭代,内部 for循环按预期执行4次。
在外部 for循环的第二次迭代中, i的值为 4,内部 i>4循环中的条件 for为false,因此不会执行。对于外部 for循环的所有后续迭代,也会发生相同的情况。

您可以通过为外部 i循环的每次迭代初始化 for来克服此问题。

选项1:

for( ; j < 4; j++)
{
for (i = 0; i < 4; i++)
{
// Some code
}
}


选项2:

for( ; j < 4; j++)
{
for (; i < 4; i++)
{
// Some code
}
i = 0;
}


选项3:

for( ; j < 4; j++)
{
i = 0;
for ( ; i < 4; i++)
{
// Some code
}
}


选项4:如David C. Rankin所建议:

int j = 0;
// int i = 0;
for( ; j < 4; j++)
{
int i = 0;
for ( ; i < 4; i++)
{
// Some code
}
}

关于c - 为什么我的小C循环不能正确打印到帧缓冲区,但是展开的版本可以打印?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51371836/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com