2011-02-04 7 views
6

Tengo dificultades para pasar una matriz como argumento en int main() con valores predeterminados. Por ejemplo:Pasar una matriz como un parámetro con valores predeterminados en int main()

int main(int a){} 

funciona de maravilla. Al igual que

int main(int a = 1){} 

Pasando int main() una matriz también funciona de maravilla:

int main(int a[3]) 

Sin embargo, la combinación de estos dos conceptos parece romper:

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

Después de una cantidad significativa de googleing, me no he encontrado una solución.

por favor, ayúdame ¡ASÍ, eres mi única esperanza!

EDITAR

El propósito de esto, en definitiva, es hacer mi código como pequeñas líneas como sea posible, para un desafío a mi profesor ha publicado recientemente (no por puntos - sólo para el aprendizaje). La asignación es crear un recursiva programa "12-días-de-chirstmas"

Este es mi programa actual

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

me gustaría transmitir en el conjunto de versos como un argumento a principal en lugar de declarándolo por encima de la función. Lo sé, no es la mayor cantidad de memoria/pila consciente. Pero eliminaría una línea :)

+1

¿Por qué quiere haz esto, y ¿por qué tienes que hacerlo a 'main'? –

+1

Una función 'main()' tomando solo un 'int' o una matriz no es una forma válida de' main() 'en C++ estándar. ¿Qué está tratando de hacer aquí? –

+0

int a [1] es un elemento único en una matriz, no una matriz de un elemento – Jordan

Respuesta

12

Este link lo explica mejor:

En C++ no es posible pasar de un bloque completa de la memoria por su valor como parámetro a una función, pero estamos permitidos para pasar su dirección.

Es por eso que se puede declarar una función con

void foo (int bar[]); 

pero no se puede declarar

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

No tiene nada que ver con main().

+0

Excelente enlace y explicación simple. Voto a favor suyo (¡arg! No upvote como una función de baja reputación) –

+0

¡Con C++ 0x usted puede! Pero esa matriz se destruirá cuando salga del alcance. – Vanuan

3

La función main() solo debería recibir ninguno o dos parámetros la cantidad de argumentos de línea de comando y los argumentos en sí.

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

Dónde argc es la cantidad de argumentos y argv es una matriz de c-cadenas que contienen los argumentos.

EDIT:

Cambió el enfoque. Se puede reducir el número de líneas haciendo esto:

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

Entonces, ¿main no puede recibir argumentos predeterminados, como un constructor u otra función? ejemplo: int main (int a = 5) {} –

+0

No es estándar. Pero puedes hacer muchas cosas allí para reducir el número de líneas. Un 'for' por ejemplo reducirá tantas líneas. –

+0

¡Un 'for' sería muy beneficioso! Desafortunadamente, uno de los requisitos era "no bucle", ya que está tratando de enseñarnos el poder de la recursividad. –

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

Dirigiéndose a la matriz que pasa más que el uso probable de main(), debido a la gran variedad de verdad que se pasa como un puntero, puede hacerlo de esta manera:

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

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

Código interesante. Gracias por la respuesta, ¡ayuda! –

Cuestiones relacionadas