2013年5月26日 星期日

電腦開不了機,嗶嗶聲代表的意思?

最近朋友的電腦開不了機,上網查了一下,覺得這些資料或許可以幫的上忙:

AWARD BIOS
----------------------
1短:系統啟動正常。
2短:CMOS設定錯誤。
一長一短:DRAM錯誤。
一長二短:顯示卡或螢幕連接錯誤。
一長三短:AGP 錯誤。
一長九短:ROM錯誤。
不斷長響:DRAM未插好。
不停急響:電源有問題。

AMI BIOS
-----------------------
1短:DRAM篞s錯誤。
2短:DRAM 同位元檢查錯誤。
3短:基本64K RAM檢查失敗。
4短:計時器無法運算。
5短:CPU錯誤。
6短:8042無法取得A20(檢查鍵盤)。
7短:CPU中斷錯誤
8短:顯示卡記憶體寫入讀取錯誤(檢查顯示卡)。
9短:ROM檢查碼錯誤。
10短:CMOS 關機暫存器寫入讀取錯誤。
11短:快取記憶體故障。

Phoenix BIOS
----------------------
1短:系統啟動正常
1短1短1短:系統開機初始化失敗
1短1短2短:主機板錯誤
1短1短3短:CMOS或電池失效
1短1短4短:ROM BIOS校驗錯誤
1短4短3短:EISA時序器錯誤
1短3短1短:RAM復新錯誤
3短1短2短:主DMA暫存器錯誤
3短1短3短:主中斷處理暫存器錯誤
3短2短4短:主機板鍵盤控制器錯誤
3短4短2短:顯示錯誤(顯示器或顯示卡)
4短2短2短:關機錯誤
4短4短1短:串列埠錯誤
4短4短2短:並列埠錯誤

IBM BIOS
---------------------------------------
無:電源供應器或主機板完全損壞
持續:主機板嚴重損壞
短聲:系統自我測試,情況正常
2短聲:自我測試發現錯誤 ( 錯誤訊息顯示於螢幕上 )
持續短聲:電源供應器或主機板損壞
1長1短:主機板有錯誤
1長2短:顯示卡錯誤
1長3短:顯示卡錯誤
3長:鍵盤錯誤

2013年5月24日 星期五

HTC One 全球已賣出500萬支 仍供不應求!

科技網站《SlashGear》周四 (23日) 報導,宏達電 (HTC)(2498-TW) 一位公司高層確認,HTC One 手機自從 3 月發售至今,已於全球創下 500 萬支的亮麗銷售佳績,且目前需求明顯仍高於供給量。
宏達電近期消息讓公司蒙上陰影,近日傳出高層出走潮,且對打 Galaxy S4 手機成績上仍有差距,但根據《華爾街日報》指出,該名宏達電高層稱 HTC One 銷售實為強勁。
該人士稱:「訂單數量目前為止都非常好,且仍超過我們的供給量。雖然這有部份原因是來自零件短缺,但這問題下個月可獲得解決,到時候就可以看到 HTC One 的真正光芒。」
宏達電已公開宣稱,本月生產量將調昇一倍,4 月銷售數據也樂觀上揚。HTC One 原本打算在今 (2013) 年第 1 季末尾前,於全球 80 個國家開賣,但報導稱「UltraPixe」攝影鏡頭零件採購上有些問題,因此發售的市場範圍受到限制。
但這並不影響宏達電的第 2 季強勁銷量預期,目前季度的營收估計將上達約 700 億新台幣 (24 億美元),增長幅度幾乎高達 10 億美元。


原文網址: 表現亮眼!HTC One全球已賣出500萬支 仍供不應求 | 財經新聞 | NOWnews 今日新聞網 http://www.nownews.com/2013/05/23/320-2942591.htm#ixzz2UCDhHsjv

2013年5月23日 星期四

SVN :: 如何無條件還原到舊的revision

當團隊一起開發程式,有很多人選擇用SVN來做版本控制,當程式開發人員不小心上傳錯誤的程式碼導致project無法build的時候,最後的選擇可以還原到之前好的版本,作法如下:

情境 : 版本號 4058 (現存最新版,但是是錯的),想還原到 版本號 4020

做法:

  1. 在local端創一個資料夾 A 並checkout 版本號 4058
  2. 在local端創一個資料夾 B 並checkout 版本號 4020
  3. 資料夾檔案設定選擇 "顯示所有檔案"
  4. 把資料夾 B 裡的檔案,除了.svn (記錄了svn的資訊) 這個資料夾外,全選並複製貼到資料夾A,全部覆蓋
  5. commit資料夾A
  6. 完成版本復原



