2014-09-26 40 views
0

在g ++編譯器中,我的程序完美工作,但是,在CC編譯器中,出現錯誤。在CC編譯器中使用argv []用於C++

以下行:Shape s[atoi(argv[1])];給出錯誤: 錯誤:數組下標操作符中需要整型常量表達式。

然後,我嘗試將其更改爲:int i = atoi(argv[1]);,然後是Shape s[i];,但我仍然收到相同的錯誤。

我需要argv [1],因爲它從命令行獲取了多少個形狀。 例如./program 10 它應該使Team s[10];

如何獲得argv []與CC編譯器一起使用?

回答

1

對於數組,指定的大小必須是常量。因此,儘管你可以這樣做:

Team s[10]; 

你不能做到這一點:

int size = 10; 
Team s[size]; 

相反,你必須這樣做:

int size = 10; 
Team* s = new Team[size]; 
// do stuff 
delete[] s; 
+0

這是一個可怕的解決方案。唯一有效的解決方案是'std :: vector s(size)'。 – 2014-09-26 12:22:10

+0

不是每個人都想使用矢量。他問了一個問題,正確的答案是不給出一個替代方案(不管現在好多了,你認爲它是),而是回答所問的問題。 – GlGuru 2014-09-26 12:24:45

+0

這不是您是否想要的問題:在這種情況下,'std :: vector'是唯一正確的解決方案。 – 2014-09-26 14:35:24

2

Team s [10];

會在堆棧上創建數組,但只有在大小爲常量表達式時纔有可能。如果你想動態數組,那麼你必須與呼叫動態創建數組new[]

int size = atoi(argv[1]); 
Team* s = new Team[ size]; 

身高:std::vector<Team> tv(size);,這將緩解內存管理(畢竟,遲早,你將不得不學習STL庫,開始今天)。

+1

然後固定內存泄漏(優選通過使用'的std :: VECTOR',而不是更容易出錯指針雜耍)。 – 2014-09-26 12:01:55

+2

另外,C++中的VLA是g ++中的一致性擴展,這解釋了它在那裏工作的原因。 – Deduplicator 2014-09-26 12:04:10

+0

@Deduplicator我不確定你的意思是「符合延伸」。 C++標準需要診斷。 (當然,如果沒有適當的選項,g ++不再是C++編譯器,而是其他編譯器。使用'-std = C++ 11',對於初學者來說。) – 2014-09-26 12:23:38

1

在標準C++,數組的大小必須是編譯時常量。 GCC允許將可變長度數組作爲非標準擴展;其他編譯器不會。

爲此可移植,則需要動態分配的數組:

#include <memory> 

std::vector<Shape> s(atoi(argv[1])); 
+0

什麼時候是擴展名的標準擴展名?誰都必須執行它? – Deduplicator 2014-09-26 12:29:34

+0

@Deduplicator:我不知道你是什麼意思;擴展不是標準的。你只是反對我用冗餘的詞來強調? – 2014-09-26 12:41:50