2008-04-26

5分鐘計時開始!

星期四寫的... 五分鐘碼表

給有特殊需求的人:P

下載

2008-04-23

好玩的 Tiddly Wiki

今天初見 Tiddly Wiki,覺得實在滿酷的...原來JavaScript可以這樣玩。

不過現在瀏覽器都讓他不警告JavaScript存取檔案......有點擔心XD

2008-04-20

C++ Vector Iterator

vector 新增/刪除元素會導致 iterator 失效,此時不該再對其 iterator 做 dereference ,否則產生 runtime error。

使用 list 可保證 iterator 不失效,但 iterator 前後關係仍會改變。此外 list 不支援像 aList[i] 這樣直接用 index 存取其中的元素。

2008-04-18

C++ Dynamic 3D Array

WoW!

#include <iostream> int main(void){ int i=6,j=5,k=4; int ****threeDimensionArr;// 4 stars! for 3D threeDimensionArr = new int ***[i]; for(int i_i=0; i_i<i; ++i_i){ threeDimensionArr[i_i] = new int **[j]; for(int j_i=0; j_i<j; ++j_i){ threeDimensionArr[i_i][j_i] = new int *[k]; for(int k_i=0; k_i<k; ++k_i){ threeDimensionArr[i_i][j_i][k_i] = new int(i_i*j_i*k_i); std::cout << *threeDimensionArr[i_i][j_i][k_i]<<"\t"; } std::cout << std::endl; } std::cout << std::endl; } //free memory for(int i_i=0; i_i<i; ++i_i){ for(int j_i=0; j_i<j; ++j_i){ for(int k_i=0; k_i<k; ++k_i){ delete threeDimensionArr[i_i][j_i][k_i]; } delete [] threeDimensionArr[i_i][j_i]; } delete [] threeDimensionArr[i_i]; } }

C++ Array of References?

It's legal to get reference of dynamical allocated object:

std::vector<double> *vec = new std::vector<double>(5); std::vector<double> &vec0Ref = *vec;

Use it:

#include <iostream> #include <vector> int main(){ size_t *n = new size_t; std::cin >> *n; std::vector<double> *vec = new std::vector<double>[*n]; // No error when vec is Pointer to Nothing! (*n == 0/1) // It is dangerous using dynamic array... std::vector<double> &vec0Ref = vec[0]; std::vector<double> &vec1Ref = vec[1]; double *a = new double; std::cin >> *a; vec0Ref.push_back(*a); //runtime-error when *n <= 0 std::cout << vec0Ref[0] << std::endl; vec1Ref.push_back(*a); //runtime-error when *n <= 1 std::cout << vec1Ref[0] << std::endl; }

Note:

會想到要拿到動態物件的 reference,是因為想要在物件建立後使用 array of references 取代 array of pointers ,用來放 sorting 的結果或做 mapping。但發現 It's illegel!

reference 並不能用來作為 array 或 container 的元素。基本上,reference 並不是物件,因此沒有辦法複製它,或改變其內容(指reference本身);其意義只是物件的別名。在JAVA/C#中的意義又不太一樣了;reference 感覺像是 const pointer。

當我們要對已存在的數個物件做 mapping,sorting 之類的動作,只能使用 array of pointers 來避免複製物件。之前會想要使用 reference 是因為書上說使用 reference 比 pointer 自然,也錯把 reference 視作 const pointer。(以前學JAVA= =)然而在這種情況下,使用 array of pointers 才是合理且正確的用法。

Another Test:

#include <iostream> int main(){ //existing objects int a=1, b=2; int arr[2] = {a,b}; // correct //error: declaration of `refs' as array of references int &refs[2] = {a,b}; //error! //array of pointers to integer int *ptrs[2] = {&a,&b}; // correct //reference of arr[2] int (&ref)[2] = arr; // correct //pointer to arr[2] int (*ptr1)[2] = &arr; // correct //assign "array" to "pointer to array" int (*ptr2)[2] = arr; // error! //pointer to first element of array int *ptr3 = arr; // correct std::cout <<"arr="<<arr<<" arr[1]="<<arr[1]<< std::endl <<"ref="<<ref<<" ref[1]="<<ref[1]<<std::endl <<"ptr1="<<ptr1<<" *ptr1="<<*ptr1 <<" (*ptr1)[1]="<<(*ptr1)[1]<<std::endl <<"ptr3="<<ptr3<<" ptr3[1]="<<ptr3[1]<<std::endl; std::cout <<"sizeof(arr)="<<sizeof(arr)<<std::endl <<"sizeof(ref)="<<sizeof(ref)<<std::endl <<"sizeof(ptr1)="<<sizeof(ptr1)<<std::endl <<"sizeof(*ptr1)="<<sizeof(*ptr1)<<std::endl <<"sizeof(ptr3)="<<sizeof(ptr3)<<std::endl; }
將錯誤去掉後的執行結果:
arr=0012FF5C arr[1]=2 ref=0012FF5C ref[1]=2 ptr1=0012FF5C *ptr1=0012FF5C (*ptr1)[1]=2 ptr3=0012FF5C ptr3[1]=2 sizeof(arr)=8 sizeof(ref)=8 sizeof(ptr1)=4 sizeof(*ptr1)=8 sizeof(ptr3)=4

可見 array of reference 不合法。

此外,雖然 ptr3 跟 arr 幾乎等效,ptr3 其實還是 pointer to int(arr[0]) 而非 array name。而 ptr1 是 pointer to arr,因此*ptr1 就是 arr。

2008-04-13

C++ Dynamic Array Test

Note:

The elements of a dynamically allocated array can be initialized only to the default value of the element type. The elements cannot be initialized to separate values as can be done for elements of an array variable.

To initialize elements,

method 1:

std::cin >> n; std::vector<int> **vec = new std::vector<int> *[n]; for (int i=0;i<n;i++) //initialize each vector vec[i]=new std::vector<int>(i); // use first vector vec[0]->push_back(something);

method 2:

std::cin >> n; // vectors are initialized by default constructor std::vector<int> *vec = new std::vector<int>[n]; for (int i=0;i<n;i++) // change size of each vector (vec+i)->resize(i); // equivalent to vec[i].resize(i) // use first vector vec[0].push_back(something);

2008-04-12

C++ Array and Reference Test

這幾天在學C++,對arrayreference的用法做個測試。

#include <iostream> #include <string> void test(std::string (&str)[2]){ std::cout << sizeof(str) << " " << sizeof(std::string); } int main(){ size_t n; std::cin >> n; size_t m = 2; const size_t o = 3; std::string *testStrArr1 = new std::string[n];// correct std::string testStrArr2[n]; // wrong in VC++, correct in gcc, wrong in ISO C++ std::string testStrArr3[2] = {"hello","hi"}; // correct std::string testStrArr4[m]; // wrong in VC++, correct in gcc, wrong in ISO C++ std::string testStrArr5[o]; // correct test(testStrArr1); // wrong test(testStrArr2); // wrong test(testStrArr3); // correct test(testStrArr4); // wrong test(testStrArr5); // wrong [3]->[2] }

正確的那行會印出: 8 4

2008-04-08

stack<book> books;

現在桌上堆了一疊:

  • Head First Design Pattern
  • C++ Primer 4th edition(中文版...)
  • C++ Pocket Reference
  • 剛拿出來要寫作業的數通課本(Ziemer/Tranter)
  • 英漢辭典一本...

筆電裡還有一 trunk 的 ebooks... 目前想要看的有:

  • Head First SQL
  • Head First OOA&D
  • C++ GUI Programming with Qt 4
  • etc...(這算是推薦書單嗎? Head First系列都很好入門~)

看完是無可能的...? = =a

都是為了要完成我心中的小軟體orz

希望這學期能把該看的看完...

--

ps. 久違了...blogger 新開張! 網址是 http://jienew.twbbs.org/