2013年5月22日 星期三

Android :: 偵測網路狀態

有些程式必須透過網路來執行某些動作,在執行這類網路相依的動作之前,最好先判斷目前的網路連線狀態,這樣可以免掉後續許多的防範機制,相關程式碼如下:

private boolean isInternetConnected( )
{
   ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService     
   (CONNECTIVITY_SERVICE); 

   NetworkInfo networkInfo= connectivityManager .getActiveNetworkInfo(); 

   if( networkInfo != null && networkInfo.isConnected( ) )
  { 
      return true; 
   }
  else
  { 
      return false; 
  }   
}

補充:
記得在AndroidManifest.xml裡加入

Android :: 生命週期 lifecycle

Android 跟 一般windows的程式不一樣,他引進了所謂的lifecycle的概念,針對程式而言,最明顯的不同在於您所設計的程式,有可能被系統自動終結掉,這對於傳統的程式設計師或使用者來說是很不可思議的事,以前,除非是程式自己結束(正常或不正常),不然是不會自動消失的,Android系統則完全掌控了程式的生殺大權,當記憶體不足或其他原因,系統是可以無責的將您的程式給結束掉的,後來,Win8也導入lifecycle。

Android的lifecycle分為幾個階段,用程式來看就一目了然了:

public class Activity extends ApplicationContext {
   protected void onCreate(Bundle savedInstanceState);
   protected void onStart();
   protected void onRestart();
   protected void onResume();
   protected void onPause();
   protected void onStop();
   protected void onDestroy();
  }

底下是擷取自Android官方網站的流程圖:


Android :: 非同步線程 AsyncTask

網路上很多AsyncTask的說明和例子,但我相信應該有很多初學者應該都有看沒有懂, 如果您是已經看過網路上的例子但還是不會用的話, 可以看看以下的例子, 這篇文章的主要目的, 是要您能真的用得出來, 實作成功了, 再去查相關資料, 成就感就不同了! 如果您有以下的需求: 事件2必須等待事件1完成後再做的話, 您就有AsyncTask實作的動機了。 首先,設計一個名子叫做MyTask的class,其他照抄。 doInBackground裡面放的就是要做的事件1, 而onPostExecute裡面放的就是事件2, class實作結束!!! class MyTask extends AsyncTask{ @Override protected voiddoInBackground(Integer... params) { 事件1; } @Override protected void onPostExecute(String result) { 事件2; super.onPostExecute(result); } } 再來,就是在MainThread裡面呼叫了, 可以在OnCreate裡面做: MyTask myTask = new MyTask(); myTask(100); 結束了!!

Android :: 對話方塊

對話方塊,和之前介紹過的Toast一樣,是用來通知使用者的,但要注意其應用情境,有些區別,這邊就不多說了,google上資料應該很多。 Android的對話方塊實作也是很簡單,以下照慣例,用程式碼來解說: AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this); 首先是產生一個AlertDialog實體,這個實體要出現在哪裡呢?一般來說就是這段程式碼鎖在的Activity,預設就是MainActivity.this。 dialog.setTitle("關於 dialog"); 這是設置dialog標題的用法。 dialog.setMessage("message content"); 這是設置dialog內容的用法。 dialog.show(); 這是最後一個步驟了,就是把dialog給show出來。 結束。

