2011-02-04 11 views
6

Ho difficoltà a passare un array come argomento in int main() con valori predefiniti. Per esempio:Passaggio di un array come parametro con valori predefiniti in int main()

int main(int a){} 

funziona meravigliosamente. Come fa

int main(int a = 1){} 

Passando int main() un array funziona anche meravigliosamente:

int main(int a[3]) 

Tuttavia, la combinazione di questi due concetti sembra rompere:

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

Dopo una quantità significativa di googleing, I non ho trovato una soluzione.

per favore aiutatemi QUINDI, siete la mia unica speranza!

EDIT

Lo scopo di questa, in breve, è quello di rendere il mio codice come poche righe più possibile, per una sfida il mio professore ha recentemente pubblicato (non per i punti - solo per l'apprendimento). L'assegnazione è quello di creare un programma ricorsivo "12-giorni-di-chirstmas"

Questo è il mio programma in corso

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

vorrei passare nella matrice di versi come argomento principale, invece di dichiarandolo sopra la funzione. Lo so, non il maggior numero di ricordi/stack consci. Ma eliminerebbe una riga :)

+1

Perché vuoi fai questo, e perché devi farlo per 'main'? –

+1

Una funzione 'main()' che accetta solo un 'int' o un array non è una forma valida di' main() 'in C++ standard. Cosa stai cercando di fare qui? –

+0

int a [1] è un singolo elemento in una matrice non una matrice di un elemento – Jordan

risposta

12

Questo link spiega meglio:

In C++ non è possibile passare un blocco completo della memoria per valore come parametro a una funzione, ma siamo autorizzati a passare il suo indirizzo .

Ecco perché è possibile dichiarare una funzione con

void foo (int bar[]); 

, ma non è possibile dichiarare

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

Non ha nulla a che fare con main().

+0

Ottimo link e spiegazione semplice. Votate per voi (arg! No upvote in funzione della bassa reputazione) –

+0

Con C++ 0x potete! Ma quell'array verrebbe distrutto quando uscirà dall'ambito di applicazione. – Vanuan

3

La funzione main() non dovrebbe ricevere nessuno o due parametri la quantità di argomenti della riga di comando e gli argomenti stessi.

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

Dove argc è la quantità di argomenti e argv è un array di C-stringhe contenenti gli argomenti.

EDIT:

Ha cambiato la messa a fuoco. È possibile ridurre il numero di linee a fare questo:

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

Quindi, main non può ricevere argomenti predefiniti, come costruttore o altra funzione può? esempio: int main (int a = 5) {} –

+0

Non è standard. Ma puoi fare molte cose lì per ridurre il numero di linee. Un 'for' per esempio ridurrà così tante linee. –

+0

Un 'for' sarebbe molto utile! Sfortunatamente, uno dei requisiti era "no looping" mentre cercava di insegnarci il potere della ricorsione. –

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

Affrontare la matrice di passaggio, piuttosto che l'uso improbabile di main(), a causa della gamma davvero essere passato come un puntatore, si può fare in questo modo:

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

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

Codice interessante. Grazie per la risposta, aiuta! –

Problemi correlati