Ben OpenCV öğreticiler okudum ve assert
fonksiyonu rastlamak ; bu ne işe yarıyor?
Ben OpenCV öğreticiler okudum ve assert
fonksiyonu rastlamak ; bu ne işe yarıyor?
Yanıtlar:
assert
bağımsız değişkeninin yanlış olduğu ortaya çıkarsa programı (genellikle onaylama ifadesini gösteren bir mesajla) sonlandıracaktır. Hata ayıklama sırasında, beklenmedik bir durum ortaya çıkarsa programın daha açık bir şekilde başarısız olmasını sağlamak için yaygın olarak kullanılır.
Örneğin:
assert(length >= 0); // die if length is negative.
Bu şekilde başarısız olursa, görüntülenmesi için daha bilgilendirici bir mesaj da ekleyebilirsiniz:
assert(length >= 0 && "Whoops, length can't possibly be negative! (didn't we just check 10 lines ago?) Tell jsmith");
Ya da bunun gibi:
assert(("Length can't possibly be negative! Tell jsmith", length >= 0));
Bir sürüm (hata ayıklama olmayan) derlemesi yaparken , genellikle derleyici anahtarıyla makro assert
tanımlayarak deyimlerin değerlendirilme yükünü de kaldırabilirsiniz NDEBUG
. Bunun sonucu, programınızın asla çalışan makroya güvenmemesidir.
// BAD
assert(x++);
// GOOD
assert(x);
x++;
// Watch out! Depends on the function:
assert(foo());
// Here's a safer way:
int ret = foo();
assert(ret);
Abort () yöntemini çağıran ve hiçbir şey yapmayı garanti etmeyen programın birleşiminden, geliştiricilerin örneğin örneğin bir harf yerine bir sayı ( başka yollarla ele alınabilir).
assert
genellikle bir istisna yükseltir" - C ++ 'da "istisna" diyor iptal diyor ... biraz farklı.
#
karakter bir yorum sunmaz.
assert("error message", expression)
Assert bilgisayar deyim deyimi benzerdir emin marka İngilizce.
Şuna baksana
C ++ 'da assert () örnek programı
Birçok derleyici bir assert () makrosu sunar. Assert () makrosu, parametresi TRUE değerini değerlendirirse TRUE değerini döndürür ve FALSE değerini değerlendirirse bir tür işlem yapar. Birçok derleyici başarısız bir assert () üzerinde programı iptal edecektir; diğerleri bir istisna atacak
Assert () makrosunun güçlü özelliklerinden biri, DEBUG tanımlanmamışsa önişlemcinin kodu hiç kod içine daraltmamasıdır. Geliştirme sırasında büyük bir yardımcıdır ve nihai ürün gönderildiğinde, programın yürütülebilir sürümünün boyutunda herhangi bir performans cezası veya artış yoktur.
Örneğin
#include <stdio.h>
#include <assert.h>
void analyze (char *, int);
int main(void)
{
char *string = "ABC";
int length = 3;
analyze(string, length);
printf("The string %s is not null or empty, "
"and has length %d \n", string, length);
}
void analyze(char *string, int length)
{
assert(string != NULL); /* cannot be NULL */
assert(*string != '\0'); /* cannot be empty */
assert(length > 0); /* must be positive */
}
/**************** Output should be similar to ******************
The string ABC is not null or empty, and has length 3
Assert () işlevi program hatalarını tanılayabilir. C de tanımlanır <assert.h>
ve C ++ da tanımlanır <cassert>
. Prototipi
void assert(int expression);
Bağımsız değişken ifadesi test etmek istediğiniz herhangi bir şey olabilir - bir değişken veya herhangi bir C ifadesi. İfade TRUE olarak değerlendirilirse assert () hiçbir şey yapmaz. İfade YANLIŞ olarak değerlendirilirse, assert () stderr'de bir hata mesajı görüntüler ve programın yürütülmesini durdurur.
Assert () nasıl kullanılır? En sık program hatalarını izlemek için kullanılır (bunlar derleme hatalarından farklıdır). Bir hata, bir programın derlenmesini engellemez, ancak yanlış sonuçlar vermesine veya düzgün çalışmamasına neden olur (örneğin kilitleme). Örneğin, yazdığınız bir finansal analiz programı bazen yanlış cevaplar verebilir. Sorunun, faiz_oranı değişkeninin negatif bir değer almasından kaynaklandığından şüpheleniyorsunuz. Bunu kontrol etmek için ifadeyi yerleştirin
onaylama (faiz_oranı = = 0); faiz_oranının kullanıldığı programdaki konumlarda. Değişken negatif olursa, assert () makrosu sizi uyarır. Daha sonra sorunun nedenini bulmak için ilgili kodu inceleyebilirsiniz.
Assert () işlevinin nasıl çalıştığını görmek için aşağıdaki örnek programı çalıştırın . Sıfır olmayan bir değer girerseniz, program değeri görüntüler ve normal olarak sona erer. Sıfır girerseniz, assert () makrosu anormal program sonlandırmasını zorlar. Gördüğünüz tam hata mesajı derleyicinize bağlı olacaktır, ancak tipik bir örnek:
Onaylama başarısız oldu: x, dosya list19_3.c, satır 13 assert () işlevinin çalışması için programınızın hata ayıklama modunda derlenmesi gerektiğini unutmayın. Hata ayıklama modunu etkinleştirme hakkında bilgi için derleyici belgelerinize bakın (bir anda açıklandığı gibi). Daha sonra son sürümü yayın modunda derlediğinizde, assert () makroları devre dışı bırakılır.
int x;
printf("\nEnter an integer value: ");
scanf("%d", &x);
assert(x >= 0);
printf("You entered %d.\n", x);
return(0);
Bir tamsayı değeri girin: 10
10 girdiniz.
Bir tamsayı değeri girin: -1
Hata Mesajı: Anormal program sonlandırma
Hata mesajınız sisteminize ve derleyicinize bağlı olarak değişebilir, ancak genel fikir aynıdır.
'İstisna yükseltir' ve 'yürütmeyi durdurur' gibi şeyler çoğu derleyici için geçerli olabilir, ancak herkes için geçerli olmayabilir. (BTW, gerçekten istisnalar getiren iddia beyanları var mı?)
İşte c6x ve diğer TI derleyicileri tarafından kullanılan ilginç, biraz farklı bir assert anlamı: belirli iddia ifadelerini gördükten sonra, bu derleyiciler belirli optimizasyonları gerçekleştirmek için bu ifadedeki bilgileri kullanır. Wicked.
C ile Örnek:
int dot_product(short *x, short *y, short z)
{
int sum = 0
int i;
assert( ( (int)(x) & 0x3 ) == 0 );
assert( ( (int)(y) & 0x3 ) == 0 );
for( i = 0 ; i < z ; ++i )
sum += x[ i ] * y[ i ];
return sum;
}
Bu derleyiciye dizilerin 32 bitlik sınırlarda hizalandığını söyler, böylece derleyici bu tür bir hizalama için özel talimatlar üretebilir.
C ++ 11 N3337 standart taslak
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf
19.3 İddialar
1 (Tablo 42) 'de açıklanan <cassert> başlığı, C ++ program iddialarını belgelemek için bir makro ve onaylama kontrollerini devre dışı bırakmak için bir mekanizma sağlar.
2 İçerik, Standart C kitaplık başlığı <assert.h> ile aynıdır.
C99 N1256 standart taslak
http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
7.2 Teşhis <assert.h>
1 Üstbilgi
<assert.h>
, onaylama makrosunu tanımlar veNDEBUG
tarafından tanımlanmayan başka bir makrosu belirtir<assert.h>
. EğerNDEBUG
<assert.h> dahildir kaynak dosyada noktada makro adı olarak tanımlanmaktadır, assert makrosu basitçe olarak tanımlanır#define assert(ignore) ((void)0)
Assert makrosu, her
<assert.h>
dahil edildiğinde geçerli NDEBUG durumuna göre yeniden tanımlanır .2. İddia makrosu, gerçek bir fonksiyon olarak değil, bir makro olarak uygulanacaktır. Gerçek bir işleve erişmek için makro tanımı bastırılırsa, davranış tanımsızdır.
7.2.1 Program teşhisi
7.2.1.1 Onay makrosu
özet
1.
#include <assert.h> void assert(scalar expression);
Açıklama
2 İddia makrosu teşhis testlerini programlara koyar; geçersiz bir ifadeye genişler. Yürütüldüğünde, ifade (skaler tipte olacaktır) yanlışsa (yani 0'a eşitse), onaylama makrosu başarısız olan belirli çağrı hakkında (bağımsız değişkenin metni, kaynak dosya, kaynak satır numarası ve ekteki fonksiyonun adı - ikincisi sırasıyla ön tanımlı makroların
__FILE__
ve__LINE__
ve tanımlayıcının değerleridir__func__
) uygulama tarafından tanımlanan bir formatta standart hata akışındaki değerleridir. 165) Daha sonra iptal işlevini çağırır.İadeler
3 Onaylama makrosu hiçbir değer döndürmez.
Assert () işlevinin normalse normalde ve printf üzerinde kullanılmasının üç ana nedeni vardır.
assert () işlevi çoğunlukla hata ayıklama aşamasında kullanılır, son kodda bile yol almayacak bir koşulu her test etmek istediğinizde başka bir printf deyimi ile yazmak sıkıcıdır.
Büyük yazılım dağıtımlarında assert, derleyicinin assert () işlevi için başlık dosyasını bağlamadan önce tanımlanan NDEBUG makrosunu kullanarak assert deyimlerini yoksaymasını sağlayabileceğiniz çok kullanışlı bir yöntemdir.
assert (), bir işlev veya bazı kod tasarlarken ve kodun hangi sınırlarla çalışıp çalışmayacağı konusunda bir fikir edinmek istediğinizde kullanışlı olur ve son olarak temelde varsayımlarla oynamak için bir başka if içerir.
Değerlendirdiği değer yanlışsa programın yürütülmesini durduracak bir işlevdir. Genellikle bir makro ile çevrelenir, böylece serbest bırakma ayarlarıyla derlendiğinde sonuçtaki ikili dosyaya derlenmez.
Yaptığınız varsayımları test etmek için tasarlanmıştır. Örneğin:
void strcpy(char* dest, char* src){
//pointers shouldn't be null
assert(dest!=null);
assert(src!=null);
//copy string
while(*dest++ = *src++);
}
İstediğiniz ideal, programınızda geçersiz bağımsız değişkenlere sahip bir işlevi çağırmak gibi bir hata yapabilmeniz ve segfaults (veya beklendiği gibi çalışmazsa) önce bir onaylayıcıya basmanızdır.
Ayrıca, dinamik ayırmanın başarılı olup olmadığını kontrol etmek için kullanabilirsiniz.
Kod örneği:
int ** p;
p = new int * [5]; // Dynamic array (size 5) of pointers to int
for (int i = 0; i < 5; ++i) {
p[i] = new int[3]; // Each i(ptr) is now pointing to a dynamic
// array (size 3) of actual int values
}
assert (p); // Check the dynamic allocation.
Benzer:
if (p == NULL) {
cout << "dynamic allocation failed" << endl;
exit(1);
}
new
belirttiğiniz sürece tahsisat hatası üzerinde bir istisna atar nothrow
(burada yoktu). Dahası, biçimlendirmeniz garip ve exit
şeytani.
assert()
yalnızca bir sürüm derlemesi yapılmadan çok önce , asla , asla gerçekleşmeyecek şeylerin hatalarını ayıklamak ve damgalamak içindir .