coupon

  • 1129
  • http://www.kfcclub.com.tw/Menu/Coupon/
  • http://campaign.mcdonalds.com.tw/Campaign_20130828_Coupon/
  • https://docs.google.com/document/d/1oau68PPEY5jk0UJBfPgzkdbpaEwq7UDIxddNsHqpu1M/edit?usp=sharing
  • http://www.mos.com.tw/index.aspx
  • https://docs.google.com/document/d/16cU9-ieaNONMNd4bQtHkD_RvYAQPBUzcquogpe0WhSU/pub
  • http://www.burgerking.com.tw/news.php?id=208
  • https://docs.google.com/document/d/1hkW58Vwiz-Wi4wPSmg7la7b3I3cOjGmYSXHAgjcFIo8/edit?usp=sharing
  • http://www.pec21c.com.tw/ctmNewsList.html?leftMenuId=2800
  • http://www.tkkinc.com.tw/news_1.asp?n=1
  • http://www.twsubway.com/www/include/index.php?Page=2
  • https://docs.google.com/document/d/1mVc9c2Bw8cDMf9JO6p1syRRiFJjLFZ7c2wxn3NLrpQg/pub
  • http://www.coldstone.com.tw/04_news.asp
  • https://docs.google.com/document/d/1dqL_wtma82-nxqS9oMU46BplwmH-aNW6Qykm83OAqSw/pub
  • https://docs.google.com/document/d/1dqL_wtma82-nxqS9oMU46BplwmH-aNW6Qykm83OAqSw/edit?usp=sharing
  • http://www.starbucks.com.tw/stores/allevent/stores_allevent.jspx
  • https://docs.google.com/document/d/1ghWc4OmNiibSI-l0JywSZweV3IJs-eudEpzB-7naW_w/pub
  • https://docs.google.com/document/d/1ghWc4OmNiibSI-l0JywSZweV3IJs-eudEpzB-7naW_w/edit?usp=sharing
  • https://www.mrbrown.com.tw/news/index.aspx
  • https://docs.google.com/document/d/1x4M73_TqoipjRFnx5NsbNpphN-_3oPNLFDIVk-PF-Xk/pub
  • http://www.85cafe.com/newsactivity.php
  • https://www.sushiexpress.com.tw/news
  • http://www.sushiexpress.com.tw/qrcode/view.php?id=209
  • http://www.pizzahut.com.tw/promotions/#pwds
  • https://docs.google.com/document/d/1xA3auHeUnYxAZeAYxElXkbVXYBgoGd2n5ICY7gcCVzo/pub
  • https://docs.google.com/document/d/1xA3auHeUnYxAZeAYxElXkbVXYBgoGd2n5ICY7gcCVzo/edit?usp=sharing
  • http://www.dominos.com.tw/Phone/PhoneHome.aspx
  • https://www.0800076666.com.tw/Info/InfoSets
  • http://www.carrefour.com.tw/promo-catalogs
  • http://www.pxmart.com.tw/px/edmindex.px?id=3666#features/5

2013年5月21日 星期二

Android :: 開啟程式Internet permission

在設計Android程式時,有些存取Internet的程式法,需要事先開啟Internet Permission,否則會出現Internet Permission Deny的Exception,要如何開啟程式的Internet Permission,很簡單,只要將以下的程式碼:



加入到 AndroidManifest.xml 檔案中,記得,這句必須在 中間,且自己為root node。

2013年5月19日 星期日

(Android) 新增頁面

以下解說如何新增一個名為NewActivity的頁面,需要準備的工作有:

(1). 產生需要的檔案: NewActivity.java 及 NewActivity.xml
       在NewActivity.java的OnCreate( )加入: setContentView(R.layout.NewActivity); 


(2). 在 AndroidManifest.xml 裡加入:
 
     


(3). 在欲連結到NewActivity的頁面裡,加入對應的程式碼,使之可以連結到NewActivity:
 
    Intent intent = new Intent();
    intent.setClass(MainActivity.this, NewActivity.class);
    startActivity(intent);


可以把(3)放到一個Button的Onclick事件裡,就可以很容易的看出結果了。

(Android) 造訪網頁

Android 瀏覽網頁非常簡單,只需要幾行的程式碼,以下的範例是當使用者按下按鈕後,會連結到特定網頁的寫法:


// 與UI拉好的button (id : myInternet) 作連結
button_Internet= (Button)findViewById(R.id.myInternet);

button_Internet.setOnClickListener(buttonInternet);



private Button.OnClickListener buttonInternet = new Button.OnClickListener( )
{
   Uri uri = Uri.parse("http://cte-ccu.blogspot.tw/");
   Intent intent = new Intent(Intent.ACTION_VIEW, uri);
   startActivity(intent);
};

(Android) 如何產生Toast 訊息

Toast訊息和一般的對話方塊訊息最大的不同在於應用情境,通常對話方塊式訊息出現後,畫面會focus在對話方塊,並等待使用者下一步指示,譬如按對話方塊上的確定或取消等等按鈕,而Toast則是將訊息顯示在螢幕上,經過一定時間後會自動消失,在盡量不打擾使用者的前提下達到訊息通知的目的,以下將用範例說明如何使用Toast:(按一個按鈕後出現Toast):

在UI配置上,拉一個按鈕,id設為about,
在欲顯示Toast的頁面程式碼裡(預設為MainActivity.java),加入以下程式碼:

// 產生一個按鈕 button_about ,並與 UI 拉好的按鈕 "about" 作連結
button_Toast = (Button)findViewById(R.id.about);


button_Toast .setOnClickListener(aboutToast);

