Asercje - warunek końcowy?

0

Jak powinna wyglądać funkcja która przyjmuje dodatnią liczbę i zwraca, na przykład, powiększoną o 5 ów liczbę, która również jest dodatnia?

Chodzi mi głównie o to jak sprawdzić warunek końcowy?

int Funkcja( int X )
{
    // Warunek początkowy
    assert( X > 0 );

    // Warunek końcowy
    assert( X + 5 > 0 ); 

    return X + 5;
}

W taki sposób nie sprawdzam zwracanej liczby, a pewne obliczenie, a jak sprawdzić czy funkcja poprawnie zwróciła liczbę?

0

Może przy wywołaniu funkcji ?

assert( Funkcja( X ) > 0 );

0

Albo tak:(nie trzeba będzie pisać za każdym razem asercji)

int Funkcja( int X )
{
    // Warunek początkowy
    assert( X > 0 );
 
    int ret = X + 5;

    // Warunek końcowy
    assert( ret > 0 );
    return ret;
}
0

To pierwsze rozwiązanie jest według mnie nieschludne, warunek końcowy funkcji chyba powinien być sprawdzany przez nią samą, a nie gdzieś na zewnątrz.

Natomiast drugi to dodatkowa zmienna która po debugu dalej istnieje, ale jest to chyba póki co jedyny akceptowalny zapis. Nie ma lepszego? :-/

0

Jak wlaczysz optymalizacje to ten ret i tak bedzie w eaxie wiec nic nie tracisz.

Może przy wywołaniu funkcji ?

assert( Funkcja( X ) > 0 );

NIGDY nie wpychaj w asercje kodu ktory potrzebujesz zeby na pewno sie wykonal!

0

Heh, nie słyszałem o tym ^^ dzięki, dobrze wiedzieć na przyszłość.

Jakoś nie korzystam za często z tych asercji ;]

0

Gdzie juz o tym wspominalem (nie tylko ja), asercje przy kompilowaniu programu jako release sa ucinane, pol biedy jak to bedzie jakies tam makro w samej funkcji asert, gorzej jak kompilator zechce sobie to zoptymalizowac i w ogole aserta nie wywola, wtedy i twoja funkcja sie nie wywola.

0

W jakim sensie ucina? Masowe wycinanie/zakomentowanie czy to kompilator je pomija?

0

VC 2005:

/***
*assert.h - define the assert macro
*
*       Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
*       Defines the assert(exp) macro.
*       [ANSI/System V]
*
*       [Public]
*
****/

#include <crtdefs.h>

#undef  assert

#ifdef  NDEBUG

#define assert(_Expression)     ((void)0)

#else

#ifdef  __cplusplus
extern "C" {
#endif

_CRTIMP void __cdecl _wassert(__in_z const wchar_t * _Message, __in_z const wchar_t *_File, __in unsigned _Line);

#ifdef  __cplusplus
}
#endif

#define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )

#endif  /* NDEBUG */

Czyli jak napiszemy:

bool foo()
{
	cout << "hej";
	return true;
}

int main()
{
	assert(foo());
	std::cin.get();
	return 0;
}

To przy wersji debug dostaniemy napis, a przy release nie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1