2012-12-11 16 views
5

Właśnie zobaczyłem następujący kod wśród udanych zgłoszeń w codechef.Przekazywanie dwuwymiarowej tablicy o zmiennych wymiarach jako argumentu funkcji

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

kiedyś że

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

nie jest dozwolone w C++ (a 'n' jest zmienna). My CodeBlocks (w oknach) z MinGW [gcc 4.4] daje błąd podczas kompilacji. że „błąd:.. Tablica związany nie jest stała liczba całkowita

Więc jak może być takie rozwiązanie być zaakceptowane przez sędziego CodeChef za Czy jest jakaś specjalna flaga, która pozwala nam to zrobić w C++ ???

EDIT: Link pokazuje status AC (zaakceptowane): http://www.codechef.com/viewsolution/1595846

+0

Wydaje się nielegalną C++ do mnie. – goji

+1

Zobacz odpowiedź Abhishek Thakur poniżej. To zgłoszenie jest oznaczone jako C, a nie C++, co jest prawdą w języku C (ale nie w standardowym C++). – Gorpik

Odpowiedz

5

Automatyczne tablice o zmiennej długości są dozwolone w ISO C99, a jako rozszerzenie GCC akceptuje je w trybie C90 i C++. Te tablice są zadeklarowane jak wszystkie inne automatyczne tablice, ale o długości, która nie jest wyrażeniem stałym.

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

+0

Rzeczywiście, zgłoszenie mówi, że jest zaimplementowane w języku C, a nie w C++. Kod jest więc prawidłowy zgodnie ze standardem C. – Gorpik

+0

Dzięki. Próbowałem tego samego kodu w C, który działał. Ale co z C++? Daje błędy. – TheCrazyProgrammer

+0

@ TheCrazyProgrammer Masz błędy, ponieważ jest to legalne C, ale nie legalne C++. C++ 98 był prawie ścisłym nadzorem C90, ale C99 pojawił się później i wprowadził dodatkowe funkcje, takie jak ta. Późniejsze wersje standardu C++ nie nadały priorytetu zachowaniu zgodności z C. – Gorpik

4

stoję poprawione. C99 zezwala to na C, chociaż wiele kompilatorów nie realizować go jeszcze i niektórzy prawdopodobnie nigdy nie będzie (Microsoft)

Poprzednia odpowiedź

Albo przechodzą arr jako int ** lub użyć coś jak

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

który zboczył z kursu wymaga N, aby mieć stały czas kompilacji. Najbezpieczniejszym rozwiązaniem byłoby użycie std :: vector lub innego pojemnika, który ma wiedzę na temat jego wielkości.

Ogólnie kod wydaje mi się dość delikatny.

Powiązane problemy