private Button.OnClickListener aboutToast= new Button.OnClickListener( )
{
   public void onClick(View arg0){
      Toast popMsg = Toast.makeText(MainActivity.this, R.string.bmi_about, Toast.LENGTH_SHORT);
      popMsg.show();
   }
};

2013年5月13日 星期一

(C++) 支配值數目

已知兩已排序陣列,求第一個陣列元素比第二個陣列元素大的個數總和。

#include < iostream >
using namespace std;
int GreateCount(int f[], int g[], int numf, int numg)
{
 int length = 0;
 int sum = 0;
 for(int i = 0; i < numf; ++i)
 {
  while(length < numg)
  {
   if(f[i] > g[0 + length])
    length++;
   else
    break;  
  }
  sum += length;
 }
 return sum;
}

int main(void)
{
 int f[] = {1, 3, 5, 7, 9, 10, 11};
 int g[] = {2, 3, 4, 7, 8};
 int sum = GreateCount(f, g, 7, 5);
 cout << "Sum = " << sum << endl;
}

2013年5月12日 星期日

(C++) 找出最長平台的長度,並將之印出

在一個已經排序好的數字陣列,找出最常的平台並將之印出,所謂最常的平台,譬如一個陣列為1, 2, 2, 3, 3, 3, 4, 5, 5, 6,其中3, 3, 3即為此陣列的最常平台。


#include < iostream >
#include < vector >

using namespace std;

int longest_plateau(vector::iterator itr, vector::iterator itrEnd, int& number)
{
 int length = 1;

 for(itr += 1; itr != itrEnd; ++itr)
 {
  if(*itr == *(itr - length))
  {
   number = *itr;
   ++length;
  }
 }
 return length;
}

int main(void)
{
 int arrayNumbers[] = {1, 2, 2, 3, 3, 3, 4, 5, 5, 6};
 vector numbers(arrayNumbers, arrayNumbers + 10);
 int number = 0;
 int length = longest_plateau(numbers.begin(), numbers.end(), number);

 for(int i = 0; i < length; ++i)
  cout << number << " ";

}

2013年5月9日 星期四

(C++) 淺談指標


C語言用 " * " 來宣告一個指標型態的變數,例如,想要宣告一個指向int的指標可以這樣做 :      int* intPtr;   intPtr是用來指向一個int變數的指標,intPtr儲存的是int變數的位址,而這個位址所對應到的地址所存的變數值,可以用*intPtr來表示。   例子:

#include < iostream >
void main( )
{
   int var = 10;
   int* intPtr = &var ;
   std::cout << "變數var的位址:" << intPtr << std::endl;
   std::cout << "指標intPtr所指向的變數的值:" << *intPtr << std::endl;
}

剛開始我們會被指標搞得頭暈腦脹,主要是因為指標在宣告時期和使用時期非常類似,但又不完全相同,在宣告時期,筆者習慣寫成(注意星號的位置)

   int* intPtr;

而不是

   int *intPtr;

宣告成int* intPtr; 筆者認為更貼近於指標所隱含的意思 -> intPtr是一種指向int型態變數的指標。

既然intPtr是一種指標,不同於一般的變數如 int intVal; 其中intVal是一個型態為int的變數,變數所存的內容是變數值,而指標所存的值則是"位址",例如:

   intPtr = &intVal;

則intPtr這個指標所存的值是intVal變數的地址,有了地址,要如何找到intVal所存的變數呢?答案就是要靠 " * "來取值,也就是 *intPtr。

簡單來說,除了宣告時期,當你在程式內容中看到沒跟" * "搭配出現的指標變數,他是想表達"位址",而與" * "搭配一起出現的指標變數,他想表達的是他所存的地址所指向的變數值(可能是另一指標所存的地址,這就是雙重指標的意義)。




(C++) 使用不定長度引數之函式

不定個數引數之函式,顧名思義,就是一個可以餵不定個數引數的函式,引數可以3個、6個、9個等等,要使用不定個數引數,必須加入標頭檔 :   #include

提供了幾個可使用的巨集,用以實現不定個數引數

va_list : 在va_start、 va_arg與va_end三個巨集使用時當作參數使用。
va_start : 開始不定長度引數的巨集。
va_arg : 讀取不定長度引數的巨集。
va_end : 結束不定長度引數的巨集。

範例如下:


#include
#include

void test(int argNum, ...)
{
   va_list argList;
   va_start(argList, argNum);
   for(int i = 0; i < argNum; ++i)
      std::cout << va_arg(argList, double) << std::endl;
   va_end(argList);
}


