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;
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值