2012-12-11 13 views
5

Ho appena visto il seguente codice tra le richieste riuscite di codechef.Passaggio di array 2D con dimensioni variabili come argomento di funzione

http://www.codechef.com/viewplaintext/1595846

Ho usato pensare che

float max(int n,int arr[n][n]) 
{....} 

non è ammesso nel C++ (come 'n' è una variabile). Il mio CodeBlocks (su Windows) con MinGW [gcc 4.4] dà errore di compilazione. che "l'errore:.. gamma vincolati non è una costante intera

Allora come può essere una soluzione del genere essere accettate dal giudice di CodeChef C'è qualche bandiera speciale che ci permette di fare che in C++ ???

EDIT: Un collegamento che mostra lo stato come AC (accettato): http://www.codechef.com/viewsolution/1595846

+0

Sembra come C++ illegale a me. – goji

+1

Vedere la risposta di Abhishek Thakur sotto. Questa sottomissione è contrassegnata come C, non C++, e questo è legale in C (sebbene non in C++ standard). – Gorpik

risposta

5

Gli array automatici a lunghezza variabile sono consentiti in ISO C99 e come estensione GCC li accetta in modalità C90 e in C++. Questi array sono dichiarati come qualsiasi altro array automatico, ma con una lunghezza che non è un'espressione costante.

Rif: http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html

+0

In effetti, la richiesta dice che è implementata in C, non in C++. Quindi il codice è corretto secondo lo standard C. – Gorpik

+0

Grazie. Ho provato lo stesso codice in C, che ha funzionato. Ma per quanto riguarda il C++? Sta dando errori. – TheCrazyProgrammer

+0

@ TheCrazyProgrammer Si verificano errori perché questo è legale C, ma non legale C++. C++ 98 era quasi un superset rigoroso di C90, ma C99 è venuto più tardi e ha introdotto alcune funzionalità aggiuntive come questa. Versioni successive dello standard C++ non hanno reso prioritaria la compatibilità con C. – Gorpik

4

mi trovo corretto:. C99 non consentono questo per C, anche se molti compilatori non implementano ancora e alcuni probabilmente non sarà mai (Microsoft)

risposta Precedente

O passare arr come int ** o usare qualcosa come

template< int N > 
float max(const int (&arr)[N][N]) 
{ ... } 

che richiede fuori rotta N ad essere una costante di tempo di compilazione. La soluzione più sicura sarebbe utilizzare un file std :: vector o qualche altro contenitore che abbia conoscenza delle sue dimensioni.

Nel complesso il codice mi sembra abbastanza fragile.

Problemi correlati