2011年11月14日 星期一

const的意義(const pointer, pointer to const, const pointer to a const, const function...)

#include
#include
using namespace std;
class A
{
private:
     int y;
public:
 A(){
  y=0;
 }
 int f1(int x) const // 此const代表此function不可以修改Data Member
 {
  x++;
  // y++; // Error! y為Data Member,因此不可以修改
  return y;
 }
 const int f2(int x) // 回傳值為const
 {
  x++;
  y++;
  return y;
 }
 int f3(int const x) // 參數為const
 {
  // x++; // Error! x為const,不可以修改
  y++;
  return y;
 }
 void f4(int const *x) // x is variable pointer to a constant integer,也可以寫成f4(const int *x)
 {
  // (*x)++; // Error! pointer x所指向的實體為const,因此不可以修改其值
  *x++; // 此行的意思是*(x++),先修改pointer x的值,在指向實體
 }
 void f5(int const &x) // x is variable reference to a constant integer
 {
  // x++; // Error! x就是一個const
 }
 void f6(int *const x) // x constant pointer to a variable integer
 {
  (*x)++;
  // *x++; // Error! Constant pointer x 不可以指向其他實體
 }
 const char * f7() // 回傳一個variable pointer to a constant char
 {
  return "ABC";
 }
 void f8(const int * const x) // x is constant pointer to a const integer
 {
  // (*x)++; // Error! x所指向的實體為const,因此不可以修改其值
  // *x++; // Error! Constant pointer x 不可以指向其他實體
 }
};
int main(){
 A a;
 int x=3;
 a.f1(x);
 a.f2(x);
 a.f3(x); // int x 會自動轉成const int x傳入
 a.f4(&x) ;
 a.f5(x) ;
 const char *s = a.f7(); // 必須使用一個const來接const
 // s[0]='0'; // Error! 無法對const 變數進行改變動作
 return 0;
}

Reference: http://csie-tw.blogspot.com/2010/03/c-constconst-pointer-pointer-to-const.html

2011年11月9日 星期三

How to use cpplint.py

First, you should install python

Second, download cpplint.py

Third, run below script in command line

cpplint.py –output=vs7 helloworld.cpp

Then you can get the result.

2011年11月4日 星期五

Struct for sockaddr,sockaddr_in,sockaddr_in6,addrinfo

struct sockaddr {
      unsigned short sa_family;        /* address family, AF_xxx */
      char sa_data[14];                /* 14 bytes of protocol address */
};

struct sockaddr_in {
      short int sin_family;            /* Address family AF_INET */
      unsigned short int sin_port;     /* Port number */
      struct in_addr sin_addr;         /* Internet address */
      unsigned char sin_zero[8];       /* Same size as struct sockaddr */
};
struct in_addr {
      unsigned long s_addr;            /* Internet address */
};

struct sockaddr_in6 {
      sa_family_t sin6_family;         /* AF_INET6 */
      in_port_t sin6_port;             /* transport layer port # */
      uint32_t sin6_flowinfo;          /* IPv6 traffic class & flow info */
      struct in6_addr sin6_addr;       /* IPv6 address */
      uint32_t sin6_scope_id;          /* set of interfaces for a scope */
};
struct in6_addr {
      uint8_t s6_addr[16];             /* IPv6 address */
};

struct addrinfo{
      int ai_flags;                    /* AI_PASSIVE,AI_CANONNAME,AI_NUMERICHOST */
      int ai_family;                   /* AF_INET,AF_INET6 */
      int ai_socktype;                 /* SOCK_STREAM,SOCK_DGRAM */
      int ai_protocol;                 /* IPPROTO_IP, IPPROTO_IPV4, IPPROTO_IPV6 */
      size_t ai_addrlen;               /* Length */
      char *ai_cannoname;              /* */
      struct sockaddr *ai_addr;        /* struct sockaddr */
      struct addrinfo *ai_next;        /* pNext */
};

2011年10月24日 星期一

Dichotomy Sort 二分排序法

二分法排序(Dichotomy Sort)的精神就是將目標對切,與中間元素相比,較小就把左邊剩餘的陣列再對切,然後重複做一樣的事直到最後
反之亦然,把所有元素都做過這個動作後就是排序好的陣列

int array[100];
for (int i = 0; i < 100; i++)
{
 int start, end, mid;
 start = 0;
 end = i - 1;
 mid = 0;
 int temp = array[i];
 while (start <= end)
 {
  mid = (start + end) / 2;
  if (array[mid] > temp)//目標元素在陣列左邊
  {
   end = mid - 1;
  }
  else
  {
   start = mid + 1;
  }
 }
 for (int j = i - 1; j > end; j--)//找到插入的位置,將其後的元素後移一位
 {
  array[j + 1] = array[j];
 }
 array[end + 1] = temp;

}

2011年10月5日 星期三

不定參數的使用 (Who to use Variable-length argument)

所謂的不定參數指的就是在定義function時,我們無法事前得知會傳入的參數個數(如printf)時的一種function撰寫技巧
以下是使用不定參數另外定義一個function,讓我們可以在print時可為console畫面加上顏色。

#define DBG_RED "\033[22;31m"
#define DBG_GREEN "\033[35;32m"
#define DBG_BLUE "\033[22;34m"
#define DBG_MAGENTA "\033[22;35m"
#define DBG_WHITE "\033[01;37m"
#define DBG_YELLOW "\033[01;33m"

#define DBG_LRED "\033[01;31m" 
#define DBG_LGREEN "\033[01;32m"
#define DBG_LBLUE "\033[01;34m"


void mydebug(const char *color,const char *format, ...);//__attribute__((format(printf,2,3)));

#define DBG(color, fmt, arg...)  mydebug(color, fmt, ## arg)

void mydebug(const char *color,const char *format, ...)
{
 static char text[512];
 va_list ap; 
 
 va_start(ap, format);
 vsnprintf((char *)text,512,format, ap);
 va_end(ap);
 if (text[strlen(text) - 1] == '\n')
 {
  text[strlen(text) - 1] = 0;
  printf("%s%s\033[0m\n",color,text);
 }
 else
  printf("%s%s\033[0m",color,text);
}

USAGE:
DBG(DBG_RED, "Himiro Test:%s\n", "Hello world");

2011年10月3日 星期一

在Access 2007找到表單

access2007
左上角的「office選項」點下去→access選項→目前資料庫→顯示表單

2011年9月19日 星期一

Tera Term VT - 為不同 serial port 設定專屬 shortcut

如果你手上有多個Device,同時每個Device都有自己的baud rate,可以試著做以下的設定,

這樣就不用每次開起Tera Term的時候都有另外再調整設定

先建立一個Tera Term的捷徑,然後右鍵->內容,在目標的最後面加上

/BAUD=57600 /C=3

就可以了,以下是說明。

/BAUD=
baud rate of serial port. If the baud rate not supported by Tera Term is specified, this option is ignored.

/C=
Serial port
/C=1 COM1
/C=2 COM2
/C=3 COM3
:
/C=256 COM256

參考連結:
Tera Term command line