Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » [deleted]

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

gnu



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
[deleted]

Всего записей: 150 | Зарегистр. 27-10-2003 | Отправлено: 23:03 24-01-2005 | Исправлено: gnu, 00:24 09-02-2006
distance

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gnu
навскидку вижу 3 ошибки
1. ты выделил память через op new[], а удаляешь через free(). нехорошо...
2. в деструкторе используешь op delete а не op delete[]
3. в cl_fcomp у тебя создается локальная копия обьекта, а согласно 6.7.2
Variables with automatic storage duration declared in the block are destroyed on exit from the block.
и при уничтожении обьекта, в деструкторе произойдет освобождение блока памяти к которуму была применена функция free
в итоге - трижды UB

Всего записей: 878 | Зарегистр. 28-03-2004 | Отправлено: 04:01 25-01-2005
gnu



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
distance
Спасибо за предположения, но, проверив их, убедился, что ничего не меняется:
ставил оператор delete[] в деструкторе, а от free() вообще отказался в функции cl_fcomp() (ведь нет смысла в этом, согласно твоей цитате). Получаю сообщение: debug error! на return из cl_fcomp.  Открывается dbgheap и появляется указатель на ту же строчку, что и ранее.
 
изменил cl_fcomp():

Код:
 
BigInt cl_fcomp(BigInt &X)
{
BigInt qX(X), Q(2*X.Size);
BigInt rY(Q.Size), yY(rY.Size);
BigInt Y(Q.Size);
 
// calculate compressed function f(x) = x^2 + 1;
Mul(X, qX, Q);
//Add(Q, X, rY);
//SAdd(rY, 1, yY);
SAdd(Q, 1, yY);

Y = yY;
// free(qX.Coef);
// free(Q.Coef);
// free(rY.Coef);
// free(yY.Coef);
 
return Y;
}

но не помогло!

Всего записей: 150 | Зарегистр. 27-10-2003 | Отправлено: 17:12 25-01-2005
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gnu
можно поинтересоваться почему нужно освобождать память два раза:

Цитата:
free(Q.Coef);  
- раз

Цитата:
BigInt::~BigInt() {  
delete Coef;  
}  
-два
т.е. удаляется и в деструкторе и в программе. Так задумано?

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 18:07 25-01-2005
gnu



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
WiseAlex
пробовал как вариант.

Всего записей: 150 | Зарегистр. 27-10-2003 | Отправлено: 21:27 25-01-2005
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gnu
Напиши минимальную программу с вылетом  и выложи где-нибудь - посмотрим что за бяка

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 22:14 25-01-2005
gnu



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
WiseAlex
Напиши мыло (можно в приват), отправлю! Выкладывать негде.

Всего записей: 150 | Зарегистр. 27-10-2003 | Отправлено: 01:31 26-01-2005
Karlsberg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gnu
Могу предложить перед удалением проверять что указатель не нулевой, а сразу после удаления его обнулять. Когда-то это помогло мне починить чужую прогу.

Всего записей: 1008 | Зарегистр. 13-12-2001 | Отправлено: 10:45 26-01-2005
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gnu

Цитата:
Напиши мыло (можно в приват), отправлю!  

wisealex[at]tut.by  

Цитата:
Выкладывать негде.

можно зарегистрировать мыло на http://www.tut.by они предоставляют 5МБ для личного сайта с доступом ч/з ftp - простое решение проблемы

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 12:55 26-01-2005
RedLord

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gnu
#pragma pack используются?
 
P.S.
это не утечка
 
P.P.S.
 
мемберы объявлены как public  - никто их не можифицирует кроме класса?

Всего записей: 730 | Зарегистр. 05-03-2004 | Отправлено: 17:41 26-01-2005 | Исправлено: RedLord, 17:47 26-01-2005
gnu



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
WiseAlex
Отправил, поймал?
 
RedLord
#pragma pack - нет, не использую.
Нет, кроме класса никто.
 
Karlsberg
хм...
 
Не могу понять... компилирую (cl.exe) и запускаю из консоли - программа вылетает, если же откомпилировать и проверить ее работу через дебагер (MSVC 6.0), то спустя множество ошибок Debug error! (нажимая пропустить), программа работает и не вылетает.
 
Добавлено:
Разрешите еще один вопрос:
 
как создать массив типа BigInt???
 
BigInt S[n]; -- не работает  
 
и возможно ли это в принципе? Очень важно.

Всего записей: 150 | Зарегистр. 27-10-2003 | Отправлено: 22:30 28-01-2005
Karlsberg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gnu

