免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1066 | 回复: 0
打印 上一主题 下一主题

第四周:C语言 数组和指针 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-21 08:41 |只看该作者 |倒序浏览
指针数组 & 数组指针
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);
     }

}

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP