Отчет о тестировании

advertisement
Мини-Проект ARAGELI
Отчёт о тестировании.
История документа:
Автор
Сиднев А. А.
Зайцев М. С.
Камаев А.М.
Дата
16.02.2006
20.02.2006
22.02.2006
Комментарий
Создание и редактирование
Редактирование
Редактирование
Отчёт о тестировании:
№ Автор/Дата
1 Сиднев А. А.
/16.02.2006
2
3
Сиднев А. А.
/16.02.2006
Сиднев А. А.
/16.02.2006
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
Тест или код,
вызывающий
ошибку
big_int a(0);
Поле a.number->data=0 (указатель на ноль это плохо).
Если вместо 0 написать другую константу работает верно.
sparse_polynom<big_int> sp("2*x^2+5*x7+3*x");
monom<big_int> m(41,3456);
sp/m = sp. Результат наверно должен быть =
0. Если моном заменить на полином, то
результат правильный. Для int'а ошибка таже.
sparse_polynom<double> a = "1.12345*x1e45*x^2+1234.5678*x^3-0.000002334";
cout<<a;
sparse_polynom<double> x=a;
double b;
a+=b;
a-=b;
bool rez=(a==x);//rez=false
Вывод глючит и не только.
Результат работы cout: 1234.57*x^31e+045*x^2+1.12345*x-2.334e-006.
Более того, при задании такого страшного
полинома не работает правильно почти
всё(смотри вторую часть кода).
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
ITLab, ВМК, ННГУ
Мини-Проект ARAGELI
4
5
6
Сиднев А. А.
/16.02.2006
Сиднев А. А.
/16.02.2006
Сиднев А. А.
/16.02.2006
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
Тест или код,
вызывающий
ошибку
Сиднев А. А.
/02.02.2006
Сиднев А. А.
/02.02.2006
% не применим к типу double.
Метод is_unit() для vector определён не совсем
корректно. Я считал, что единичный вектор вектор длины 1.
Arageli::vector<int> a(1);
a[0]=1245;
Неушто опреатор = не перегружен? При
копировании происходит
b.store.refcntr_m=a.store.refcntr_m. А refcntr_m указатель.
Проблемы скорее всего в копировании store.
Комментарии
разработчика
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
8
Ошибка компиляции.
Arageli::vector<int> b=a;
b.bitwise_not();
a[0]=-1246. ???
Описание
ошибки
Причина
ошибки
7
sparse_polynom<double> a,b;
a%b;
Тест или код,
вызывающий
ошибку
rational<int> a;
rational<int> b=a.opposite();
Результат: a=b. Наверно, это не совсем
правильно ( я ожидал другого результата). Так
ifloor и iceil возвращяют по значению - всё
нормально.
Аналогично для inverse.
Как вы, наверное, уже успели заметить,
подобные функции-члены всегда модифицируют
объект и возвращают ссылку на себя.
И opposite подчиняется этому правилу. А ifloor и
iceil --- свободные функции.
rational<int> a(3,4);
double b=2.6;
if(a!=b)
ITLab, ВМК, ННГУ
Мини-Проект ARAGELI
9
Сиднев А. А.
/02.02.2006
10 Сиднев А. А.
/02.02.2006
11 Сиднев А. А.
/02.02.2006
12 Сиднев А. А.
/14.02.2006
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
{
...
}
Ошибка компиляции в функции
euclidean(gcd.cpp).
% не применим к типу
double.
Да, проблема.
rational<int> a(4,44);
rational<big_int> b(11,8);
a*b;
ошибка компиляции(что-то с функцией gcd).
Исправлено.
template <typename T>
inline bool is_coprime
(const rational<T>& a, const rational<T>& b)
{ return true; }
А что делает этот метод.
Отвечу позже, там должно быть false.
rational<int> b(3,4);
char c=(char)b;
Ошибка компиляции (не может привести к char).
1)
Arageli::vector<rational<int> > a(3), b(3); //
a=(64859, 52580, 48493), b=(52598, 64895, 19848)
(a/b)*b!=a ;
2)
Arageli::vector<rational<int> > a(3), b(3);//
a=(64859, 52580, 48493), b=(52598, 64895, 19848)
(b*a)/b!=a ;
1-ый: работает нормально и правильно.
2-ой: ошибка времени исполнения. Exception(не
Arageli'ий).
Причина: падение на операторе !=. В
методе(rational.cpp):
ITLab, ВМК, ННГУ
Мини-Проект ARAGELI
template <typename T>
void rational<T>::normalize ()
{
T d = gcd(p, q);
p /= d;
q /= d;
if(is_negative(q))
{
Arageli::opposite(&p);
Arageli::opposite(&q);
}
}
Exception генерируется на строке p /= d; , где p,d
- int (p=-2147483648, d=-1).
Exception генерируется на команде idiv. Эта
команда выполняет целочисленное деление. В
мануале Intel'а сказано, что исключение может
сгенирироваться если делитель = 0 или результат
не помещается в регистр.
2-ой случай - как раз наш. Минимальное
знаковое число, которое можно положить в 4
байта - (-2147483648), а максимальное
положительное - (2147483647). Ошибка
очевидна.
Ещё пример:
int a=-2147483648;
int b=-1;
a/=b;
Комментарии
разработчика
Если пример скомпилировать как Release, то
результатом будет нескольео неожиданным a=2147483648. Причина - глюк
компилятора(компилятор считает себя шибко
умных, очивидно он ошибается, или те кто его
писал:).
Могу сразу ответить на фразу «Причина - глюк
компилятора». Это не совсем верно. Ситуация,
которая происходит в этом примере относится к
разряду неопределённых ситуаций. Вот что
написано в стандарте C++ (стр. 63, п. 5):
In during the evaluation of an expression, the result
is not mathematically defined or not in the range of
representable values for its type, the behavior is
undefined, unless such an expression is a constant
expression (5.19), in which case the program is illformad.
Поэтому вы могли получить любой результат,
ITLab, ВМК, ННГУ
Мини-Проект ARAGELI
вплоть до переформатирования жёсткого диска.
13 Сиднев А. А.
/14.02.2006
14 Сиднев А. А.
/14.02.2006
15 Сиднев А. А.
/14.02.2006
16 Сиднев А. А.
/14.02.2006
17 Сиднев А. А.
/14.02.2006
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
Arageli::vector<int>(0);
Ошибка компиляции.
Arageli::vector<rational<int> > a;
rational<int> b;
( (b-a)+a)!=b;
Ошибка компиляции. Оператор != не применим.
Arageli::vector<int> a;
int b;
( (b-a)+a)!=b;
Работает (даже правильно!!!). А нужно ли, чтобы
этот код компилировался? Если да, то смотри 14.
Arageli::vector<double> vd(vsize);
Arageli::vector<double> b=a;
b.inverse();
Arageli::vector<double> c=a*b;
Работает неправильно.
rational<int> a;
rational<big_int> b;
b+a!=a+b;
Ошибка времени исполнения. Ошибка в
операторе !=.
ITLab, ВМК, ННГУ
Мини-Проект ARAGELI
18 Сиднев А. А.
/14.02.2006
19 Сиднев А. А.
/21.11.2005
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
20 Зайцев М.С.
/10.12.2005
21 Зайцев М.С.
/20.01.2006
22 Зайцев М.С.
/16.02.2006
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
Тест или код,
вызывающий
ошибку
Описание
ошибки
Arageli::vector<rational<int> > a, b=a;
b.inverse();
Результат: b=a. Наверно такого не должно быть.
sparse_polynom<rational<> > mono("x"), rez;
rational<> per("2/5");
rez=mono - per;
std::cout<< rez << " = " << mono << "-" << per <<
'\n';
Результат: x+2/5 = x-2/5.
При вычитании из полинома монома со
степенью, которой не было в данном полиноме,
или константы из полинома без свободного
члена, вы получите не верный результат, если
вычитаемое не равно 0. Временное решение:
приводите вычитаемое к типу полинома и
вычитайте два полинома.
matrix<int> A=”((1,2),(2,5))”;
A.inverse();
Ошибка компиляции:
function must return а value
matrix<int> A=”((7,7),(7,7))”;
int detA=det_int(A);
detA получается равным 7
matrix<int> A=”((1,2,3),(4,5,6))”;
A.copy_col(1);
Ошибка компиляции.
ITLab, ВМК, ННГУ
Мини-Проект ARAGELI
23 Зайцев М.С.
/28.01.2006
24 Зайцев М.С.
/30.11.2005
25 Зайцев М.С.
/30.11.2005
26 Камаев А. М.
/20.12.2005
Причина
ошибки
Комментарии
разработчика
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
27 Камаев А. М.
/20.12.2005
Тест или код,
вызывающий
ошибку
Описание
ошибки
Тест t_matrix_add_scalar.cpp
Ошибка, выявленная тестом
Ошибка в реализации оператора !=
matrix<int> A("((1,2),(3,4))");
A.each_inverse();
A =
|| 1 2 ||
|| 3 4 ||
matrix<rational<int> >
A("((1,2),(3,4))");
A.each_inverse();
Ошибка компиляции
Отсутствует преобразование rational<> to float.
Да, было только преобразование в double.
Сейчас добавлены преобразования в float и
double, хотя должно быть одно общее
решение. В любом случае реализованное
решение ограничено (см. реализацию).
Ошибка в конструкторе монома (он не
компилируется): monom<F, I>::monom (const
char* s);
ITLab, ВМК, ННГУ
Мини-Проект ARAGELI
28 Камаев А. М.
/20.12.2005
Причина
ошибки
Комментарии
разработчика
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
29 Камаев А. М.
/20.12.2005
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
30 Камаев А. М.
/20.12.2005
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
31 Камаев А. М.
/20.12.2005
Тест или код,
вызывающий
ошибку
Описание
ошибки
Исправлено.
sparse_polynom<double> D = "1.12345*x^31e45*x^2+1234.5678*x-0.000002334";
sparse_polynom<big_int> BD = D;
cout << BD << endl << endl;
Глючит вывод
Исправлено (две ошибки: одна в
конструкторе, присваивании для
sparse_polynom и вторая в normalize).
typedef sparse_polynom<big_int> poly;
poly S = "213*x^3443+532*x^4432-744*x^444235*x^15+292*x-34254";
poly::coef_const_iterator ci =
S.coefs_begin();//error
poly::degree_const_iterator di =
S.degrees_begin();
Не компилируется
Исправлено (теперь итераторы образованные
из адаптеров итераторов могут _правильно_
преобразовываться друг в друга).
во всех функциях есть “s”, а в названиях
итераторов его нет:
coef_iterator & coefs_begin for example
it is source of errors
В функциях мы имеем дело с
последовательностью коэффициентов, которую
коротко называем coefs, и берём первый
элемент. Итератор же обладает тем
свойством, что это итератор на коэффициент
и имя ему coef_iterator. Конечно, если
приводить к одному, то нужно убрать s.
Пока это осталось как было.
monom_iterator insert (monom_iterator pos, const
Arageli::monom<F1, I1>& x)
ITLab, ВМК, ННГУ
Мини-Проект ARAGELI
32 Камаев А. М.
/20.12.2005
33 Камаев А. М.
/20.12.2005
34 Камаев А. М.
/20.12.2005
Причина
ошибки
Комментарии
разработчика
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
35 Камаев А. М.
/20.12.2005
36 Камаев А. М.
/20.12.2005
соответственно error: function mast return value
Исправлено: теперь возвращается значение.
Не компилируется метод
sparse_polynom<F>::is_x()
Исправлено.
sparse_polynom<rational<> > S =
"2/55*x^255+567";
cout << "S(0) = " << S.subs(0) << endl; // output:
S(0) = 1
cout << “S(0) = “ << S.subs(rational<>(0)) << endl;
// output: S(0) = 567
subs работает немного криво, если тип не
совпадает
Сделана временная заплатка.
rational<> *y;
rational<> tmpDenom;
sparse_polynom<rational<> > poly,
tmpPolyNumer(1);
poly += (y[j]/tmpDenom) * tmpPolyNumer;
Не компилируется
Опечатка в одном из макросов, генерирующих
специфичное определение оператора
умножения для полиномов. Исправлено.
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
sparse_polynom<rational<> > S = "x";
sparse_polynom<rational<> > T = S * rational<>(0);
Тест или код,
вызывающий
ошибку
выводим vector<rational<> > в файл
Срабатывает выход по ассерту
Ошибка в операторах для sparse_polynom.
Исправлено.
ITLab, ВМК, ННГУ
Мини-Проект ARAGELI
Описание
ошибки
d:\data\ARG\Arageli2.1.8\src\arageli\vector.hpp(687): error C2678:
binary '<<' : no operator found which takes a lefthand operand of type 'const std::ofstream' (or there is
no acceptable conversion)
Причина
ошибки
Комментарии
разработчика
37 Камаев А. М.
/22.12.2005
Тест или код,
вызывающий
ошибку
Причина
ошибки
Комментарии
разработчика
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
39 Камаев А. М.
/22.12.2005
sparse_polynom<rational<> > P,Q,U,V,
pq;
pq =
euclidean_bezout(P,Q,U,V);//error
//d:\data\ARG\Arageli2.1.8\src\arageli\powerest.hpp(83): error
C2675: unary '--' :
'Arageli::sparse_polynom<F>' does not
define this operator or a conversion to a
type acceptable to the predefined operator
with
[
F=Arageli::rational<>
]
Описание
ошибки
38 Камаев А. М.
/22.12.2005
Конфликт "идей". Сделана временная
заплатка.
Тест или код,
вызывающий
ошибку
Описание
ошибки
Исправлено.
sparse_polynom<rational<> > P;
cout << inverse(P) endl;
//d:\data\ARG\Arageli2.1.8\src\arageli\rational.cpp(249): error
C2660: 'Arageli::rational<>::is_null' :
function does not take 1 arguments
//d:\data\ARG\Arageli2.1.8\src\arageli\rational.cpp(254): error
C2660: 'Arageli::rational<>::opposite' :
function does not take 1 arguments
Исправлено, но для sparse_polynom вызов
inverse бессмысленен.
sparse_polynom<int> S = "2*x^2+5*x-7";
output_aligned(cout,S);//error
//d:\data\ARG\Arageli2.1.8\src\arageli\sparse_polynom.hpp(1757)
: error C2065:
'monom_aligned_output_pow_default' :
undeclared identifier
//d:\data\ARG\Arageli2.1.8\src\arageli\sparse_polynom.hpp(1756)
: error C2065:
ITLab, ВМК, ННГУ
Мини-Проект ARAGELI
'monom_aligned_output_mul_default' :
undeclared identifier
//d:\data\ARG\Arageli2.1.8\src\arageli\sparse_polynom.hpp(1755)
: error C2065:
'monom_aligned_output_var_default' :
undeclared identifier
Причина
ошибки
Комментарии
разработчика
40 Камаев А. М.
/22.12.2005
Тест или код,
вызывающий
ошибку
sparse_polynom<matrix<int> > M =
"(((1,2),(3,4))*x^55-((1,2),(4,5))*x+((5,1),(4,0)))";
cout << "Polynom with matrix<int>
coefficients M = "<< M << endl << endl;
Описание
ошибки
Замечание: так сколько скобочек мы ставим?
Лучше бы поровну.
На выводе:
Polynom with matrix<int> coefficients M =
((1, 2), (3, 4))*x^55+((-1, -2), (-4, 5))*x+((5, -1), (4, 0))
Причина
ошибки
Комментарии
разработчика
41 Камаев А. М.
/22.12.2005
42 Камаев А. М.
/22.12.2005
Вообще-то функция output_aligned для
полиномов пока не реализована нормально
(сейчас это просто перевызов output_var).
Но, всё же, проблема с компиляцией
ликвидирована.
Тест или код,
вызывающий
ошибку
Описание
ошибки
Неприятно, конечно. Для обратимого
ввода/вывода пользуйтесь
intput_list/output_list. Вообще, мы не
рассматриваем подробно в рамках данного
проекта в ITLab систему ввода/вывода.
Не компилируется функция
template <typename T, bool REFCNT>
inline matrix<T, REFCNT> rand(const
matrix<T, REFCNT>)
Причина
ошибки
надо исправить rows() и cols() на nrows()
и ncols().
Да и скобки [] там как-то не к месту.
Комментарии
разработчика
Файлом rand.hpp решено пока не
пользоваться.
Тест или код,
вызывающий
ошибку
//выводилась такая штука:
Описание
ошибки
d:\data\ARG\Arageli2.1.8\src\arageli\matrix.hpp(1035) : error C2678:
binary '<<' : no operator found which takes a lefthand operand of type 'const std::ofstream' (or there
is no acceptable conversion)
matrix<rational<> >
//а такое спокойно выводится:
monom<matrix<rational<> > >
ITLab, ВМК, ННГУ
Мини-Проект ARAGELI
43 Камаев А. М.
/22.12.2005
Причина
ошибки
Комментарии
разработчика
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
44 Камаев А. М.
/22.12.2005
45 Камаев А. М.
/22.12.2005
46 Камаев А. М.
/29.01.2006
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
Тест или код,
вызывающий
ошибку
Описание
ошибки
Причина
ошибки
Комментарии
разработчика
Тест или код,
вызывающий
ошибку
Описание
ошибки
Исправлено (подобное уже было для vector).
Ложное срабатывание ассертов(без них все
работает корректно)
Prime.cpp
template <typename T1, typename T2, bool
REFCNT2, typename T_factory>
vector<T2, REFCNT2>& factorize_division
//. . . .
ARAGELI_ASSERT_0(x >= d);
//. . . .
ARAGELI_ASSERT_1(x >= d);
//. . . .
ARAGELI_ASSERT_1(is_prime(x, tfctr));
factorize_division требует положительный
первый аргумент. Добавил ASSERT. И:
factorize_division(1) = (),
factorize_division(2) = (2),
factorize_division(12) = (2, 2, 3) и т.п.
template <typename T, bool REFCNT>
bool vector<T, REFCNT>::is_null () const
НЕ КОМПИЛИРУЕТСЯ
разрешения области видимости
Исправлено.
cout << monom<int>("123*x^89") +
monom<double>(1.234567,55) << endl;
output: 124*x^89
По прежнему при вычитании константы из
полинома, она к нему
> прибавляется
Причина
ошибки
ITLab, ВМК, ННГУ
Мини-Проект ARAGELI
Комментарии
разработчика
Исправлено.
ITLab, ВМК, ННГУ
Download