2012-12-11 14 views
5

Aşağıdaki kodu kod coececf'teki başarılı gönderiler arasında gördüm. Değişken boyutlarıyla 2B dizisini işlev argümanı olarak geçirme

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

I ('n' gibi bir değişkendir) ++
float max(int n,int arr[n][n]) 
{....} 

C izin verilmez düşünmek için kullanılır. MinGW [gcc 4.4] ile My CodeBlocks (pencereler) derleme zaman hatası verir. yapmamızı sağlayan herhangi bir özel bayrak var mı bağlı dizisi bir tamsayı sabit değildir Ardından

nasıl CodeChef en hakim tarafından kabul edilmesi böyle bir çözüm olabilir C++ ???

o: Hata" söyledi.. DÜZENLEME: AC olarak statüsünü gösteren bir bağlantı (kabul) : http://www.codechef.com/viewsolution/1595846

+0

http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html bana yasadışı C++ gibi görünüyor. – goji

+1

Bkz. Abhishek Thakur cevap aşağıda. Bu gönderim C, C++ olarak işaretlenmez ve bu, C cinsinden yasal olarak gerçekleşir (standart C++ olmasa da). – Gorpik

cevap

5

ISO C99'da değişken uzunlukta otomatik dizilere izin verilir ve GCC uzantısı olarak bunları C90 modunda ve C++ olarak kabul eder. Bu diziler diğer otomatik diziler gibi bildirilir, ancak sabit bir ifade olmayan bir uzunluktadır.

Ref:

+0

Gerçekten de, gönderim C++ değil C'de uygulandığını söylüyor. Bu yüzden kod C standardına göre doğrudur. – Gorpik

+0

Teşekkürler. Aynı kodu C'de denedim, işe yaradı. Peki ya C++? Hata veriyor. – TheCrazyProgrammer

+0

@TheCrazyProgrammer Bu, yasal C, ancak yasal C++ olmadığı için hatalarınız var. C++ 98, C90'ın neredeyse katı bir süperuydu, ancak C99 daha sonra geldi ve bunun gibi bazı ek özellikler getirdi. C++ standardının sonraki sürümleri C ile uyumluluk sağlamaya öncelik vermemiştir. – Gorpik

4

Ben düzeltilmiş standı:. C99 C için buna izin vermez, birçok derleyiciler henüz bunu uygulamaya ve bazı muhtemelen asla (microsoft) olmadığı halde

Önceki cevap

Ya ** int olarak arr geçmesi veya ders dışı bir derleme zamanı sabiti olması N gerektirir

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

gibi bir şey kullanın. En güvenli çözüm, bir std :: vektörünü veya boyutu hakkında bilgi sahibi olan başka bir kapsayıcı kullanmak olacaktır. Genel kod, benim için oldukça kırılgan gibi gözüküyor.

İlgili konular