本站动态:

预览模式: 普通 | 列表

shoColorCode代码加亮程序更新记录

头文件的部分规则:重定义相关

Author: Shosh
Site: http://www.wscxy.com

RULE1: 每个头文件都用以下宏包起来,防止被其他文件多次包含。
    #ifndef __FILENAME_H__
    #define __FILENAME_H__

查看更多...

分类:C/C++ | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 73

杂谈:Brew上的应用开发

Author: Shosh
Site: http://www.wscxy.com

对于MMI工程师在BREW上的开发需求,往往是以Applet为单位的。Brew上的Applet就是一个应用程序,和Application的概念类似。

大多数Applet都需要UI界面(Daemon程序的需求往往很少),他们往往需要完成一定的功能,所以有逻辑的部分,如计算器程序,就是要处理用户输入的数据并给出计算结果;另外,我们需要提供显示界面和用户进行交互,越是动感越是绚丽的界面效果越能赢得用户的喜爱。话说回来,MMI层次上开发的应用,逻辑上大多比较简单,不需要复杂的算法。开发者不必了解太多的底层知识和硬件知识,只要有扎实的程序语言开发功底(BREW上多数用C,也有用C++的),基本上都能写出一般的应用来。另外,逻辑部分的代码变动性不强,而界面效果在不同的工程间则可以相差很大,还是拿计算器程序来举例,我们在不同的手机上看到的计算器程序,有的界面效果看上去很一般,而有的则很漂亮,但是他们完成的功能是差不多的。而对于一个公司来讲,他们往往希望同一套代码能够适应不同工程项目上的需求,这样可以在很大程度上减少工作量。其实这是客制化的一部分,最理想的客制化是不需要修改代码,只要替换图片资源、字符串资源和其他一些资源如音频资源即可达到目的。但是如果差异较大,光靠资源的替换是很难满足需求的,还是需要修改到代码的。我们会希望尽量少地改动到逻辑代码,最好是只需要修改到一些数据,而不用去修改实质性的代码,而功能逻辑上的一致性给了我们一定的可能。说了这么多,其实是说:我们在设计的时候尽量考虑通用性,以提高代码的复用率以及风格变换的简易性。

目前,在Brew上开发界面,主要使用BUIW。在BUIW中,主要有Form, RootForm, Container, Widget, Decorator, Model等概念。下面简单介绍一下这些基本概念:

Model:其实Model是一个用来存放数据的结构。它提供专门的接口让用户设置Model的值或得到Model的值。另外Model还负责维护Listener List,并提供接口允许对象监听它(将Listener加入到Listener List中)。当用户通过Model提供的设置数据的接口改变Model的值的时候,Model就会逐个给监听它的Listener对象发送消息(实际上是直接调用Listener注册的回调函数),监听的对象再做出相应的动作,如使用新设置进来的数据更新画面等。其实这里应用了设计模式中的观察者模式(Abserver Pattern)。Model分很多种,比较常用的有Value Model, Interface Model, Vector Model等,不同种类的Model存放的数据类型不同。一般情况下,一个Widget会关联上一种Model,并监听Model数据的改动。

查看更多...

分类:brew开发 | 固定链接 | 评论: 1 | 引用: 0 | 查看次数: 155

最新Android SDK 地址

最新Android开发地址: http://developer.android.com/sdk/index.html
以前在国内这个地址好像是打不开的,不过现在可以了。

Android快速起步(搭建Android环境)
Quick Start:
The steps below provide an overview of how to get started with the Android SDK. For detailed instructions, start with the Installing guide.

查看更多...

分类:Android开发 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 209

第三章: 进程同步机制

第三章: 进程同步机制

3.1 信号量和P、V操作

信号量:表示资源使用情况的一种数据结构

struct{
	int n; //正数表示当前可用的资源个数,负数表示等待该种资源的进程个数
	PCB* pcbList; //等待该种资源的进程(PCB)列表
}

信号量的值仅由P、V操作来改变

原语:机器指令的延生,往往是为完成某些特定功能而编制的一段系统程序,其操作具有不可分割性(一次性完成)

查看更多...

分类:操作系统 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 259

第二章: 进程概念

第二章: 进程概念

2.1 进程的概念

资源的分配单位、并发执行的基本单位、能独立运行的单位

进程:程序在并发环境中的执行过程。

程序本身是具有顺序性的(顺序执行),它的并发执行是通过进程来实现的。

查看更多...

分类:操作系统 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 203

第一章: 操作系统引论

都是概念性的东西,稍微了解下即可。

操作系统的功能:

  • 存储器管理
    • 内存分配
    • 地址映射:把逻辑地址映射为内存的物理地址
    • 内存保护:各程序之间的内存如何做到不冲突
    • 内存扩充:提供虚拟内存
  • 处理机管理
    • 作业调度
    • 进程调度
    • 进程控制
    • 进程通信
  • 设备管理
    • 缓冲区管理
    • 设备分配
    • 设备驱动
    • 设备无关性:方便编程使用
  • 文件管理
    • 文件存储空间管理
    • 文件操作
    • 目录管理
    • 读写管理和存取控制
  • 用户接口
    • 命令界面
    • 程序界面
    • 图形界面

