Pages

2011年4月30日 星期六

[Java] initializer blocks

在撰寫Java的class時,可以設定class成員變數的初值,然而,如果成員變數的設定需要做一些判斷才能給初值,除了在建構式內撰寫判斷之外,以下的方法可以有條件的設定初值給成員變數:

public class UncleClass
{
      int v;
      { // 直接以括號開始寫,
        //括號前沒有任何函式名!!

            //這裡寫判斷式,並設定v的初值。
      }
      public UncleClass() {;}
      // …
}

上面沒有函式名稱的括號刮住的,就是initializer blocks。寫在裡面的code會自動複製到主類別(UncleClass)的每個建構式內,蠻適合用於一個類別有很多個建構式的情況。

2011年4月29日 星期五

[x86 Processor 組合語言] PTR, offset and Stack

今天剛弄懂的一點語法,記錄下來。

以下記錄關於PTR的用法:
1.   ptr指向的位置,裡面的值可以拿出來用。例如:
      mov   ax,BYTE   ptr   Uncle
      ;可以將Uncle這個變數從offset開始取出Byte長度的值,丟給ax。
      ;Offset指向的位置,是從較低位開始。

      於是我推測,如果寫:
      push   dword   ptr   3     ;代表將3這個數字從低位數開始,
                                            ;取dword長度(也就是4個byte),推到堆疊。
                                            ;所以就是把3推到堆疊。

       如果寫:
       push   dword   ptr   offset   Uncle
       ; 代表將Uncle這個變數的位址取出,取dword長度,推到堆疊。

2.   offset跟ptr不同在於,ptr拿的是值,offset直接將某個變數的位址取出。

Stack:
1.   每次push,會減少ESP的值(每次減少4的byte數要看operand的資料大小)。所以ESP指向的記憶體位址,會隨著push越多資料而越來越小的。

2.   pushad跟popad適合分別寫在某程序的開頭跟結尾,如果此程序有更改到如EAX、ECX、EDX、EBX、ESP等等32bit的暫存器。

2011年4月28日 星期四

[Java] Applet

Java的Applet是可以在網頁上執行的程式。
Applet跟Application不同處是有public void init()、public void start();、public void stop()及destroy()四個函式。
要將Java Application改成Applet很簡單,只要做以下步驟就可以:

1.   首先,主要的類別要extends Applet。並且import java.applet.*;

2.   在此複習我之前寫的GUI程式結構:
       public class UncleClass implements ActionListener
       {
              //元件宣告區,大部分會有個frame。
              public static void main(String s[])
              {
                    UncleClass uu = new UncleClass();
              }
              public UncleClass()
              {
                  //設好屬性,add進來。
                  f.setVisible(true);  //frame f
              }
              public void actionPerformed(ActionEvent evt)
              {
                  //觸發事件處理。
              }
              //寫一些UncleClass自己的函式。

       }// UncleClass

      如此要改成Applet,需改變的地方,可以將建構式改成空函式,將原來建構式內的程式碼,移到public void init()裡面。而start()裡可以寫成:
       public void start()
       {
             super.start();
       }
       至於stop()跟destroy()可以不用寫出來。
       原來在物件宣告處定義的frame,改為定義在main裡面:
       public static void main(String s[])
       {
             UncleClass uu = new UncleClass();
             Frame f = new Frame(“FrameName”);
             uu.init();       uu.start();
             f.add(uu, “Center”);
             f.setSize(300,500);
             f.setVisible(true);
       }
       將Frame的屬性設定放在main裡面。注意如果Frame要使用BorderLayout,在init()裡面,要多一行:
        setLayout(new BorderLayout());
        在init()裡面可以加入一些元件到Frame中:
        直接寫add(ta, “Center”);,不用寫f.add(…)。
        最後加上paint函式:
              public void paint(Graphics g)
              {
                    //視窗縮放或重畫會呼叫這裡。
                    validate();
               }