Цитата:
BigInt S[n]; -- не работает

Добавь дефолтный конструктор
 
Добавлено:
И, кстати, можно взглянуть на функции

Цитата:
Mul(X, qX, Q);  
SAdd(Q, 1, yY);

если их не вызывывать, тоже вылетает?

Всего записей: 1008 | Зарегистр. 13-12-2001 | Отправлено: 00:07 29-01-2005
gnu



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Karlsberg
Нет, если их не вызывать - ошибок нет! Debug error отсутствуют.
 
SMul - умножение числа типа BigInt на целое ushort и запись результата в C;
SAdd - то же, только вместо умножения - суммирование.
 

Код:
 
void SMul(const BigInt &A, const ushort B, BigInt &C) {
ulong i, temp;
const ushort *a=A.Coef;
ushort *c=C.Coef, carry=0;
 
for (i=0; i<A.Size;i++) {
temp = a[i]*B + carry;
carry = temp / BASE;
c[i] = temp - carry*BASE;
}
 
if (carry) {
c[i] = carry;
C.Size = A.Size+1;
}  
else C.Size = A.Size;
 
}
 
void SAdd(const BigInt &A, const ulong ss, BigInt &C)
{
const ushort *a=A.Coef;
ushort *c = C.Coef;
ulong temp;
ushort carry = 0;
ulong i;

temp = a[0] + ss;

if(temp>=BASE)
{
c[0] = temp - BASE;
carry = 1;
}
else
{
c[0] = temp;
carry = 0;
}

for(i=1; i<A.Size; i++)
{
temp = a[i] + carry;

if(temp>=BASE)
{
c[i] = temp - BASE;
carry = 1;
}
else
{
c[i] = temp;
carry = 0;
}
}

if(carry)
{
c[i] = carry;
C.Size = i+1;
}
else
C.Size = A.Size;
}
 

Всего записей: 150 | Зарегистр. 27-10-2003 | Отправлено: 03:50 29-01-2005
Karlsberg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gnu
У тебя внутри cl_fcomp вызывается Mul(X, qX, Q) а не SMul(const BigInt &A, const ushort B, BigInt &C). Вроде проблема именно в ней, так как SAdd ничего с Q не делает. Попробуй вызвать только Mul и запости ее код, плиз.

Всего записей: 1008 | Зарегистр. 13-12-2001 | Отправлено: 13:05 29-01-2005
gnu



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ага, вот:

Код:
 
void Mul(const BigInt &A, const BigInt &B, BigInt &C) {
ulong i, j;
const ushort *a=A.Coef, *b=B.Coef;
ushort *c=C.Coef;
ulong temp, carry;
 
for ( i=0; i <= A.Size+B.Size; i++ ) c[i]=0;
 
for ( i = 0; i < A.Size; i++) {
carry = 0;
for (j = 0; j < B.Size; j++) {
temp = a[i] * b[j] + c[i+j] + carry;
carry = temp/BASE;
c[i+j] = temp - carry*BASE;
}
c[i+j] = carry;
}
i = A.Size + B.Size - 1;
if ( c[i] == 0 ) i--;
C.Size = i+1;
}  
 


Всего записей: 150 | Зарегистр. 27-10-2003 | Отправлено: 15:58 29-01-2005
Karlsberg



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gnu
Первое, что бросается в глаза - условие в первом цикле надо исправить с  "i <= A.Size+B.Size" на "i < A.Size+B.Size", так как сейчас он выходит за границу массива и обнуляет один лишний элемент.

Всего записей: 1008 | Зарегистр. 13-12-2001 | Отправлено: 19:49 29-01-2005
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gnu

Цитата:
Отправил, поймал?  

да, сейчас гляну
 
Добавлено:
gnu
ошибка здесь:
void Div(const BigInt &A, BigInt &B, BigInt &Q, BigInt &R) {
BigInt U(A.Size+1);
U = A; //здесть размер опять A.Size
U.Coef[A.Size]=0;//а здесь выход за границу масссива
 
Div(const BigInt &A, BigInt &B, BigInt &Q, BigInt &R) {
for (vJ = m, uJ=n+vJ; vJ>=0; --vJ, --uJ) {//внутри цикла выход за границы где не знаю точно
 
void Mul(const BigInt &A, const BigInt &B, BigInt &C) {
for ( i=0; i <= A.Size+B.Size; i++ ) c[i]=0;//условие не <=, а <
 
короче ошибок много и все связаны с выходом за границу массива

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 12:27 31-01-2005
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » [deleted]


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru