2011-11-24 19 views
7

Duplicar posible:
length of array in function argumentsizeof una matriz pasa como argumento de la función

Hola estoy haciendo la tarea y estoy completamente perplejo. Se suponía que teníamos que conseguir cada orden de una lista de una matriz de enteros así que escribí esta pieza de código, con sede fuera de pseudocódigo de mi maestro:

void permute(int v[], int curr,char letters[]) 
{ 
    if(curr >= sizeof(v)/sizeof(int)) 
    { 
     checkit(v,letters); 
    } 
    for(int i = curr; i < sizeof(v)/sizeof(int); i++) 
    { 
     swap(i,curr,v); 
     permute(v,curr + 1,letters); 
     swap(v[curr],v[i]); 
    }//for 
}//permu 

La única cosa que no estoy seguro es si sizeof(v)/sizeof(int) es el derecho camino a seguir.

+3

Si su pregunta es de sólo 'sizeof (v)/sizeof (int)', sugeriría la edición de su título de la pregunta, porque no tiene nada que ver con "la repetición de permutaciones" ... –

Respuesta

9

sizeof(v)/sizeof(int) no es el camino a seguir. Su función es exactamente equivalente a:

void permute(int *v, int curr, char *letters) 
{ 
    ... 
} 

decir v no es realmente una matriz, que es un puntero. No puede pasar matrices en C o C++.

La solución es uno de los siguientes (no exhaustiva):

  • añadir un argumento extra que describe explícitamente la longitud de la matriz
  • añadir un argumento extra que apunta en el último elemento de la matriz
  • usar un recipiente adecuado (por ejemplo std::vector), que se puede llamar size() en
  • la solución plantilla que @sehe sugiere
+0

1 de contenedores, aunque para la tarea a veces no permiten que lo haga de la manera "correcta". – Anthony

+0

Pensé que podrías - permutar (int n [5]) está bien? La matriz no ha pasado bastante por el valor. Pero es una matriz –

+1

@Adrian: una matriz se desintegra a un puntero cuando se utiliza como un parámetro de función. –

5

Una de mis manías: usted puede conseguir C++ para deducir el tamaño de la matriz para usted

template <size_t N> 
void permute(int (&v)[N], int curr,char letters[]) 
{ 
    if(curr >= N) 
    { 
     checkit(v,letters); 
    } 
    for(int i = curr; i < N; i++) 
    { 
     swap(i,curr,v); 
     permute(v,curr + 1,letters); 
     swap(v[curr],v[i]); 
    }//for 
}//permu 
+0

¡Muchas gracias por esa respuesta! –

0

Además de la respuesta de Oli: la forma típica en C++ es pasar un puntero al comienzo y un puntero a el final de la secuencia que desea permutar. Por convención, el puntero inicial es inclusivo, el puntero final es exclusivo.

void permute(int *v, int *begin, int *end, char *letters) { 
    if (begin == end) { 
    checkit(v, end, letters); 
    } else { 
    ... 
    permute(v, begin + 1, end, letters); 
    ... 
    } 
} 
Cuestiones relacionadas