2012-04-29 19 views
10

questo si sente come una cosa davvero stupida a chiedere, ma ho avuto qualcuno prendere una classe di programmazione farmi una domanda per un aiuto su un incarico e vedo questo nel loro codice (nessun commento sulla notazione ungherese per favore):In una dichiarazione di funzione, cosa significa passare una matrice di dimensioni fisse?

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

Che, principalmente come programmatore C# (ho imparato a conoscere C e C++ al college) non sapevo nemmeno che potessi fare. Mi hanno sempre detto, e di aver letto da allora si suppone di avere

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

Mi hanno detto che il professore li questo ha dato e che funziona, così che cosa fa dichiarare un array di dimensione fissa così anche dire ? C++ non ha un modo nativo per conoscere la dimensione di un array passato (anche se penso che potrebbe essere stato modificato nelle specifiche più recenti)

+0

Ha modo nativo per conoscere la dimensione della matrice : questo metodo. Se gli dici quanto è grande l'array, crederà che lo sia. –

+1

Il '25' nella dichiarazione dei parametri viene ignorato dal compilatore. È lo stesso di 'ar_dictionary stringa []'. –

+0

@ H2CO3 Non c'è nulla che la funzione possa fare con quel numero, né alcun modo per il compilatore di verificare se ciò che viene passato ad esso è quella dimensione ... – cost

risposta

10

In un array monodimensionale Non ha alcun significato ed è ignorato dal compilatore. In un array a due o più dimensioni Può essere utile e viene utilizzato dalla funzione come modo per determinare la lunghezza della riga della matrice (o matrice multidimensionale). ad esempio:

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

questa funzione potrebbe conoscere l'indirizzo del arr[1][2] secondo la lunghezza specificata, e anche il compilatore non dovrebbe accettare diverse dimensioni di matrici per questa funzione -

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

non è permesso e sarebbe un errore di compilazione (g ++):

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

Cosa intendi con la funzione conoscere l'indirizzo? – cost

+1

accedere alla matrice in [x] [y] significa accedere all'elemento sulla riga y e colonna x. per questo devi sapere qual è la lunghezza della riga. 'arr [1] [2]' è lo stesso di arr [2 * 10 + 1] '. – WeaselFox

5

il 25 nella dichiarazione parametro viene ignorato dal compilatore. È come se avessi scritto string ar_dictionary[]. Ciò è dovuto al fatto che una dichiarazione di parametro del tipo di matrice viene adattata in modo implicito a un puntatore al tipo di elemento.

Così i seguenti tre dichiarazioni di funzione sono equivalenti:

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) 

Anche nel caso della prima funzione, con la dimensione della matrice esplicitamente dichiarata, sizeof(ar_dictionary) restituirà lo stesso valore di sizeof(void*).

Vedi 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; 
} 

uscita (il valore esatto è, ovviamente, dipende dall'implementazione, questo è puramente a scopo di esempio):

4 
4 
+1

La risposta di WeaselFox ha senso per te? Se è appena decaduto da un puntatore, allora quello che ha detto non dovrebbe essere vero. Sono un po 'confuso – cost

+0

Nel primo, sizeof (ar_dictionary) restituirà anche sizeof (void *)? – Spidey

+1

Le matrici con più dimensioni funzionano in modo diverso rispetto a quelle con una singola dimensione. Non sono sicuro di cosa abbia a che fare con qualcosa; la domanda riguarda solo gli array monodimensionali. @cos –

1

sempre però che passa dimensione fissa Gli array C++ erano una funzionalità "semi-cotta" del C++. Ad esempio, ignorato corrispondenza dimensioni o solo essere in grado di specificare il primo formato indice, ecc ... Fino a poco tempo ho imparato questo linguaggio:

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! 
} 

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

Problemi correlati