Re: [問題] atoi的問題

看板C_and_CPP作者時間14年前 (2010/08/05 19:14), 編輯推噓2(2012)
留言14則, 5人參與, 最新討論串3/3 (看更多)
: ※ 發信站: 批踢踢實業坊(ptt.cc) : ◆ From: 140.121.197.115 : ※ 編輯: loveme00835 來自: 140.121.197.115 (08/05 15:52) : → xatier:陣列名稱可以想成是一個const char* 型的指標, 指向的位址 08/05 16:01 : → xatier:定不變 08/05 16:01 : → loveme00835:如果像一樓所說, 就太浪費陣列所包含的資訊了, 考慮 08/05 16:11 : → loveme00835:這段程式碼 : http://paste.plurk.com/show/288965/ 08/05 16:12 說到這個 讓我想到之前討論過的C99 VLA和C++的問題 如love大所說,應把array跟pointer當成不同型態(但array可轉型成pointer) 在C89(C90)之前array至少還有"array length"這個constant資訊 但在C99引進VLA後 故事似乎有些改變... 我曾經測試過VLA在g++上是可以使用的(大概是compiler自己實作的extension?) 也就是以下混合C++和C99的程式碼在g++是可以執行的 #include <iostream> #include <algorithm> int main(int argc, char *argv[]) { int len = 3; char a[len]; // VLA a[0] = '0'; a[1] = '1'; a[2] = '2'; std::cout << *std::max_element(a,a+len); } 不過由於C99的VLA違反了C++分別處理動態型別和靜態型別的設計理念 使得C99更難相容於C++... 以love大的這個程式為例 由於C99的改變,很明顯的下面程式就出了問題 #include <iostream> template<typename T, int LEN> void printarray(T (&array)[LEN]) { for (int i = 0; i < LEN; ++i) std::cout << array[i] << ' '; } int main(int argc, char *argv[]) { int len = 3; char a[len]; a[0] = '0'; a[1] = '1'; a[2] = '2'; printarray(a); //ERROR!! } compiler會抱怨:⊙皿⊙凸我找不到match的function啊!! 這時 我們應該回到過去C語言處理動態分配的方法 printarray(char *array, int const LEN); 也難怪C++的爸爸斥責C99一點也不顧慮C++的兼容性...( ′-`)y-~ (小弟只是新手,只是突然看到這種現像覺得挺有趣的 如有錯誤請各位前輩糾正及補充囉!) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.24.192.68

08/05 19:24, , 1F
推認真~
08/05 19:24, 1F

08/05 20:58, , 2F
今天lab學弟說課堂上老師說C的ptr跟arr就是一樣的東西
08/05 20:58, 2F

08/05 20:58, , 3F
聽到都哭哭了
08/05 20:58, 3F

08/05 21:00, , 4F
還有文中 typo VLA -> LVA
08/05 21:00, 4F

08/05 21:01, , 5F
因為這樣說好理解啊 而且在run-time他們行為的確很像...
08/05 21:01, 5F

08/05 21:02, , 6F
很多人誤認為這樣一輩子了 程式也是寫的好好的XD
08/05 21:02, 6F

08/05 21:06, , 7F
寫泛型程式會比較care他的型別, 所以會注意
08/05 21:06, 7F

08/05 21:11, , 8F
不是VLA(Variable-Length Array)嗎@@?
08/05 21:11, 8F

08/05 21:12, , 9F
有一個地方打錯 XD
08/05 21:12, 9F
感謝幫忙debug 其實是兩個XD ※ 編輯: hilorrk 來自: 114.24.192.68 (08/05 21:13)

08/05 23:04, , 10F
我記得VLA會相容於C++的確是compiler自己做的 不過現在想
08/05 23:04, 10F

08/05 23:04, , 11F
不起來在哪看到的
08/05 23:04, 11F

08/05 23:17, , 12F
不會是我之前的推文吧(誤
08/05 23:17, 12F

08/06 07:22, , 13F
VLA == 伸縮自如的陣列XD
08/06 07:22, 13F

08/06 12:41, , 14F
VLA沒有伸縮自如哦 出去就回不來了XDD
08/06 12:41, 14F
文章代碼(AID): #1CMfq7gl (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1CMfq7gl (C_and_CPP)