成都游戏学院程序老师的博
个人信息
老师
日历
最新文章
最新评论
最新留言
相册
访客
好友
计数器
          
rss
 
推荐订阅:订阅到RSS阅读
内容
  •  
    2008-05-05 08:27:53
    标签:杂谈
    成都游戏学院 http://www.cdgamecollege.org 电话:028-85586115  
    未加extern “C”声明时的编译方式

      首先看看C++中对类似C的函数是怎样编译的。

      作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为: 
    void foo( int x, int y );

      该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。

      _foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。例如,在C++中,函数void foo( int x, int y )与void foo( int x, float y )编译生成的符号是不相同的,后者为_foo_int_float。
      同样地,C++中的变量除支持局部变量外,还支持类成员变量和全局变量。用户所编写程序的类成员变量可能与全局变量同名,我们以"."来区分。而本质上,编译器在进行编译时,与函数的处理相似,也为类中的变量取了一个独一无二的名字,这个名字与用户程序中同名的全局变量名字不同。

      未加extern "C"声明时的连接方式

      假设在C++中,模块A的头文件如下:
    // 模块A头文件 moduleA.h
    #ifndef MODULE_A_H
    #define MODULE_A_H
    int foo( int x, int y );
    #endif

      在模块B中引用该函数:
    // 模块B实现文件 moduleB.cpp
    #include "moduleA.h"
    foo(2,3);

      实际上,在连接阶段,连接器会从模块A生成的目标文件moduleA.obj中寻找_foo_int_int这样的符号!

      加extern "C"声明后的编译和连接方式

      加extern "C"声明后,模块A的头文件变为:
    // 模块A头文件 moduleA.h
    #ifndef MODULE_A_H
    #define MODULE_A_H
    extern "C" int foo( int x, int y );
    #endif

      在模块B的实现文件中仍然调用foo( 2,3 ),其结果是:

  •  
    2008-05-05 08:27:53
    标签:杂谈
    成都游戏学院 http://www.cdgamecollege.org 电话:028-85586115  
    C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言,C++保留了一部分过程式语言的特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同。

      2.从标准头文件说起

      某企业曾经给出如下的一道面试题:

      面试题
      为什么标准头文件都有类似以下的结构? 


    #ifndef __INCvxWorksh
    #define __INCvxWorksh 
    #ifdef __cplusplus
    extern "C" {
    #endif 
     
    #ifdef __cplusplus
    }
    #endif 
    #endif 

      分析
      显然,头文件中的编译宏“#ifndef __INCvxWorksh、#define __INCvxWorksh、#endif” 的作用是防止该头文件被重复引用。

      那么
    #ifdef __cplusplus
    extern "C" {
    #endif 
    #ifdef __cplusplus
    }
    #endif 

      的作用又是什么呢?我们将在下文一一道来。
      3.深层揭密extern "C"

      extern "C" 包含双重含义,从字面上即可得到:首先,被它修饰的目标是“extern”的;其次,被它修饰的目标是“C”的。让我们来详细解读这两重含义。

      被extern "C"限定的函数或变量是extern类型的;

      extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。记住,下列语句:
      extern int a;

      仅仅是一个变量的声明,其并不是在定义变量a,并未为a分配内存空间。变量a在所有模块中作为一种全局变量只能被定义一次,否则会出现连接错误。

      通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时

  •  
    2008-04-28 09:53:21
    标签:杂谈
     成都游戏学院 http://www.cdgamecollege.org 电话:028-85586115 
    先测试一个例子
                <card id="c1" title="c1" ontimer="#c2">
                <timer value="20"/>
                X1
                </card>
                <card id="c2" title="c2" ontimer="#c1">
                X2
                <timer value="50"/> 
                </card>
                效果为:打开页面后显示X1 2秒后跳到第二个名为C2的CARD 显示X2 5秒后跳回第一个卡片
                一般HTML页面中文字滚动效果都是自下而上
                可以做这样的设计
                第一个卡片显示内容
                ------------------
                XXXXXXXXXXXXXXXXXX
                ------------------

                代码为:
                ------------------
                <br/><br/><br/>
                XXXXXXXXXXXXXXXXXX
            

  •  
    2008-04-28 09:53:21
    标签:杂谈
     成都游戏学院 http://www.cdgamecollege.org 电话:028-85586115 
    如何在WAP中实现文字滚动动画的教材
                虽说没有很大的实际意义,在WAP中没有多少用武之处,但通过这次练习可以了解到ontimer事件的作用
                首先说说动画,学FLASH的人就马上会想到帧,在单位时间内播放多少帧就能实现动画的效果(不过文字滚动在HTML网页中也能用marquee实现效果)
                WAP中实现文字滚动的效果就只能利用动画的原理实现,因为WML中没有marquee,但是有CARD 的ontimer事件
                ontimer类似<meta http-equiv="refresh"
                content="300;url=main.asp">和JAVASCRIPT中的setTimeout方法,用于指定一个事件。当<timer/>
                标签指定的时间到期后,浏览器就执行ontimer所指定的这个事件。
                ontimer可以是一个URL地址,一个卡片组,一个WML网页,一幅图像或其他符合URL定位的规则的文件。
                <timer/>标签指定的时间为正整数,单位大小为1/10秒。
                ontimer时间只能包含在card元素或template元素的标签中进行定义,其语法形式如下:
                <card id="name" title="label" newcontext="boolean" ordered="true"
                onenterforward="href" onenterbackward="href" ontimer="href">
                内容(content)
                </card>
        &nb
  •  
    2008-04-21 17:42:30
    标签:杂谈
     成都游戏学院 http://www.cdgamecollege.org 电话:028-85586115 
    1.对应String类型的对象使用println()方法时,如果对象为null,将打印null而不是引发NullPointerException,由此引用的问题是容易造成错觉,对于以后对字符串的操作容易引起问题。

    2.引发NullPointerException异常,主要原因是没有对对象的存在性进行验证,在jsp编程中经常出现:if (request.getParameter(“username”).equals(“xxx”))、out.println(session.getAttribute(“record”))等。解决这个问题的方法是在使用前进行判空比较:
    if (request.getParameter(“username”)!=null)
    {if if (request.getParameter(“username”).
    equals(“xxx”))…}

    3.引发NumberFormatException异常:主要原因是将用户提交的内容转换为整数或者浮点数时用户输入了其它非法字符。处理的主要方式是在需要进行转换的地方使用try/catch块捕获此异常然后提示用户输入合法数据。

    4.引发StringIndexOutOfBoundsException异常:主要原因是使用String的substring()、charAt()等方法,而字符串的长度不够,就会引发此异常;在字符串为null时也会引发NullPointerException。解决的方法是判空,判断长度或者转换为字节数组。考虑到这些操作很多,可以将之封装到javabean中。

    5.引发NoClassDefFoundError错误,主要原因是类路径或者类文件放置错误,类文件的放置要符合服务器的要求。

    6.引发java.lang.Error错误,主要原因是对系统所访问外部资源,未执行关闭操作,导致外部资源大量浪费,最终可能导致系统无法正常运行;对系统所访问的外部资源关闭次数太多,外部系统无法正常处理;所系统访问的外部资源出现异常情况。

    解决的方法是:访问外部资源前,首先检查该资源(如数据库)是否可正常连接或操作;访问外部资源时,如果进行了连接,一定进行关闭操作,并仅进行一次关闭操作;尽量在同一操作中共享外部资源,以减少该操作对资源的消费,提高程序的执行效率。
  •  
    2008-04-21 17:42:30
    标签:杂谈
     成都游戏学院 http://www.cdgamecollege.org 电话:028-85586115 
    术语表
    bytecode
    字节码:由Java编译器和Java解释程序生成的机器代码。

    cookie
    由Web服务器建立的数据,该数据存储在用户的计算机上,提供了一个Web站点跟踪用户的参数并存储在用户自己硬盘上的方法。

    HTTP
    超文本传输协议。一个请求响应协议用来连接WWW服务器向客户端浏览器传输HTML页面。

    输入流对象
    一个对象,由ServletInputStream类定义,被Servlet用来从客户端读取请求。

    映射
    由Servlet实例和Servlet返回数据的URL组成的一对,例如,HelloServlet和/hello/index.html。

    输出流对象
    一个对象,由ServletOutputStream class类定义,被Servlet用来向客户端返回数据。
    request dispatcher object
    由RequestDispatcher接口定义的一个对象,用来从客户端接收请求,并将其发送到Web服务器上可用的其他资源(例如Servlet、CGI、HTML文件或JSP文件)。

    sandboxed servlet
    在一个安全性约束下运行的Servlet。

    servlet
    一个小的,具有平台无关性的,没有图形用户界面的Java程序。它可以在许多方面扩充Web服务的功能。
    s
    ervlet configuration object
    ServletConfig接口定义的一个对象,用来配置一个Servlet。

    servlet context object
    ServletContext接口定义的一个对象。给予Servlet有关Servlet引擎的信息。

    servlet引擎
    由Web服务器提供商制作的一个环境,可以允许Servlet在具体的Web服务器上运行。

    servlet请求对象
    由ServletRequest接口定义的一个对象,允许Servlet获得用关客户端请求的数据。

    servlet response object
    由ServletResponse接口定义的一个对象,允许Servlet作出响应。

    servlet runner
    Java Servlet Developer’s Kit (JSDK)中的sun.servlet.http.HttpServer过程,它使得Servlet得以运行。

    会话跟踪
    在一个Web应用程序中,识别一个从同一个客户端发出的连续的唯一的请求的能力。

    SSL
    加密套接字协议层。一个安全协议,用来在Iternet上的客户端浏览器和服务器交换密钥和加密数据。

    URI
    统一资源标识。定义一个Internet地址,它是一个UR
  •  
    2008-04-17 16:42:10
    标签:杂谈
    成都游戏学院 http://www.cdgamecollege.org 电话:028-85586115 
      sendRequestAsynch是异步的API。这个是写作过程中的一个版本。在review之后发现其中存在同步问题。synchronized (request)不是在启动孙子线程tt之后执行。问题在于如果sendRequest(request)在执行到最后是发送request.notifyAll()时,可能还没有执行synchronized (request) 这样就存在request.wait(timeout)不会被唤醒而超时的问题。
        public void sendRequestAsynch(final NetworkRequest request, final long timeout) throws Exception {

             Thread t = new Thread() {
                 public void run() {

                     try {

                         log.debug("send request in another thread.");

                         

                         Thread tt = new Thread() {

                             public void run() {

                                 try {

                                  
  •  
    2008-04-17 16:42:10
    标签:杂谈
    成都游戏学院 http://www.cdgamecollege.org 电话:028-85586115 
    J2me提供了HttpConnection和SocketConnection。前者从API级提供了对http协议的支持,而后者只是单纯的一个socket流API。



        实际上对于使用Http协议的上层应用来说,网络层使用Http或者Socke应该是透明的。作为框架,应该为用户提供方便的选择方式。

        J2me中对HTTP 1.2中定义的KEEPALIVE支持得并不是很好,并不能获得一个http的长连接。对于JSE中http connection的实现还没验证。

        使用Socket的一个好处是可以避免为每个网络请求建立单独的Connection。并且因为socket的inputStream, outputStream是双工的方式工作,所以可以连续的发送网络请求而不必等待网络回应。

        如果让socket的inputStream/outputStream以双工的方式工作(即:通过outputStream发送之后不等待 inputStream的response),那么需要应用层的协议进行支持。比如,需要对发出的网络请求进行编号,这样从inputstream中获得 response的时候可以把这个回应匹配到正确的请求上。实现双工,很直接的想法是inputStream、outputStream分别由单独的一个线程处理。

      



        这个工具包应该能够做到支持:
    1. Http GET/POST;
    2. File download;
    3. 可以选择使用socket或是Http;
    4. 支持同步/异步(阻塞/非阻塞)发送请求,提供timeout机制;
    5. 清晰的异常定义,方便上层进行错误处理。
    6. 对于socket是否可用连接池?[对于j2me程序似乎没有必要]



        Connection中的receive, send都是阻塞的。如果要实现异步收发,需要在一个单独的线程中处理请求。



        以下是通过把阻塞的API放在一个线程中运行而获得的异步效果。理想状态下,在到达了Timeout事件
  •  
    2008-04-07 13:53:25
    标签:杂谈
     成都游戏学院 http://www.cdgamecollege.org 电话:028-85586115
    public static final String DEFAULTKEY

    返回的结果是一个JSONArray,其实就是一个vector而已,用一个for来遍历,每个元素是一个JSONObject,其实就是一个hashtable,用不同的属性来取对应的值。

    注意,每一种类型的搜索结果中包含的属性是不同的,具体的看

    http://code.google.com/apis/ajaxsearch/documentation/reference.html#_intro_GResult

    大部分的值当中包含了一些格式的标记,比如字体和颜色等,如果不想解析的话,推荐用XXNoFormatting之类的属性取出没有格式的值。

    范例:JSONArray results=Gsearch.search(keyWord, Gsearch.WEBSEARCH, null ,Gsearch.SMALL_RESULTS ,Gsearch.DEFAULTKEY);

    org.penguinz.google.GoogleSearchMIDlet是一个范例MIDlet可以直接运行。

    另外,把翻译服务更新了一下,修复了几个bug,比如乱码和包的问题,和搜索放到了一起。

    public static String org.penguinz.google.tranlate(String src,String srcLang,String destLang) throws Exception

    src是要翻译的文字

    srcLang是原始的语言

    destLang是目标的语言

    语言种类如下

     public static final String ENGLISH(英语)
     public static final String CHINESE_SIMPLIFIED(简体中文)
     public static final String CHINESE_TRADITIONAL(繁体中文)
     public static final String ARABIC(阿拉伯语)
     public static final String FRENCH(法语)
     public static final String GERMAN(德语)
     public static final String ITALIAN(意大利语)
     public static final String JAPANESE(日语)
     public static fi

  •  
    2008-04-07 13:53:25
    标签:杂谈
     成都游戏学院 http://www.cdgamecollege.org 电话:028-85586115
    google的核心业务,搜索功能。

    public static final JSONArray org.penguinz.google.search(String keyWord, int type,
       String location ,int resultSize ,String api_key) throws IOException, JSONException

    keyWord就是关键字

    type就是搜索的类型包括以下几种

     public static final int WEBSEARCH 
     public static final int LOCALSEARCH 
     public static final int VIDEOSEARCH 
     public static final int BLOGSEARCH 
     public static final int NEWSSEARCH 
     public static final int IMAGESEARCH 
     public static final int BOOKSEARCH

    location 就是所处的位置,localsearch有用,其他的类型就是null

    resultSize就是返回结果的数量

     public static final int SMALL_RESULTS(1-4条)
     public static final int LARGE_RESULTS(1-8条)

    api_key就是你使用的google api key

    http://code.google.com/apis/ajaxsearch/signup.html申请

    如果你懒得申请的话