顯示文章

這裡允許您檢視這個會員的所有文章。請注意, 您只能看見您有權限閱讀的文章。


文章 - AD

頁: [1] 2
1
程式討論版 / system call
« 於: 2004-05-09 09:50 »
代碼: [選擇]

ad@machine ~ $ ldd /bin/uname
        libc.so.6 => /lib/libc.so.6 (0x40028000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)


這顯示 uname 這個程式用到了 libc.so.6 與 ld-linux.so.2 這兩個
動態函式庫,也許這兩個函式庫都會再呼叫核心的 system call,但
是在這邊看不出來。

那 system call 與一般的函式呼叫有何不同?

就我所知道的一點,linux 為了安全的理由,不希望讓使用者能隨意
的存取硬體。但是一個 OS 如果不能存取硬體,那這個 OS 還有人要
用嗎 :D 於是 linux 提供一些介面(也就是 system call),讓使用
者(這邊的使用者指的是 programmer)能夠藉由這些 system call
來做到硬體的控制,例如像是讀取硬碟中的檔案等等。

2
程式討論版 / volatile
« 於: 2004-03-03 19:23 »
先說明一下 CPU, register與記憶體的關係好了

register 的作用跟記憶體很像,也是存放資料的,但是對 CPU
來說,存取 register 中的資料比存取記憶體中的資料要快 (因
爲 register 是位在 CPU 內部的,但是數量並不多)。

我舉一個例子好了:
代碼: [選擇]

int a = 20;
...
int b = a; //此時 compiler 可能會將 a 的值放在 register 中
int c = a;

這時候,compiler 可能會決定將 a 的值放在 register 中,於
是在 c 的初始化過程就不用為了取得 a 的值而跑到記憶體,直
接在 register 就可以得到 a 的值。


在只有一個執行緒的時候,上面的動作不會有問題。但是在多
執行緒的環境,或是會有其他的程式會更改變數的值就可能會
發生錯誤。
代碼: [選擇]

int* clock = get_clock(); //取得指向系統時間的指標,而時間會隨時更動
...
int time_a = *clock;
int time_b = *clock;

因為系統的時間是一直改變的,雖然在程式碼中看不見這樣的
變動,但是在初始化 time_a 與 time_b 的時刻,系統的時間
一定不會相同,如果 compiler 對 clock 的存取作最佳化,
time_b 的值很有可能就會與 time_a 相同,而造成錯誤。

於是,在宣告 clock 時,應該要用
代碼: [選擇]

volatile int* clock = get_clock(); //告訴 compiler 不要對 clock 作最佳化

這樣就可以保證取得的 clock 值,是位在記憶體的資料,而不
是在快取在 register 中的舊值。

3
程式討論版 / volatile
« 於: 2004-03-02 13:03 »
我有聽過一個解釋是說

volatile 是告訴 compiler 不要對存取這個變數作最佳化

因為在最佳化的過程中,compiler 可能會將變數的值
存在 register 上以加快存取的速度。但是在多緒
的環境下,如果說有其他的執行緒同時也要存取這
個變數,存取到的值可能不是真正的值(真正的值
此時還未存回記憶體中)

所以會需要 volatile 的存在

4
1. 求 string 的長度並不是用 sizeof(),而是使用 string::size()
   
2. 如果要使用中文,應該要用 wstring 而不是 string

6
我的 gcc version 是 3.2.3
測試過後  沒有發現任何問題


請教過 google 大神之後
似乎是  gcc 2.96 還未將 c++ standard 完整實作出來

可改由下面的方式達到你的目的
代碼: [選擇]

cout << setiosflags(ios::scientific) << 1230.3434433 << '\n';


ps:
我在 google 用的關鍵字是:
代碼: [選擇]

scientific undeclared gcc 2.96

7
這是我在 borland c++ 所得到的錯誤訊息:
代碼: [選擇]

F:\Temp>bcc32 array.cpp
Borland C++ 5.6.4 for Win32 Copyright (c) 1993, 2002 Borland
array.cpp:
Error E2313 array.cpp 8: Constant expression required in function main()
*** 1 errors in Compile ***

在 C++ 中,陣列的大小仍然必須是常數
(但是在1999 年所制定的 ISO C 就可以用變數來定義陣列的大小)
我不確定今年所制定的新標準會不會加上去

ps:
ISO/IEC 14882:2003 PDF version (en)

將CHF(Swiss Franc)換成新台幣

天阿  這種東西誰買的下去 :o

8
Linux 討論版 / [問題]Shell 產生亂數密碼
« 於: 2003-10-08 12:50 »
試試看 makepasswd
代碼: [選擇]

ad@m5-107 ~ $ makepasswd --char 20 --count 10
aqKINnDjsddqxVT3CMCs
WSnG9DS7W6o9dXDHfe19
htUxGEw0KVDCuPStUjFD
08uu4e74SprhoogdW4Ir
EeLmqNJFrF6YC79Y43HG
Gy5JzadjmjKBboaIirrH
iDWzv9xptT1Fi1e1w2Ke
rU92uY1ft8rdRrjeypnr
YjgIKHiR7wBtxB8i6I77
oy4Tjy5dTGSyHtisPhSn
ad@m5-107 ~ $

