标签 知识 下的文章

C define与const的不同

其实这个是困惑了我好久的问题,没想到在上机课做到的题里找到了答案——我的困惑是:#defineconst到底有什么区别。

题目:

#define N 2 
#define M N+1 
#define NUM 2*M+1 
int main(void) 
{  int i; 
   for(i=1;i<=NUM;i++)  printf(“%d\n”,i); 
} 
该程序中的for循环执行的次数是( )
A) 5 B) 6 C) 7 D) 8

答案是6,跑过以后怎么都不理解,这是因为忽略了#define的重大不同。

- 阅读剩余部分 -

利用.htaccess去除CodeIgniter的index.php

个人用的方法,感觉还不错:

<IfModule mod_rewrite.c>
    Options +FollowSymLinks
    RewriteEngine on
    RewriteBase /poster
    RewriteCond $1 !^(index\.php|images|robots\.txt)
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php/$1 [QSA,L]
</IfModule>

如果在根目录,那么把/poster改成/就行了,如果在http://xxx.xxx/aaa 则把/poster改成/aaa

注:
第1行 第9行 判断rewrite模块是否加载,没有加载的话这几行代码不起作用
第2行设置Linux软连接
以上几行去掉无妨。

CSS 图片透明度处理

今天本想改一下bilibili的个人中心界面,然后因为懒,加上没有好的设计思路,就算了(其实主要还是前端技术不给力),本突然想到了图片透明度,找了一下竟然没有这篇的笔记,来mark一下。

img
{
opacity:0.4;
filter:alpha(opacity=40); /* 针对 IE8 以及更早的版本 */
}

其实只要这样就OK了,如果不针对IE甚至只要第一行,关键在于——啥,透明度的单词怎么拼,仅此而已。

关于这个还能变得更高端,在W3School里可以看到效果图,这里就当作拓展阅读给个传送门就行了:
http://www.w3school.com.cn/css/css_image_transparency.asp

如果要做出动画效果,可以考虑jQuery或者是CSS3

C 输入输出double值得处理

今天又做到一道题,在scanf()printf()时对double的处理再度纠结。

    double a, b;

    printf("Please input two numbers(use space to divide): ");
    scanf("%lf%lf", &a, &b);
    printf("1/(1/a+1/b)/2= %f\n", harmmean(a, b));
    return 0;

- 阅读剩余部分 -

PHP 获取访问者IP

这个是最简单的方法,对于开了透明代理之类的是没有办法的,如果内网访问也不能读取正确的外网IP,不过很省力就是了:
$ip = $_SERVER["REMOTE_ADDR"];搞定~

CodeIgniter 分页类的一点总结

这里我们以get与分页的结合为例,因为这点当时我纠结了很久,当然是在M-SHOW时候纠结完的,这次拿来主义了一次,记录一下。

        $this->load->library('pagination');
        $id = $this->input->get('id');

        /**
         *  pagination
         */
        $config['base_url'] = base_url().'poster_admin/works/search';
        $config['per_page'] = 5;
        $config['num_links'] = 7;
        $config['uri_segment'] = '4';
        $config['use_page_numbers'] = TRUE;
        $config['full_tag_open'] = '<ul class="pagination">';
        $config['full_tag_close'] = '</ul>';
        $config['cur_tag_open'] = '<li class="active"><a href="#">';
        $config['cur_tag_close'] = '</a></li>';
        $config['num_tag_open'] = '<li>';
        $config['num_tag_close'] = '</li>';
        $config['prev_tag_open'] = '<li>';
        $config['prev_tag_close'] = '</li>';
        $config['next_tag_open'] = '<li>';
        $config['next_tag_close'] = '</li>';
        $config['first_link'] = FALSE;
        $config['last_link'] = FALSE;
        $config['total_rows'] = $this->works_model->searchNum($id);

        $config['suffix'] = '?id='.$this->input->get('id');
        $config['first_url'] = base_url().'poster_admin/works/search'.'?id='.$this->input->get('id');

        $this->pagination->initialize($config);

- 阅读剩余部分 -

C 保护数组内容,说说const

因为有的时候我们会手贱在函数中传参导致修改数组值,所以就产生了这个东西,特点其实是让编译器报错,告诉你这里不应该被改变。
如:int sum(const int ar[], int n)

如果const int days[MONTHS] = {31, 28, 31},则数组内容就不能改变了。

如果:

double rates[5] = {88.9, 100.12, 59.45, 183.11, 340.5};
const double * pd = rates;

则不能用pc来修改他所指向的数值,可是我们还是能通过rates[0]来修改,因为rates并不是常量。

如果我们换个写法double * const pc = rates那么就可以修改数据,却不能移动指针。

如果将上面两者结合使用,就相当于用了强力胶,怎么都动不了了:const double * const pc = rates

C 函数与多维数组

书上讲到函数正确的定义方法:void sum_cols(int ar[][COLS], int rows)void sum_cols(int ar[][], int rows)则是不正确的,看了半天没明白,后来终于结合着看看懂了,编译器会把数组富豪转换为指针符号,如果是ar[1],则会变成ar+1,可是对于多维数组而言,下一个元素地址在何处不仅取决于类型,还取决于有多少个具体的元素,比如
oid sum_cols(int ar[][4], int rows),那么编译器就知道了,哦,int值4个字节,有4个int的元素,那么我跳到另一个就要走过16个字节,否则的话,就无法正确处理了。

于是诞生了变长数组……(形如:int sum2d(int rows, int cols, int ar[rows][cols]),并非是可以任意改变长度,而是你的函数不用写死了,通过传入前两个参数来决定指针的情况)
rows,cols与指针位置不可颠倒。

C 几个程序,我们来聊聊数组,函数和指针

其实就是把书上的内容自己理解一番,做个连贯的笔记罢了。

#include <stdio.h>
#define SIZE 4

int main(void)
{
    short dates[SIZE];
    short * pti;
    short index;
    double bills[SIZE];
    double * ptf;

    pti = dates;
    ptf = bills;
    printf("%23s %10s\n", "short", "double");
    for (index = 0; index < SIZE; index++)
        printf("pointers + %d: %10p %10p\n", index, pti + index, ptf + index);
    return 0;
}

- 阅读剩余部分 -