2011-02-04 21 views
6

配列を引数としてデフォルト値のint main()に渡すのが難しいです。たとえば :デフォルト値を持つパラメータとして配列を渡すint main()

int main(int a){} 

は素晴らしく動作します。私は、

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

googleing、かなりの量の後:int main()を渡す

int main(int a = 1){} 

ないとして配列も素晴らしく動作します:

int main(int a[3]) 

しかし、これら二つの概念を組み合わせること破るようです解決策が見つかりませんでした。

私を援助してください、あなたは私の唯一の希望です! ( - ちょうど学習にないポイント用)

EDITは

この目的、要するに、私の教授は、最近発行された挑戦のためにできるだけライン私のコードを、作ることです。割り当ては、再帰的「12日・オブ・Chirstmasの」プログラムを作成することです

これは私がメインの引数として詩の配列を渡す代わりにしたいと思います私の現在のプログラム

#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(); 
} 

ですそれを関数の上に宣言します。私は知っている、ほとんどのメモリ/スタックを意識していません。しかし、それは行を排除するでしょう:)

+1

をあなたがしたいのはなぜこれをして、なぜあなたは 'main'にそれをしなければならないのですか? –

+1

'int'または配列のみをとる' main() '関数は、標準のC++では' main() 'の有効な形式ではありません。ここで何をしようとしていますか? –

+0

int a [1]は1つの要素の配列ではない配列内の単一要素です – Jordan

答えて

12

:Cで

を++、 パラメータとして値でメモリの 完全なブロックを渡すことはできません あなたはこれを行うラインの数を減らすことができます関数に渡しますが、 はそのアドレスを渡すことができます。あなたは

void foo (int bar[]); 

で関数を宣言することができますが、あなたはそれがmain()とは何の関係もありません

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

を宣言することはできません理由です

。原因は本当にポインタとして渡される配列に、)(メインの可能性は低い使用ではなく、渡す配列をアドレッシング

+0

すばらしいリンクと簡単な説明。あなたのためにUpvote(arg!低評判の関数としてupvoteはありません) –

+0

C++で0xできます!しかし、配列が範囲外になると、その配列は破壊されます。興味深いコード。 – Vanuan

3

関数は、コマンドライン引数の数と引数自体の数を1つまたは2つだけ受け取る必要があります。

int main(int argc, char* argv[]) { 
} 
argc引数の量で

argvは引数を含むC-文字列のいずれかの配列です。

EDIT:

彼はフォーカスを変更しました。このlinkは最高のそれを説明し

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

したがって、mainはコンストラクタやその他の関数としてデフォルト引数を受け取ることができません。例:int main(int a = 5){} –

+0

これは標準ではありません。しかし、行数を減らすために多くのことを行うことができます。 'for 'は、例えば、非常に多くの行を減らします。 –

+0

'for'は非常に有益でしょう!残念ながら、再帰の力を教えようとしているので、要件の1つは「ループしていません」でした。 –

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

、あなたはこのようにそれを行うことができます。

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

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

応答してくれてありがとう、それは助ける! –

関連する問題