Profilo扑拉扑拉FotoBlogElenchi Strumenti Guida

Blog


27 marzo

温习

C编译器编译过程:
   预处理器->编译器->assembler->加载连接编译器(loader/link-editor).
   预处理器做常量扩展和宏展开。
  编译器:词汇分析,语法分析,语义分析,源代码转编译码,编译最佳化,其中有“符号表格管理器”用来记录变量名称、形式、范围跟函数名称、返回形式、传递参数。“还有错误处理器“用来记录一连串编译动作碰到的错误并作出的警告响应。
  编译器在做编译时,从源代码开头开始编译代码,因为有“符号表格管理器”的记录动作。我们再写程序代码时,要使用变量限定义,要使用函数也要先定义,这些都符合编译器的由上而下的编译原则。
  C语言程序结构:
          声明区,定义区,实作区。
ps:
    C++的变量可以在任何地方声明,C则不可以
25 marzo

    孤陋寡闻阿,以前只顾看忙着编译环境设置,没怎么仔细看源代码,今天看了ffmpeg中h264.c文件,感叹高手的变幻莫测,居然在源文件中先定义众多内部接口和几个外部接口,末了又定义了一个全局的结构变量,结构中定义了几个函数指针,再把外部接口付给这个结构变量中的函数指针,然后在别的文件中通过extern应用声明使用,真是巧妙,既不用函数声明,又省了个头文件。
   还有一个通过include另外一个cpp文件来连接两个cpp文件,不按常理出牌,真实厉害啊。
   能到这种水平的都是人精啊,我啥时候也…………
 
22 marzo

牛刀小试

今天终于把ffmpeg的libavcode.dll库调试出来了。
昨天运行libavcodec库时,用的是libavcodec.dsw工程,编译出现
gcc vp3dsp_sse2
'gcc' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
今天上午把mingw32安装了一下,还是失败。
于是去ffshow的homepage查了一下,原来 1.Milan Cuta为了使用模板已不再支持vc6.0编译器。
改用ICL(intel c compiler)和MSVC7.1编译。2.DirectXSDK用的是9.0B版本的的。
还好下载了DirectX9bSDK并把nasm.exe拷倒MSVC7.1后编译成功,也算今天没有白过
 
今天浏览网页总是看到 陌生单词 “wiki”, 打开百度赶紧科普一下:
    WIKI概念的发明人是Ward Cunningham,该词来源于夏威夷语的“wee kee wee kee”,原本是“快点快点” (quick)的意思。
  Wiki--一种多人协作的写作工具。Wiki站点可以有多人(甚至任何访问者)维护,每个人都可以发表自己的意见,或者对共同的主题进行扩展或者探讨。
  Wiki指一种超文本系统。这种超文本系统支持面向社群的协作式写作,同时也包括一组支持这种写作的辅助工具。有人认为,Wiki系统属于一种人类知识网格系统,我们可以在Web的基础上对Wiki文本进行浏览、创建、更改,而且创建、更改、发布的代价远比HTML文本小;同时Wiki系统还支持面向社群的协作式写作,为协作式写作提供必要帮助;最后,Wiki的写作者自然构成了一个社群,Wiki系统为这个社群提供简单的交流工具。与其它超文本系统相比,Wiki有使用方便及开放的特点,所以Wiki系统可以帮助我们在一个社群内共享某领域的知识。
这年头,是信息量太大了,还是我更新速度太慢了?!
 
 
21 marzo

还算不错

昨天晚上听群里一个哥们儿说,他在ffdshow中把ffmpeg部分提取出来了,
而且顺利的解出了x264压缩的码流。
这应该是可行的,ffmpeg中的mmx/sse部分好像在windows下无法运行。
而ffdshow可以在windows下可以编译,那么ffdshow中的ffmepg库可能
已经修改过了,现在的难度是单独分离264解码模块,因为ffmpeg中的文
件比较杂,组织依赖关系一时很难理清,哈哈,不过总归还是看到了希望。
下了个WinCvs1.2,上cvs服务器寻觅一个ffdshow的最新版本去。
自己怎么感觉跟一搬运工似的,唉……,什么时候公司能自己去研发一套
的codec!
17 marzo

一路小跑

传递char**指针的问题:
 今天在写一个小程序时遇到一个要传递字符串二维数组指针给显示函数,起初是报错无法转换ch[][]到char**的问题,在那个显示函数中对ch进行(char**)强制转换后,接着函数又不能正常工作,nnd查了半天才搞清楚,
 虽然指针传过去了,可是变成了char*类型的,*ch值直接就是ch[0][0]的值,而不再是ch[0],说到这里,谈一下二维数组数组指针,在ch[][]中,&ch,ch,*ch,ch[0][0]的值是一样的,这里好像为二维数组指针配备了一个计数器,在它到达char[0][0]之前指针始终指向它本身的地址,当然它也可能是为了避免了额外为指针分配新的空间。
 下面这个例子就不一样了
 int *p=(int*)malloc(sizeof int);
 int **pp=&p;
 printf("%x %x ",pp,p );
 结果:
 12ff7c 370fe0
 这里pp跟p的值不相同,当然也可以强制实现它们指向相同的地址,该地址也是它们的存储地址:
 int *p=(int *)malloc(4);
 free(p);
 int *pp;
 int ** tmp=&p;
 p=(int*)tmp;
 pp=p;
  printf("%x %x %x %x",pp,p,*p,*pp );
 结果:
 12ff7c 12ff7c 12ff7c 12ff7c
 言归正传,接收到指针后,二维数组的一些有关信息就丢了,只能按照一维数组来显示二维数组的数据。当然必须把数组的
 维数传进来,除非你自己清楚。具备这些以后,我们就可以用putchar()逐个字符显示。