void main( )
{
   double a = 1.02, b = 3.22, c = 5.22;
   double d = 2.22, e = 8.98, f = 0.99;

   test(3, a, b, c);
   test(6, a, b, c, d, e, f);
}

2013年5月8日 星期三

(C++) 輸入字串控制 - 數字篇

如果有一個地方可以讓使用者輸入,而且限制只能輸入數字型態,數字型態包括了正負數及小數,可以參考以下方法:

當使用者每件入一個按鍵,就呼叫此function:

void __fastcall OnEditPress(TObject *Sender, wchar_t &Key)
{
 std::wstring numerics(L"0123456789");
 TEdit *EditExit = (TEdit*)Sender;
 std::wstring editString = EditExit->Text.c_str();

 if((Key < L'0' || Key > L'9') && Key != L'\b' && Key != L'.' && Key != L'-')
 {
  Key = 0;
  return;
 }
 // avoid ".3"
 bool pointErrorUsing = (editString.find_first_of(L'.') != std::wstring::npos)
       || (editString.find_first_of(numerics) == std::wstring::npos);
 if(Key == L'.' && pointErrorUsing)
 {
  Key = 0;
  return;
 }
 // avoid ex: "-2-3" and "2-34"
 bool minusErrorUsing = (editString.find_first_of(L'-') != std::wstring::npos)
       || !editString.empty();
 if(Key == L'-' && minusErrorUsing)
 {
  Key = 0;
  return;
    }
 if(EditExit->Text.Length() > 5 && Key != L'\b')
 {
  Key = 0;
  return;
 }
 DoChange(Sender);
}

(C++) STL之 string 介紹

既然使用C++,筆者建議非必要不要使用字元陣列來進行字串操作,因為字元陣列的長度一個問題!不像C++標準函式庫所提供的string類別,提供判斷自己是否為空字串,且不用擔心預設長度問題,在字串合併等操作也都非常容易實現,而陣列也不能直接指定給另一個陣列,所以您無法直接將字串指定給另一個字串,您也無法對兩個字串直接進行串連的動作,例如:


#include < iostream >

#include < string >
int main()
{
  std::string str1;
  std::string str2("Hello");
  std::string str3(str2);

  // 判斷是否為空字串
  if(str1.empty())
  {
     std::cout << "str1 為空字串" << std::endl;
  }

  // 字串合併
  str1 = str2 + str3;
  std::cout << str1 << std::endl;

  return 0;
}

(C++) C-style 字串

C語言中字串是由字元所組成的陣列,字串的名子本身是一個pointer,字串以'\0'字元結尾,有兩種可行的宣告方式:


方式一:
char str[] = {'H', 'e', 'l', 'l', 'o', '\0'};


方式二:
char str[] = "Hello"; (程式會自動加上空字元 '\0')



範例:

#include < iostream >

int main( )
{
    char str[] = "Hello";

    for(int i = 0; i < (sizeof(str)/sizeof(str[0])); ++i)
   {
     if(str[i] == '\0') 
        cout << " null";
    else
       cout << " " << str[i];
   }
  return 0;
}

判斷string是否為number

bool IsNumber(const std::wstring& str)
{
   if ( str.empty() )
      return false;
  
   int pos = 0;
  
   if ( str[0] == _T('-') && str.length() >= 2)
      pos = 1;
   return (str[pos] >= _T('0') && str[pos] <= _T('9'));
}

2013年5月6日 星期一

(C++) stringstream介紹

如果想將 int 轉成 string,
傳統C的作法如下:

int a = 10;
wchat_t wstr = [1024];
wsprintf(wstr, L"%d", a);

以上做法有兩點需要注意,
1. 格式 類型(%d)
2. Buffer大小

格式類型給錯,
會造成不可預期的錯誤,
Buffer大小,
太大 不經濟,
太小 那就糟了。

可以用stringstream來解決,
有istringstream、ostringstream及stringsteam,
分別對應輸入、輸出及輸出+輸入,
用例子說明最快:

#include
#include
#include

int main( )
{
   int a = 10;
   std::wstring wstr;
   std::wstringstream wstream;

   wstream << a;
   wstream >> wstr;
}


(C++) 將Debug資訊印出來 - 數字篇

#include

int main( )
{

int a = 10;
wchar_t str[50];

wsprintf(str, L"%d", a);

OutputDebugString(str);
}

2013年5月2日 星期四

重構 BMI program (Android)

