c 一维数组转为二维数组,甚至多维数组

 通过数组指针来转换

用这种方法可以把屏幕mmap 中的数据转为二维的长乘高的数据。

引申一下,其实这个方法可以在任何几维的数组中互转,因为数组不管几维,数据在内存中都是连续排列的

如果存储类型不是常规的char ,int 等 可以用typedef 先定义。

#include <stdio.h>

int main()
{
     int mm[5] = { 0,1,2,3,4 };

	int (*pm)[3] = (int (*)[3])mm;     //pm 排 ,[3]表示列
	
	printf("%d\n", pm[0][2]);          // {0,1,2},
                                       // {3,4}
	
	return 0;
}

framebuffer  改用 二维数组程序,更好理解



#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <string.h>
#include <unistd.h>
#include <linux/fb.h>

static struct fb_var_screeninfo var;

int main(int argc, char *argv[])
{
	
	
	int fd_fb = open("/dev/fb0", O_RDWR);
	if (fd_fb < 0)
	{
		puts("/dev/fb0 error");
		return -1;
	}
	if (ioctl(fd_fb, FBIOGET_VSCREENINFO, &var))
	{
		puts("ioctl error");
		return -1;
	}
	
//	unsigned int  pixel_width = var.bits_per_pixel / 8;                  //deepin=32
	int screen_size = var.xres * var.yres * var.bits_per_pixel / 8;
	
	unsigned char *fb_base = mmap(NULL, screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0);
	if (fb_base == NULL)
	{
		puts("mmap error");
		return -1;
	}
	
	memset(fb_base,0, screen_size);
	
	/*	for(int h=0;h<var.yres;h++){
	
	for (int s = 0; s <var.xres ; s++)
{
	
	int color =0xff0000; 
	
	//-------------------------------------------------
	unsigned char *pen_8 = fb_base + 1366*4*h+s * 4;   //400*400
	unsigned int *pen_32 = (unsigned int *)pen_8;      //char->int 这句非常重要
	*pen_32=color;
	}
	}*/
	
	for(int a=0;a<768;a++){
		for(int b=0;b<1366;b++){
        	int color=0xff0000;

	        unsigned int (*p)[1366]=(unsigned int (*)[1366])fb_base;
	
          	p[a][b]=color;
		}
	}
	
	
	munmap(fb_base, screen_size);
	
	close(fd_fb);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_59802969/article/details/134570358