2013-08-07 30 views
5

Bir ses uygulaması geliştiriyorum (C++) ve birbirini çağıran çok sayıda fonksiyon var. Bu kartların sayısı kare sayısını (yani, 1 mono veya 2 stereo float örneği) veya ham sayıyı alıyor. örnekler ...Tamsayılarla otomatik kalıpları önleme

Her fonksiyonun semantiklerini (örnekler veya kareler?) takip etmek çok zorlaşıyor ve ne zaman çok veya nChannels tarafından bölündüğünden, bir şekilde typedef samples_t ve frames_t (imzasız int) ve derleyici bana yardımcı olur ...

Fram_t dosyasından sample_t ile örtük bir dönüşümün C++ 'da hata olarak işaretlenmesi için herhangi bir basit yol var mı?

+1

C++ için şunu faydalı bulabilirsiniz: http://www.boost.org/doc/libs/1_54_0/doc/html/boost_units/Quick_Start.html. –

+0

olası bir kopyası çoğaltın [C tipi güçlü yazım denetimi (yazım hataları için yazım katı)] (http://stackoverflow.com/questions/376452/enforce-strong-type-checking-in-c-type-strictness-for-typedefs) ya da [C cinsinden uyumsuzluğu zorlamak için iyi bir yol var mı?] (http://stackoverflow.com/questions/3140035/is-there-a-good-way-to-force-type-incompatibility-in-c). –

+0

@OliCharlesworth: Her zaman en son kararlı sürüm için belgelere götüren Boost sürümü yerine «release» özelliğini kullanabilirsiniz (gitmek için önerilen yol) –

cevap

1

frames_t ve samples_t aslında farklı türde olmadıkça değil. Onları bir tamsayı içeren POD yapıları haline getirebilirsiniz, ancak yazarak onları hiçbir etkisi olmayacaktır.

+0

Tam Değer deyim, doğru mu? http://martin-moene.blogspot.co.uk/2012/07/light-on-whole-value.html – doctorlove

+0

En güzel çözüm değil, ama aslında yeterince iyi çalıştı ... Şimdi en azından En hassas kod (işleme yığınının birinden diğerine geçtiği yer) ve sinir bozucu hataların çoğunu yakalamayı başardım (izlemesi zor olan, çünkü ses çalması ve yarısı ya da iki katı olması gerekir) – MikasMix

2

boost.units içinde kendi sisteminizi tanımlayabilir ve alternatif olarak her tür için güçlü bir yazım hatası oluşturmak için yalnızca BOOST_STRONG_TYPEDEF makrosunu kullanabilirsiniz.

0

typedef ile yapamazsınız, ancak destek size yardımcı olabilir.

Tümü dönüştürülemez tipte ise, BOOST_STRONG_TYPEDEF hile yapacaktır: Bu, tüm unsigned birden çok türü oluşturmanıza izin verir, ancak etrafında geçirilirken birbirinin arasında dönüştürülebilir değil.

Ancak belirli bir uygulamada, aritmetik sonuçlarının uygun birimleri miras aldığı birim türlerini gerçekte oluşturabileceğiniz destek birimleri çerçevesini göz önünde bulundurmak isteyebilirsiniz (örneğin freq * time birimsizdir).