9
C/C++程式設計討論區 / [問題](C++)for的問題
« 於: 2003-09-27 11:54 »
這是屬於 scope 的問題

當你在處理迴圈時:
代碼: [選擇]

...
for( int i = 0; i < 10; ++i ){
    ...
}
int b = i;//這邊會出問題


因為 i 是在 for loop 中宣告的,而在程式離開了 for loop 後,
i 對於你的程式已經是 "不可見的",所以 b = i 這個指令會出問題

最後來試試看這個問題吧

代碼: [選擇]

void func()
{
    int x = 1;
    for( int x = 0; x < 10; ++x ) {
        ...
    }
    x += 1;
    cout << x << endl; // x=?
}

   
不過關於 scope 的部分還是要翻翻書喔
這個觀念滿重要的

10
程式討論版 / 請問幾個問題...
« 於: 2003-09-25 15:22 »
& && &= 這類的符號叫做運算子(operator)

找找看原文書的 index,應該都會提到吧

11
程式討論版 / 請問幾個問題...
« 於: 2003-09-25 12:50 »
keyword 的中文翻譯是"關鍵字"。

像是在 C++ 中的 int double char class for while 都是 keyword。

這些 keyword 對 C++ 來說,每個都有特殊的意思,所以變數,函式

或是一些自訂類別的名字就不能用來些 keyword 來命名。


ps:如果原文書太難的話,也許可以先挑一本中文書擋著先  :wink:

12
程式討論版 / 請問幾個問題...
« 於: 2003-09-25 01:24 »
嗚...你是在問作業嗎 :o

13
試試看 atoi
代碼: [選擇]

 #include <stdlib.h>
 #include <stdio.h>

 int main(void)
 {
    int num;
    char *str = "12345";

    num = atoi(str);
    printf("string = %s, integer = %d\n", str, num);
    return 0;
 }


14
C/C++程式設計討論區 / 關於C語言...
« 於: 2003-08-29 22:22 »
引用

寫程式.... 用那一種程式語言來寫重要嗎 ? 很抱歉, 在 99% 的實務上, 用
什麼寫一點兒都不重要, 重要的是你能夠把你要做的事情, 讓你寫出來的程
式正確的跑出來.


也許從程式語言的角度上來說,每種語言可能都差不多。只要你熟悉C++和
物件導向的概念,學習 C#/Java 可能不用兩三天就可以掌握個大概。但是
我覺得在背後支撐語言的 framework or library 也需要加以考慮。從剛開
始學習到能在程式中熟練的運用整個 library,這中間所花的時間也是相當
長的。

你選擇了 C++,寫程式靠的是 STL/Boost/ACE/Loki。
你選擇了 C#,是整個 .NET framework 在背後撐著。
至於 Java,我一點都不熟   :D

引用

寫程式重要的是創意與解決問題的能力.

可也別忘記挑個順手的好工具 :wink:

引用

不過在這個業界上, C 仍然佔有很大的地位, 所以如果有可能, 還是要能看
懂 C 的程式. (其實 Java 在某些方面有取而代之的趨勢).

現在也有許多好書用的也是 Java :cry:

15
在處理浮點數的格式化輸出時,可以使用 manipulator 來做控制,
像是 setprecision(val) 便可以設定精準度:
代碼: [選擇]

#include <iomanip> //要先含入此檔

std::cout << std::setprecision(5)
          << 12.3456789 << std::endl;



若是看不懂 cout 前面為何要加上 std::
請先參考市面上較新的 c++ 書籍

16

代碼: [選擇]

include<iostream.h>

改成
代碼: [選擇]

#include <string>


因為 string 類別定義在 namespace std 中
所以還要加上:
代碼: [選擇]

using namespace std;


所以程式應該長的像這樣:
代碼: [選擇]

#include <string>
using namespace std;

int main()
{
    string n;
    //...
}


以上的規定是C++的新標準,如果你的書連 namespace 都沒提到
的話,先買一本新書吧,不要浪費太多時間在這邊。

17
C/C++程式設計討論區 / C language 問題.
« 於: 2003-08-17 23:38 »
不管在任何平台上寫的 c program,只要是使用標準的語法或函式,
都可以在任何平台上 compile 並執行。

但是在 Linux 下 compile 的程式是無法在 Windows 下執行的,因為
兩個 OS 執行檔的二進位格式並不相同

18
C/C++程式設計討論區 / 關於C語言...
« 於: 2003-08-02 00:36 »
如果不是這麼急的話,我先推薦這本計算機概論
http://www.tenlong.com.tw/BookSearch/Search.php?isbn=9867727215

這本書對電腦運作的原理,演算法,資料結構,程式語言,作業系統等等都
有介紹到,在學程式前,如果能將一些基本的東西先抓起來,幫助應該滿大