3.   最後簡單寫一個html文件:
       <applet code=UnlceClass width=300 height=500></applet>
       開啟此html網頁,就可以看到Applet程式了。


        另外,validate()的作用是把Container裡面的元件再lay out出來一遍。建議在物件有add或者其他動作時都要validate一下。
        而有時視窗顯示有問題,將視窗放大縮小又變正常,此時setVisible設為true很可能可以解決此問題。

有了Applet,就可以在自己的網頁上放程式,讓大家一進自己的網站就可以按一些圖形介面了!!

                                                                        by Uncle

2011年4月27日 星期三

[Windows API] 改文字顏色跟移動游標

1.   SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),色碼);
      //色碼從0~255,這個函式可以設定輸出文字的顏色跟背景,共256種組合。
      //可以寫一個簡單for迴圈,還看所有的色彩組合。

2.   以下的函式,可以移動游標到console特定的位置。
 
void gotoxy(int x, int y)
{
COORD cc;
cc.X = x;
cc.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cc);
}
 
//其中y是代表row,x代表column。(0,0)座標位置從螢幕左上方開始。 

[Matlab] 2種重要陣列用法

以下是2種要注意的陣列用法:
1.   之前有提到陣列用分號區隔不同的row。
      例如:A[0 0 1;1 0 0] =
      0 0 1
      1 0 0
2.   在陣列表示法中遇到冒號,代表"從某個位置到某個位置",冒號左右都沒有寫,代表全部的row或全部的column。例如:
       A = [0:5] = 0 1 2 3 4 5   %從0到5,兩元素間相差1(公差)。
       B = [0:2:5] = 0 2 4         %從0到5,公差為2,所以只計到4。
       C(1:5,:)             %代表row取1~5個row,column取全部的column。

2011年4月26日 星期二

[Java] 圖形介面常用物件及方法1

以下整理幾個圖形介面程式常用的物件及方法:
1.   TextArea:有捲軸,可以顯示多行文字的空白區域,可以將之設為可輸入文字,或者只能唯讀不能輸入。
2.   TextField:可以輸入單行文字的區塊。
      例如: tx = new TextField(12);   //新增一個12個columns的TextField。
3.   TextArea跟TextField都有繼承到setFont函式,可以改變字型。其使用方法為:
                      a.setFont(new Font(“新細明體", Font.PLAIN,12);
      最左的參數是字型名稱,中間的參數是style,右邊的參數是字體大小。
style有:
Font.PLAIN、Font.BOLD、Font.ITALIC、Font.BOLD+Font.ITALIC。
4.   Panel是一種container。container可以add一些物件到container內排列。排列方式有很多種,我學到的有:FlowLayout,這種排列方式是將元件由左到右,由上到下的順序排列,且不會改變元件大小。而BorderLayout則可以指定元件位置為東西南北中,且元件大小會依據位置做延伸改變。
Panel預設是FlowLayout。要更改LayoutManager時,可以用container的setLayout函式:
             p1.setLayout(new BorderLayout( ) );


5.   java.awt.*內的List,是一種container,有捲軸,裡面可存文字選項。

2011年4月21日 星期四

[x86 Processors 組語] 常用指令

(1)建立陣列:
   arr1   SWORD   10   DUP(0)   ;代表建立一個名為arr1的陣列,
                                                     ;大小為10,陣列元素型態為SWORD,
                                                    ;陣列中每個元素初始化為0
(2)   .code   ;代表code segment的開始。
(3)   main PROC   ;PROC是一個指令,main是procedure名。
       ………
        main ENDP   ;代表 main procedure的結束。
(4)   END   main   ;指出程式進入點是main,
                             ;指出最後一行被組譯的程式。
(5)   mov   esi,OFFSET   abc   ;esi存著abc的記憶體位址開頭。
(6)   call readint會從鍵盤讀進32bit signed整數,並存到eax,而call writingstring的話則會將edx指向的字串輸出到console。