package com.example.test;

import java.text.DecimalFormat;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.util.Log;
import android.widget.Button;
import android.widget.TextView;
import android.widget.EditText;


public class MainActivity extends Activity {
private static String TAG = "test";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, "onCreate");

findViews();
setListener();
}

private Button button_calculate;
private EditText field_height;
private EditText field_weight;
private TextView view_result;
private TextView view_advice;

private void findViews()
{
button_calculate = (Button)findViewById(R.id.submit);
field_height = (EditText)findViewById(R.id.Height);
field_weight = (EditText)findViewById(R.id.Weight);
view_result = (TextView)findViewById(R.id.result);
view_advice = (TextView)findViewById(R.id.advice);
}

private void setListener()
{
button_calculate.setOnClickListener(calculateBMI);
}

private Button.OnClickListener calculateBMI = new Button.OnClickListener()
{
public void onClick(View arg0) {

double height = Double.parseDouble(field_height.getText().toString()) / 100;
double weight = Double.parseDouble(field_weight.getText().toString());
double result = weight / (height * height);
DecimalFormat df = new DecimalFormat("0.00");
view_result.setText(getText(R.string.bmi_result) + df.format(result));

if(result > 25)
{
view_advice.setText(R.string.advice_heavy);
}

else if(result < 20)
{
view_advice.setText(R.string.advice_light);
}

else
{
view_advice.setText(R.string.advice_well);
}
}
};

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}

計算BMI (Android)

package com.example.test;

import java.text.DecimalFormat;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.util.Log;
import android.widget.Button;
import android.widget.TextView;
import android.widget.EditText;
public class MainActivity extends Activity {

private static String TAG = "test";

@Override
protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, "onCreate");

Button submitButton = (Button)findViewById(R.id.submit);
submitButton.setOnClickListener(calculateBMI);
}



private OnClickListener calculateBMI = new OnClickListener()
{
   public void onClick(View v)
   {
      EditText height = (EditText)findViewById(R.id.Height);
      EditText weight = (EditText)findViewById(R.id.Weight);
      double heightValue = Double.parseDouble(height.getText().toString()) / 100;
      double weightValue = Double.parseDouble(weight.getText().toString());
      double bmi = weightValue / (heightValue * heightValue);
      DecimalFormat df = new DecimalFormat("0.00");
      TextView result = (TextView)findViewById(R.id.result);
      result.setText("Your BMI is " + df.format(bmi));

      TextView advice = (TextView)findViewById(R.id.advice);
      if(bmi > 25)
      {
            advice.setText(R.string.advice_heavy);
      }
      else if(bmi < 20)
      {
            advice.setText(R.string.advice_light);
      }
      else
      {
            advice.setText(R.string.advice_well);
      }
}
};

@Override
public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}

Android 生命週期

package com.example.test;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.util.Log;


public class MainActivity extends Activity {
private static String TAG = "test";

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);
   Log.d(TAG, "onCreate");
}
public void onStop()
{
   super.onStop();
   Log.d(TAG, "onStop");
}

public void onResume()
{
   super.onResume();
   Log.d(TAG, "onResume");
}

public void onPause()
{
   super.onPause();
   Log.d(TAG, "onPause");
}

public void onStart()
{
   super.onStart();
   Log.d(TAG, "onStart");
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);

return true;
}
}

2013年5月1日 星期三

string 和 wstring 互相轉換,適用於ASCII編碼

#include < iostream >
#include < string >
using namespace std;
int main(void)
{
 // -----------------------------------------------------------------
 // 1. string to wstring
 // -----------------------------------------------------------------
 // 不適用其他非ASCII編碼(1 byte)的字元,如Unicode編碼(2 bytes)之中文
 string str1 = "abc";

 wstring wstr1;
 wstr1.assign(str1.begin(), str1.end());
 // or
 // wstring wstr1(str1.begin(), str1.end());
 wcout << wstr1 << endl;
 // -----------------------------------------------------------------
 // 2. wstring to string
 // -----------------------------------------------------------------
 wstring  wstr2 = L"abc";
 string str2(wstr2.begin(), wstr2.end());
 // or
 //str2.assign(wstr2.begin(), wstr2.end());
 cout << str2 << endl;
}

如何替換字串中的字元(C++)

#include < string >

int main(void)
{
 std::wstring name = L"abc-def\\xyz";
 int position = name.find(L"\\");
 while(position != name.npos)
 {
  name.replace(position, 1, L"-");
  position = name.find(L"\\", position + 1);
 }
}