而且這本書翻譯的品質我覺得還不錯,價錢也還合理,我滿喜歡的
(交大資工也把這本原文書當作計概的教材)

19
C/C++程式設計討論區 / 請問C的鏈結串列...?
« 於: 2003-07-23 13:39 »
不過我覺得就"用"的方面來說,只要知道大概的原理就可以了

像是提到 linked list,應該就要想到它是由節點所組成,所以在插入或是刪
除元素的表現上會有很好的效率,但是在搜尋方面可能就不是這麼的方便
(因為要從一個節點跳到另一個節點,依序找下去)

知道每個資料結構的優缺點,在適當的場合中去使用,應該是比較好的方法

從"學"的角度來看,我就很贊同 abelyang 的看法

在使用東西時,能知道背後的原理是最好的

資料結構和演算法是程式設計的基石,應該要在這方面要下苦工去學習

20
C/C++程式設計討論區 / 請問C的鏈結串列...?
« 於: 2003-07-22 23:46 »
一定要自己寫嗎?

如果不是的話,C++的STL裡就有現成的可以用

21
c:
http://www.gnu.org/manual/glibc-2.2.5/libc.html

c++(stl):
http://www.sgi.com/tech/stl/table_of_contents.html

另外推薦一本書
http://www.jjhou.com/jjtbooks-the-cpp-standard-library.htm

如果想對 stl 有整體性的了解,我覺得上面那本書是個不錯的選擇
另外,這本書有 index,當作字典查也很方便 :wink:

22
雜七雜八 / re: [閒聊]沒事的可以試試看
« 於: 2003-06-12 23:20 »
順便提一下

第二張圖片是從 The Matrix: Reloaded 中節錄下來的

這邊有比較詳細的資料

http://www.insecure.org/nmap/nmap_inthenews.html

23
雜七雜八 / [閒聊]沒事的可以試試看
« 於: 2003-06-12 23:17 »
有沒有人想小試身手 :wink:

http://wargame.free-bsd.org

下面是有人寫的簡介

http://kalug.linux.org.tw/~chihchun/item/96

24
程式討論版 / array 注意地方
« 於: 2003-06-06 21:52 »
唔...這個自己試一下應該不用花五分鐘吧 :wink:

其實我是學C++的,字串的處理我都直接用 std::string 解決

很少會用到指標去處理字串

25
程式討論版 / array 注意地方
« 於: 2003-06-04 18:49 »
像 "const" 用雙引號所圍起來的字元(s)叫做 string literal

在新的標準中,它所代表的是 const char 所組成的 array

compiler 提供如下的隱式轉換是為了要和過去的程式碼相容
代碼: [選擇]

char *str = "const";

但是在gcc3.2.2中,如果我接下來作出設值的動作
代碼: [選擇]

str[1] = 'a';

compile可以通過,不過在執行時就會請我吃segmentation fault

(另外在bc++5.6我也做了這樣的測試,結果是沒有問題的 :o )

26
程式討論版 / array 注意地方
« 於: 2003-05-31 19:51 »
char buf[10];

buf 的型別仍然應該是 char* 吧

char *a = "const";

a 的型別才是 const char*

27
程式討論版 / array 宣告
« 於: 2003-05-31 19:32 »
樓上的說的對喔
除非是 global 的變數才能保證它的初始值為 0 吧

一般的 local 變數或是從 heap 要來的記憶體
其內容應該都是之前所殘存的

ps:如果要將 structure or array 的內容清為 0 可以用

void *memset(void *s, int c, size_t n);

ex:
代碼: [選擇]

struct Blah
{
    //blah...
};
Blah blah;
memset( &blah, 0, sizeof(Blah) );

28
呃...其實我看不太懂你的問題...

你是問
代碼: [選擇]

int func( int a );


代碼: [選擇]

int func( int a )
{
    // do something...
}

有什麼不同嗎?

29
雜七雜八 / re: 對岸用語請教
« 於: 2003-05-08 20:44 »
是否為 c 的 "macro" ?

30
我想您指的應該是ANSI C++

另外在linux要編譯c++的檔案要用g++( 應該是吧,久沒用不太記得了 )

還有
#include <iostream.h>
要改成
#include <iostream>
再加上
using namespace std;
(是為了符合 ansi/iso standard)

如果您手中的書沒有提到namespace的話
建議您再買一本( 年代太久遠了 )

推薦的書單:C++ Primer, The C++ Programming Language
兩本書都有中文版,翻的也都不錯
不過也有人說不適合第一次學程式語言的人
也許您可以先在書局買一本自己看的懂的先
但是要學好c++這兩本是一定要k的啦 :D
(曾經有位網友說過:坊間許多的C++書籍只能帶領我到C++的大門前,
但是只有C++ Primer能幫你把門打開)
而且您真的是剛學程式語言又不太懂英文的話
誠心的建議您要買本書放在身邊 :wink:

頁: [1] 2