- 论坛徽章:
- 0
|
指针数组 & 数组指针 int main(int argc, char **argv) { }
getopt 函数
int (*p)[6]; p = &array;
busybox
课堂笔记:
/*********************** * 指针与数组 **********************/
指针是一种保存变量地址的变量。
1、指针与地址
&取地址,只能用于变量和数组元素。 指针的声明,赋值,类型。 间接引用。&*a
2、指针与函数参数
swap()
用指针传结构体(可选)
3、指针与数组
数组声明。含义。 数组初始化,赋值。 数组名,与指针的对应关系。 类似的操作方式。
在函数定义中,形参 char s[] 等价于 char *s
4、地址算术运算
指针的比较,运算,+、-、自增。强调类型。强调(*ip)++的括号。 指针和整型的关系。互相可以转化,不可移植。
5、字符指针与函数
字符串常量是一个字符数组。
char amessage[] = "hello world!"; char *pmessage = "hello world!";
strcpy strcat strcmp
6、指针数组以及指向指针的指针
指针数组与数组指针。
7、多维数组
8、指针与多维数组
9、命令行参数
10、指向函数的指针
11、复杂声明
编程实例: 1.编写一个函数,可以对一个任意的二级数组进行控制:
#include <stdio.h> #include <stdlib.h> #include <string.h>
#define M 20 #define N 20 /* void showarray(int arr[][N],int m,int n) { int i,k; for(i=0;i<m;i++) { for(k=0;k<n;k++) printf("%d ",arr[i][k]); printf("\n"); } } */
void showarray(int *parr,int m,int n) { int i,k; for(i=0;i<m;i++) { for(k=0;k<n;k++) printf("%d ",*(parr+4*i+k)); printf("\n"); } }
main(void) { int arr[M][N]; int i,k; for(i=0;i<M;i++) for(k=0;k<N;k++) arr[i][k]=i+k; showarray((int *)arr,M,N); }
2.用较快的效率找出1~1000之内的质数: #include <stdio.h> #include <stdlib.h>
#define MAX 1000 main(void) { int array[MAX+1]; int prime[MAX/2]={0}; int i,k; int prime_count=0; for(i=0;i<MAX;i++) array[i]=1; /* for(i=0;i<MAX;i++) printf("%d ",array[i]); printf("\n");
for(i=0;i<MAX/2;i++) printf("%d ",prime[i]); */
for(i=2;i<MAX;i++) { for(k=0;prime[k]!=0;k++) { if(i% prime[k] == 0) { array[i] = 0; break; } } if(array[i] == 1) { prime[prime_count]=i; prime_count++; } }
printf("%d prime numbers:\n",prime_count); for(i=0;i<prime_count;i++) printf("%d ",prime[i]); }
3.两个可以自由反弹的小球,彼此有碰撞反应: :::::::::::::: fb_draw.c :::::::::::::: #include "fb_draw.h"
#if 1 struct fb_st { struct fb_fix_screeninfo fix; struct fb_var_screeninfo var; unsigned long bpp; int fd; char *fbp; }; #endif
static struct fb_st fb0;
int fb_open(void) { int ret;
fb0.fd = open("/dev/fb0", O_RDWR); if (-1 == fb0.fd) { perror("open"); goto error; }
/* get fb_var_screeninfo */ ret = ioctl(fb0.fd, FBIOGET_VSCREENINFO, &fb0.var); if (-1 == ret) { perror("ioctl(fb0.var)"); goto close_fd; }
fb0.bpp = fb0.var.bits_per_pixel / 8;
/* get fb_fix_screeninfo */ ioctl(fb0.fd, FBIOGET_FSCREENINFO, &fb0.fix); if (-1 == ret) { perror("ioctl(fb0.fix)"); goto close_fd; }
/* get framebuffer start address */ fb0.fbp = mmap(NULL, fb0.fix.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fb0.fd, 0); if ((void *)-1 == fb0.fbp) { perror("mmap"); goto close_fd; }
return 0;
close_fd: close(fb0.fd); error: return -1; }
void fb_close() { munmap(fb0.fbp, fb0.fix.smem_len); close(fb0.fd); }
void fb_draw_point(int x, int y, int color) { unsigned long offet;
offet = fb0.bpp * (x + y * fb0.var.xres); memset(fb0.fbp + offet, color, fb0.bpp); }
int xres(void) { return fb0.var.xres; }
int yres(void) { return fb0.var.yres; } :::::::::::::: fb_draw.h :::::::::::::: #ifndef HS_FB_DRAW_H #define HS_FB_DRAW_H
#include <sys/mman.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/ioctl.h> #include <unistd.h>
#include <stdio.h> #include <stdlib.h> #include <string.h>
#include <linux/fb.h>
#if 0 struct fb_st { struct fb_fix_screeninfo fix; struct fb_var_screeninfo var; unsigned long bpp; int fd; char *fbp; }; #endif
int fb_open(void); void fb_close(void); void fb_draw_point(int x, int y, int color);
int xres(void); int yres(void);
#endif :::::::::::::: main.c :::::::::::::: /******************************* 修改menu.lst title XXXXOS (2.6.XX) root (hd0,X) kernel /boot/vmlinuz-2.6.XXX ro root=XXX quiet vga=0x318
在kernel那行最后添加vga=0x318或vga=792 (前面十六进制,后面十进制,参考下表)
vga=可设置的值可以用工具fbset(没有的话用sudo apt-get install fbset装),/etc/fb.modes,或sudo hwinfo --framebuffer参考,主要还是以hwinfo为主(sudo apt-get install hwinfo)
下表列出一些常用值:
# FRAMEBUFFER RESOLUTION SETTINGS # +----------------------------------------------------------------+ # | 640x480 800x600 1024x768 1280x1024 1280x800 1600x1200 # ----+------------------------------------------------------------- # 256 | 0x301=769 0x303=771 0x305=773 0x307=775 0x31C=796 # 32K | 0x310=784 0x313=787 0x316=790 0x319=793 0x360=864 0x31D=797 # 64K | 0x311=785 0x314=788 0x317=791 0x31A=794 0x361=865 0x31E=798 # 16M | 0x312=786 0x315=789 0x318=792 0x31B=795 0x362=866 0x31F=799 # +----------------------------------------------------------------+ *******************************/
#include <stdio.h> #include <stdlib.h>
#include "fb_draw.h" #include "fb_draw.c" #include <unistd.h>
struct cycle_data{ int middle_x; int middle_y; int step_x; int step_y; int start_x; int start_y; int r; }cycle1,cycle2;
void cube(int startx, int starty,int xl,int yl,int color) { int x; int y; int endx,endy; endx=startx+xl; endy=startx+yl; if(endx > xres()) endx = xres(); else if(endy > yres()) endy = yres(); for(x=startx;x < startx+xl; x++) for(y=starty;y<starty+yl;y++) fb_draw_point(x,y,color); }
void cycle(int middle_x, int middle_y, int r, int color) { int startx = middle_x - r; int starty = middle_y - r; int x; int y;
for(x=startx;x < startx+2*r; x++) { if(x >= xres()-r || x <= 0+r) break; for(y=starty;y<starty+2*r;y++) { if(y >= yres()-r || y <=0+r) break; if(((x-middle_x)*(x-middle_x) + (y-middle_y)*(y-middle_y)) <= r*r) fb_draw_point(x,y,color); } } }
void clearscreen(void) { int x,y; for (x = 0; x < xres(); x++) for (y = 0; y < yres(); y++) { fb_draw_point(x, y, 0x30); } }
void move(int middle_x, int middle_y, int r, int color) { int time; int step_x = 1; int step_y = 1; int x; int xend = xres(); int yend = yres(); int random;
while(1) { srand(getpid()); random = rand() % 10; cycle(middle_x,middle_y,r,color); /* for(time=0;time<1000000;time++) { } */ usleep(6000); cycle(middle_x,middle_y,r,0x30); middle_x += step_x; middle_y += step_y; if(middle_x >= xend-r) step_x = -1*random; else if(middle_x <= 0+r) step_x = 1*random; else if(middle_y >= yend-r) step_y = -1*random; else if(middle_y <= 0+r) step_y = 1*random; } }
void wall_return(int middle_x, int middle_y,int r,int *step_x, int *step_y) { int random; int xend,yend; srand(getpid()); random = rand() % 10; xend = xres(); yend = yres(); if(middle_x >= xend-r) *step_x = -1*random; else if(middle_x <= 0+r) *step_x = 1*random; else if(middle_y >= yend-r) *step_y = -1*random; else if(middle_y <= 0+r) *step_y = 1*random; } void ball_return(int r) { int x_dis = cycle1.middle_x - cycle2.middle_x; int y_dis = cycle1.middle_y - cycle2.middle_y; //x_dis = x_dis >0 ? x_dis : x_dis * (-1); //y_dis = y_dis > 0 ? y_dis : y_dis * (-1); if((x_dis*x_dis + y_dis*y_dis) <= 4*r*r) { if(x_dis > y_dis) // keep step_y,reverse step_x { cycle1.step_x = -1 * cycle1.step_x; cycle2.step_x = -1 * cycle2.step_x;
} else //keep step_x,reverse step_y { cycle1.step_y = -1 * cycle1.step_y; cycle2.step_y = -1 * cycle2.step_y; } } }
void double_move(int middle_x1, int middle_y1,int middle_x2, int middle_y2, int r, int color) { cycle1.step_x = 1; cycle1.step_y = 1; cycle1.middle_x = middle_x1; cycle1.middle_y = middle_y1; cycle2.step_x = 1; cycle2.step_y = 1; cycle2.middle_x = middle_x2; cycle2.middle_y = middle_y2;
while(1) {
cycle(cycle1.middle_x,cycle1.middle_y,r,color); cycle(cycle2.middle_x,cycle2.middle_y,r,0xe0); /* for(time=0;time<1000000;time++) { } */ usleep(6000); cycle(cycle1.middle_x,cycle1.middle_y,r,0x30); cycle(cycle2.middle_x,cycle2.middle_y,r,0x30); cycle1.middle_x += cycle1.step_x; cycle1.middle_y += cycle1.step_y;
cycle2.middle_x += cycle2.step_x; cycle2.middle_y += cycle2.step_y; ball_return(r);
wall_return(cycle1.middle_x, cycle1.middle_y,r, &cycle1.step_x, &cycle1.step_y); wall_return(cycle2.middle_x, cycle2.middle_y,r, &cycle2.step_x, &cycle2.step_y); } } int main(void) { int x, y; int ret;
ret = fb_open(); if (ret != 0) { fprintf(stderr, "fb_open() error.\n"); exit(1); }
// for (x = 0; x < xres(); x++) // for (y = 0; y < yres(); y++) { // fb_draw_point(x, y, 0x30); // }
// for (x = 300; x < 400; x++) // for (y = 301; y < 400; y++) { // fb_draw_point(x, y, 0xaf); // }
// cube(100,100,400,400,0xaf); // cube(25,25,100,100,0x30); clearscreen(); // cycle(300,400,40,0xaf); // cube(600,500,25,25,0xaf); // move(10,100,15,0xaf); double_move(10,100,200,100,8,0xaf); //printf("xres=%d,yres=%d\n",xres(),yres()); fb_close(); return 0; } :::::::::::::: sample.c :::::::::::::: #include <sys/mman.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/ioctl.h> #include <unistd.h>
#include <stdlib.h> #include <string.h>
#include <linux/fb.h>
static struct fb_fix_screeninfo fix; static struct fb_var_screeninfo var; unsigned long bpp;
static unsigned long get_addr(int x, int y); void set_square(char *fbp, int x1, int y1, int x2, int y2, int color);
int main(void) { int fd; int ret; char *fbp;
fd = open("/dev/fb0", O_RDWR); if (-1 == fd) { perror("open"); exit(1); }
/* get fb_var_screeninfo */ ret = ioctl(fd, FBIOGET_VSCREENINFO, &var); if (-1 == ret) { perror("ioctl(var)"); close(fd); exit(1); }
bpp = var.bits_per_pixel / 8;
/* get fb_fix_screeninfo */ ioctl(fd, FBIOGET_FSCREENINFO, &fix); if (-1 == ret) { perror("ioctl(var)"); close(fd); exit(1); }
/* get framebuffer start address */ fbp = mmap(NULL, fix.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if ((void *)-1 == fbp) { perror("mmap"); close(fd); exit(1); }
/* set background */ memset(fbp, 0, fix.smem_len);
/* set a pixel */ //memset(fbp + 9000, 0xff, bpp);
memset(fbp, 0xff, fix.smem_len); set_square(fbp, 400, 300, 500, 400, 0);
ret = munmap(fbp, fix.smem_len); if (-1 == ret) { perror("munmap"); close(fd); exit(1); }
close(fd);
return 0; }
/* return offset */ static unsigned long get_addr(int x, int y) { /* return (var.bits_per_pixel / 8) * (x + y * var.xres) */ return bpp * (x + y * var.xres); }
void set_square(char *fbp, int x1, int y1, int x2, int y2, int color) { int i, j; unsigned long start, end;
for (i = y1; i <= y2; i++) { start = get_addr(x1, i); end = get_addr(x2, i); memset(fbp + start, color, end - start + bpp); }
}
|
|