操作系统的特点:

  • 并发(宏观上的,与并行相区分)
  • 共享
  • 异步

操作系统的类型:

  • 批处理系统:单道+多道(作业)批处理系统
    • 多道批处理系统虽然多个作业成批进行,但是缺乏与用户的交互性
  • 分时系统
    • 分时:若干并发程序对CPU时间的共享
    • 多个用户终端共用主机
    • 特点:
      • 同时性:多个用户同时使用
      • 交互:用户可控制程序的运行
      • 独立:用户感觉不到其它用户的存在,感觉自己在独立使用计算机
      • 及时:计算机对命令及时响应
  • 实时系统
    • 响应时间更短,比分时系统的“及时”更为“及时”
    • 特点:
      • 专用
      • 实时
      • 高可靠
  • 个人机系统
    • 分类
      • 单用户操作系统
      • 多用户操作系统
  • 网络操作系统
    • 多个主机通过网络互联
    • 特征
      • 分布式
      • 自治性:各台主机可自行运行
      • 互连性
      • 可见性:知道对方计算机地址
  • 分布式操作系统
    • 特征
      • 分布式处理
      • 模块化结构
      • 利用信息通信
      • 实施整体控制
    • 特点
      • 透明:不知道资源位于何处
      • 灵活:得益于模块化结构,系统的修改很方便
      • 可靠:一部分发生故障并不影响整体的使用
      • 高性能
      • 可扩充
分类:操作系统 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 181

win7下同步播放麦克风声音

在windows 7 下,如何让麦克风的声音直接从电脑上的扬声器输出呢?

右击任务栏角上的小喇叭,选择Recording devices(录音设备),可以看到下图窗口:

如果不能看不到上图中的麦克风和立体声混音,在窗口内部空白处右击,在弹出的右键菜单中选中"Show Disconnected Devices(显示未连接设备)"即可。

以下几张图是麦克风的属性设置:

此处关键,usage必须选中“Use this device (enable)”(使用此设备)

此处关键,必须选中“Listen to this device(监听此设备)”。其实原理就是监听麦克风的输入,通过回放设备(扬声器)进行播放。以后要不要播放麦克风的声音,就是在这里控制切换的。


 

如果按照以上设置,你就可以对这麦克风说话,你的声音就直接从扬声器上播出了。只不过效果肯定没KTV的好,它会有一定的滞后(不过不怎么严重),用来说话扩音是没有问题的,如果是K歌的话,可能会影响你的发挥。

分类:电脑综合 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 354

再说strcpy + 面试中的算法题笔试

strcpy这个函数是很考验一个人的,其实很早(大二的时候)就看过林锐的《高质量C/C++代码》,里面对strcpy做了很详细的分析,以及哪些需要注意的地方。

其实C语言课上的时候,老师也分析过strcpy,甚至老师将该函数体的循环部分简化为一个语句。另外,本人也一直对自己的编码风格、C语言和一些比较常见的算法都很自信的,不过今天自己写了strcpy()这个函数,回来后发现自己还是载在了这个上面(其实也不是太影响面试结果)。反省一下!

当时写strcpy函数的时候,有几个没有记清的地方的:
1、strcpy会不会主动给strDest的末尾加上'\0',当时当成不加了来处理。
2、参数是否该去检测NULL,因为strcpy作为比较常用的库函数,感觉程序员理应为主动为其保证正确性(现在想起来林锐当时好像用的是assert),不过我们写嵌入式的好像不怎么习惯用assert,也可能是我个人的情况。),即使可以保证指针为有效的地址值,也无法保证strDest分配的空间是足够的。不过这个判断语句还是写上了,因为写上去至少不会说是错。
3、其他错误(如果调试运行一下就可以发现)。

不怕丢脸,贴出我写的那个错误版本的strcpy函数:

  1. char* strcpy(char *strDest, const char *strSrc)
  2. {
  3.     char *= strSrc;
  4.     if (NULL == strDest || NULL == strSrc)
  5.         return NULL;
  6.     while ('\0' != *p)
  7.     {
  8.         *strDest = *p;
  9.         strDest++;
  10.         p++;
  11.     }
  12.     return strDest;
  13. } 

函数中申请了临时变量p,不过没有用它来存放strDest。当初只想着把传入的strDest返回去就好了,结果忽略了过程中把它移动了。所以,其实这个是最大的错误,但是调试运行一下是很容易发现的。当时给strSrc设置了个变量的原因是因为const,其实我知道这里const修饰的是char*,也就是说地址strSrc指向的那片空间的数据在本函数中是不可以去修改的。但是当时也是为了“双保险”,就来了个char* p = strSrc; 。实际上这句话是有warning的,如果当时调试了,估计就把它删除掉了(因为我更讨厌强转,且这句话是非必须的)。

查看更多...

分类:C/C++ | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 252