2011-02-04 32 views
6

Tôi đang gặp khó khăn khi chuyển mảng thành đối số thành int main() với giá trị mặc định. Ví dụ:Chuyển mảng thành tham số có giá trị mặc định vào int main()

int main(int a){} 

hoạt động tuyệt vời. Cũng như

int main(int a = 1){} 

Đi qua int main() một mảng cũng làm việc tuyệt vời:

int main(int a[3]) 

Tuy nhiên, việc kết hợp hai khái niệm này dường như phá vỡ:

int main(int a[1] = {0,1}) 

Sau một số lượng đáng kể googleing, tôi đã không tìm thấy một giải pháp.

hãy giúp tôi SO, bạn là hy vọng duy nhất của tôi!

EDIT

Mục đích của việc này, trong ngắn hạn, là làm cho mã của tôi như dòng ít càng tốt, cho một thách thức giáo sư của tôi vừa ban hành (không cho điểm - chỉ dành riêng cho học tập). Việc chuyển nhượng là để tạo ra một chương trình đệ quy "12-ngày-of-chirstmas"

Đây là chương trình hiện tại của tôi

#include <iostream> 
#include <string> 
void p(std::string v){std::cout<<v;} 
std::string v[13] = {"A Partridge in a Pear Tree.\n\n","2 Turtle Doves\n","3 French Hens\n","4 Colly Birds\n","5 Gold Rings\n","6 Geese-a-Laying\n","7 Swans-a-Swimming\n","8 Maids-a-Milking\n","9 Ladies Dancing\n","10 Lords-a-Leaping\n","11 Pipers Piping\n","12 Drummers Drumming\n",""}; 
int main(){ 
    switch(v[12].length()){ 
     case 12:system("pause"); return 0; 
     case 11:p(v[11]); 
     case 10:p(v[10]); 
     case 9: p(v[9]); 
     case 8: p(v[8]); 
     case 7: p(v[7]); 
     case 6: p(v[6]); 
     case 5: p(v[5]); 
     case 4: p(v[4]); 
     case 3: p(v[3]); 
     case 2: p(v[2]); 
     case 1: p(v[1]); 
     case 0: p(v[0]); 
    }v[12] += "0"; 
    main(); 
} 

Tôi muốn vượt qua trong các mảng của câu thơ như một cuộc tranh cãi to main thay vì tuyên bố nó ở trên hàm. Tôi biết, không phải là bộ nhớ/ngăn xếp có ý thức nhất. Nhưng nó sẽ loại bỏ một dòng :)

+1

Tại sao bạn muốn làm điều này, và tại sao bạn phải làm điều đó với 'main'? –

+1

Một hàm 'main()' chỉ lấy một 'int' hoặc một mảng không phải là một dạng hợp lệ của' main() 'trong tiêu chuẩn C++. Bạn đang cố gắng làm gì ở đây? –

+0

int [1] là một phần tử duy nhất trong mảng không phải là mảng của một phần tử – Jordan

Trả lời

12

link này giải thích nó tốt nhất:

Trong C++ nó không thể vượt qua một khối hoàn chỉnh của bộ nhớ bằng giá trị như một tham số với một hàm, nhưng chúng tôi được cho phép chuyển địa chỉ của nó.

Đó là lý do tại sao bạn có thể khai báo một hàm với

void foo (int bar[]); 

nhưng bạn không thể tuyên bố

void foo (int bar[] = {0 ,1}); 

Nó không có gì để làm với main().

+0

Liên kết tuyệt vời và giải thích đơn giản. Upvote cho bạn (arg! Không upvote như là một chức năng của danh tiếng thấp) –

+0

Với C + + 0x bạn có thể! Nhưng mảng đó sẽ bị phá hủy khi nó vượt quá phạm vi. – Vanuan

3

Chức năng main() chỉ nên nhận không có hoặc hai tham số số lượng đối số dòng lệnh và chính đối số đó.

int main(int argc, char* argv[]) { 
} 

đâu argc là số lượng các đối số và argv là một mảng của C-chuỗi có chứa các đối số.

EDIT:

Ông đã thay đổi sự tập trung. Bạn có thể giảm số lượng các dòng làm điều này:

void loop(int i) { 
    if (i < 0) { v[12] += "0"; return; } 
    p(v[i]); 
    loop(i-1); 
} 
int main() { 
    if (v[12].size() == 12) return; 
    loop(v[12].size()); 
    main(); 
} 
+0

Vì vậy, chính không thể nhận được các đối số mặc định, như một hàm tạo hoặc hàm khác có thể? Ví dụ: int main (int a = 5) {} –

+0

Nó không phải là tiêu chuẩn. Nhưng bạn có thể làm nhiều thứ ở đó để giảm số lượng dòng. Ví dụ, 'for' sẽ giảm quá nhiều dòng. –

+0

Một 'for' sẽ khá có lợi! Thật không may, một trong những yêu cầu là "không có vòng lặp" vì anh ta đang cố gắng dạy chúng ta sức mạnh của sự đệ quy. –

1
#include <stdio.h> 
int go(int); 
int main(int argc, char*argv[]) { 
go(0); 
} 
int go(int argc) { 
const char* lyrics[] = {...}; 
printf("On the %d%s day of Christmas\nmy true love gave to me\n",argc, 
    argc==1?"st":argc==2?"nd":argc==3?"rd":"th"); 
for(int i=argc-1;i>0;--i) { printf("%d %s\n",i+1,lyrics[i]); } 
printf("%s\n\n",lyrics[0]); 

if(argc < 12) go(argc+1); 
return 0; 
} 
7

Phát biểu tại mảng truyền hơn là việc sử dụng không của main(), do các mảng thực sự được truyền dưới dạng con trỏ, bạn có thể làm điều đó như thế này:

int defaultInit[2] = {0,1}; // {0,1} means 2 elements for the array. 

int f(int arg[2] = defaultInit) 
{ 
    return 0; 
} 
+0

Mã thú vị. Cảm ơn bạn đã phản hồi, nó sẽ giúp bạn! –

Các vấn đề liên quan