2014-04-12 28 views
1

我的主接受命令行參數(碰巧是所有的整數),然後我需要在它的堆棧上創建一個數組。接受整數主要參數,然後使用它們來聲明一個數組,問題與恆定?

int main(int ragc, char *argv[]) { 

互聯網使它看起來像約定的char *,是有可能接受一個int *,而不是因爲我的命令行參數只打算是整數?

其次,我需要聲明使用2的參數如下:

char databuf[nbufs][bufsize]; // where nbufs * bufsize = 1500 

但是編譯器在我吼說nbufs和BUFSIZE需要有一個恆定值。不幸的是,他們必須將我接受的命令作爲命令行參數接受,那麼它們將如何成爲常量值?

int main(int ragc, char *argv[]) { 
    int nbufs = atoi(argv[3]); //grabs the nbufs 
    int bufsize = atoi(argv[4]); //grabs the bufsize 
    char databuf[nbufs][bufsize]; //where nbufs * bufsize = 1500 

回答

2

如果main包含參數,然後第二個參數必須的char* S(或const char*多個)的陣列。這只是它在規範中的定義。直觀地說,不能保證命令行參數必須是整數;有人可以用文本參數運行你的程序,並且不清楚將報告錯誤的人(OS,或者你的程序)是誰的工作?

其次,在C++中,您不能聲明尺寸不恆定的數組。 C允許你這樣做(它們被稱爲變長數組),在C++ 1y(C++的下一個版本)中,這可能會被支持,但是目前你不能在C++中做到這一點。爲了解決這個問題,而不是使用std::vectorstd::vector S,這樣的:

std::vector<std::vector<char>> databufs(nbufs, std::vector<char>(bufsize)); 

希望這有助於!

+0

爲什麼Linux中的g ++編譯器不在乎如果我給非常量數組維度? –

+0

@MilanNovaković'g ++'支持C++中的可變長度數組作爲編譯器擴展。這不是技術上有效的C++,並且不一定會在其他編譯器上編譯。 – templatetypedef

1

是否可以接受一個int *,因爲我的命令行參數只會是整數?

不,這是不可能的:標準規定個別參數是char*。您使用atoi對您所做的事情完全有效。

它們必須是我接受的命令行參數,所以它們如何是常量值?

它們不能是常數值,所以您需要使用動態分配。由於這是C++,更好的選擇將是一個字符串向量;然而,char**也是可能的:

char **dataBuf = new char*[nbufs]; 
for (int i = 0; i != nbufs ; i++) { 
    dataBuf[i] = new char[bufsize]; 
} 
// Use dataBuf here 
... 
// Now free its memory 
for (int i = 0; i != nbufs ; i++) { 
    delete[] dataBuf[i]; 
} 
delete[] dataBuf; 

注:C99確實允許對可變大小的數組; g ++也允許這些作爲擴展。但是,您應該小心使用擴展,因爲它們會使您的程序更加便於攜帶。

+0

一旦我們不在,我們也應該釋放/釋放內存。 –

+0

@MantoshKumar編輯,謝謝! – dasblinkenlight

0

它必須是char*,因爲char*可以表示任何可能的值,但如果它是int/int*,則您的輸入範圍僅限於數字。我相信這就是爲什麼標準選擇使用char*來定義它。

相關問題