2012-04-29 11 views
10

Esto se siente como una cosa muy estúpida a pedir, pero me había alguien que toma una clase de programación pedirme un poco de ayuda en una tarea y veo esto en su código (no hay comentarios sobre la notación húngara por favor):En una declaración de función, ¿qué significa pasar una matriz de tamaño fijo?

void read_dictionary(string ar_dictionary[25], int & dictionary_size) {... 

Que, principalmente como programador de C# (aprendí sobre C y C++ en la universidad) ni siquiera sabía que podías hacer. Siempre me dijeron, y que he leído desde que se supone que tienes

void read_dictionary(string ar_dictionary[], int ar_dictionary_size, int & dictionary_size) {... 

Me han dicho que el profesor les dio esto y que funciona, así que ¿qué declarar una matriz de tamaño fijo, como decir que incluso ? C++ no tiene forma nativa de conocer el tamaño de una matriz que se le pasa (incluso si creo que podría haber sido cambiado en las especificaciones más recientes)

+0

Tiene forma nativa saber el tamaño de la matriz : este método. Si le dices cuán grande es la matriz, creerá que sí. –

+1

El '25' en la declaración de parámetro es ignorado por el compilador. Es lo mismo que 'string ar_dictionary []'. –

+0

@ H2CO3 No hay nada que la función pueda hacer con ese número, ni ninguna forma para que el compilador compruebe si lo que se le está pasando es ese tamaño ... – cost

Respuesta

10

En una matriz unidimensional No tiene importancia y es ignorada por la compilador. En una matriz de dos o más dimensiones. Puede ser útil y la función lo utiliza para determinar la longitud de fila de la matriz (o matriz multidimensional). por ejemplo:

int 2dArr(int arr[][10]){ 
    return arr[1][2]; 
} 

esta función sería conocer la dirección de arr[1][2] de acuerdo con la longitud especificada, y también el compilador no debe aceptar diferentes tamaños de matrices para esta función -

int arr[30][30]; 
2dArr(arr); 

no está permitido y sería un error del compilador (g ++):

error: cannot convert int (*)[30] to int (*)[10] 
+0

¿Qué quiere decir con que la función conocería la dirección? – cost

+1

acceder a la matriz en [x] [y] significa acceder al elemento en la fila y y la columna x. para esto, debes saber cuál es la longitud de la fila. 'arr [1] [2]' es lo mismo que 'arr [2 * 10 + 1]'. – WeaselFox

5

el 25 en la declaración parámetro es ignorado por el compilador. Es lo mismo que si hubiera escrito string ar_dictionary[]. Esto se debe a que una declaración de parámetro del tipo de matriz se ajusta implícitamente a un puntero al tipo del elemento.

Así las siguientes tres declaraciones de función son equivalentes:

void read_dictionary(string ar_dictionary[25], int& dictionary_size) 
void read_dictionary(string ar_dictionary[], int& dictionary_size) 
void read_dictionary(string *ar_dictionary, int& dictionary_size) 

Incluso en el caso de la primera función, con el tamaño del array declarado explícitamente, sizeof(ar_dictionary) devolverá el mismo valor que sizeof(void*).

Ver this sample on Codepad:

#include <string> 
#include <iostream> 

using namespace std; 

void read_dictionary(string ar_dictionary[25], int& dictionary_size) 
{ 
    cout << sizeof(ar_dictionary) << endl; 
    cout << sizeof(void*) << endl; 
} 

int main() 
{ 
    string test[25]; 
    int dictionary_size = 25; 
    read_dictionary(test, dictionary_size); 

    return 0; 
} 

de salida (el valor exacto es, por supuesto, dependiente de la implementación; esto es puramente para fines de ejemplo):

4 
4 
+1

¿La respuesta de WeaselFox tiene sentido para usted? Si simplemente se descompuso en un puntero, entonces lo que dijo no debería ser cierto. Estoy un poco confundido – cost

+0

En el primero, sizeof (ar_dictionary) devolverá sizeof (void *) también? – Spidey

+1

Las matrices con varias dimensiones funcionan de forma diferente que las que tienen una sola dimensión. No estoy seguro de qué tiene eso que ver con nada; la pregunta solo se refiere a arreglos unidimensionales. @cos –

1

siempre sin embargo que pasa tamaño fijo C++ arrays era una característica "medio horneada" de C++. Por ejemplo, ignorado coincidente tamaño o sólo ser capaz de especificar el primer tamaño del índice, etc ... Hasta hace poco me entero de este idioma:

template<size_t N1, size_t N2> // enable_if magic can be added as well 
function(double(&m)[N1][N2]){ 
    ... do something with array m...knowing its size! 
} 

Referencia: Can someone explain this template code that gives me the size of an array?

Cuestiones relacionadas