Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';我的小C循环不能正确地打印到帧缓冲区,但它的展开版本可以吗?_C_For Loop_Embedded Linux_Framebuffer - Fatal编程技术网

为什么';我的小C循环不能正确地打印到帧缓冲区,但它的展开版本可以吗?

为什么';我的小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

我正试图编写一个简单的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);
    }
}
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
    }
}