为什么';我的小C循环不能正确地打印到帧缓冲区,但它的展开版本可以吗?
我正试图编写一个简单的C程序,在位置(x,y)=(50,50)处绘制一个4x4像素的白色实心正方形 其思想是直接写入Linux帧缓冲区,该缓冲区从映射的内存fb->fp开始 现在,问题是以下代码运行良好:为什么';我的小C循环不能正确地打印到帧缓冲区,但它的展开版本可以吗?,c,for-loop,embedded-linux,framebuffer,C,For Loop,Embedded Linux,Framebuffer,我正试图编写一个简单的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); me
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);
}
}
uint16\u t color=0xffff;
int i=0;
int j=0;
对于(;j<4;j++){
对于(;i<4;i++){
int y_偏移=50+j;
int x_偏移=50+i;
memcpy(fb->fp+y\u偏移量*fb->line\u长度+x\u偏移量*fb->字节/u像素,
&颜色,fb->字节/像素);
}
}
在我看来,它们应该是等价的。
我从编译器得到的汇编版本看起来不太容易理解
这在ARM嵌入式Linux设备中运行。
此时没有X服务器或任何其他写入帧缓冲区的内容
fb->字节/像素等于2
我找不到任何关于帧缓冲区如何映射到内存的文档。我得到的偏移量来自我在谷歌上找到的随机代码
也许这些补偿有问题。
但至少这两种代码应该是等价的,不是吗?
我疯了吗?问题是:
for (; j < 4; j++) {
for (; i < 4; i++) {
//some code
}
}
备选案文2:
for( ; j < 4; j++)
{
for (; i < 4; i++)
{
// Some code
}
i = 0;
}
(;j<4;j++)的
{
对于(;i<4;i++)
{
//一些代码
}
i=0;
}
备选案文3:
for( ; j < 4; j++)
{
i = 0;
for ( ; i < 4; i++)
{
// Some code
}
}
(;j<4;j++)的
{
i=0;
对于(;i<4;i++)
{
//一些代码
}
}
选项4:如David C.Rankin所建议的:
int j = 0;
// int i = 0;
for( ; j < 4; j++)
{
int i = 0;
for ( ; i < 4; i++)
{
// Some code
}
}
intj=0;
//int i=0;
对于(;j<4;j++)
{
int i=0;
对于(;i<4;i++)
{
//一些代码
}
}
选项4:移动int i=0的声明和初始化代码>在j
循环中:)
@DavidC.Rankin:哦,真的。谢谢:-)谢谢。我敢肯定我再也不会落入这个陷阱了!
int j = 0;
// int i = 0;
for( ; j < 4; j++)
{
int i = 0;
for ( ; i < 4; i++)
{
// Some code
}
}