Cı C

2012-11-26 14 views
8

gibi (gömülü malzeme) önce C kullanılan başlatıcı, dizi indeksleri belirtmek ++, ve bunun gibi diziler başlatabilir: Cı C

int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 }; 

yani bir başlatıcı içinde dizinler belirtebilir. Şu anda Qt/C++ öğreniyorum ve bunun C++ 'da desteklenmediğine inanamıyorum.

Bu seçeneğe sahibim: -std=gnu++0x, ancak yine de desteklenmiyor. (C++ 11'de desteklenip desteklenmediğini bilmiyorum, çünkü Qt gcc ile çalışır. 4.7.x)

Gerçekten de C++'da desteklenmiyor mu? Ya da bunu etkinleştirmenin bir yolu var mı?

UPD: şu anda const dizisini başlatmak istiyorum, bu nedenle std::fill çalışmayacak. Burada alınan:

+1

"Veya bunu etkinleştirmenin bir yolu var mı?" - C kullan? (: D) İyi soru, +1. –

+3

Sizin kodunuz C (C11 dahil) değildir. C11 bu şekilde başlatma aralıklarını desteklemez ('[a ... b] = 1'), sadece tek elemanlar (' [a] = 1'). – ybungalobill

+0

hmm ... 'extern' C '{................} 'ifadesini kullanabiliyor musunuz? Ama bu sözdiziminin gömülü derleyicinizin eklenmesi olduğuna inanıyorum. – anishsane

cevap

1

Yıllar sonra, sadece tesadüfen test ettim ve bunun g++ -std=c++11, g ++ sürümü 4.8.2 olarak çalıştığını onaylayabilirim.

7

, hm GNU C++

düzenleme uygulanmadı http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html inits belirlenen (uzatma) burada belirtildiği gibi

... bu görev için std :: fill_n() kullanmalıdır : initialize a const array in a class initializer in C++

yorum olarak, std: vektörünü kullanarak istediğiniz sonucu elde edebilirsiniz. Yine de const'i başka bir şekilde uygulayabilir ve fill_n'yi kullanabilirsiniz.

int* a = new int[N]; 
// fill a 

class C { 
    const std::vector<int> v; 
public: 
    C():v(a, a+N) {} 
}; 
+0

Cevabınız için teşekkürler. Aslında const dizisini başlatmam gerekiyor, 'std :: fill_n() 'benim için çalışmayacak. –

+1

@DmitryFrank: 'std :: vector' işlevini kullanın,' fill_n' kullanarak vektörü ilklendiren ve sonucu döndüren bir işlev yazın. Const şablonunu başlatmak için bu işlevi kullanın. – ybungalobill

+1

Ayrıca silmeniz gerekir; Dizi doldurmak için iki dinamik ayırma, aşırı bir sıkıntı değil mi? – iammilind

2

Hayır, C++ ile bu şekilde yapmak mümkün değildir. Ama değerlerini atamak için std::fill algoritmasını kullanabilirsiniz:

int widths[101]; 
fill(widths, widths+10, 1); 
fill(widths+10, widths+100, 2); 
fill(widths+100, widths+101, 3); 

O kadar zarif değildir, ama işe yarıyor.