Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
MornieOhtar
1

Выделение памяти (CodeGear RAD Studio 2009 - C++ builder). Выделение памяти - консоль vs SDIApp

03.07.2010, 23:42. Просмотров 1897. Ответов 1
Метки нет (Все метки)

Есть определенный класс - длинная арифметика. Не идеальный - хранение данных исполнено в виде динамического массива типа short int, каждая переменная - десятичный разряд.
При использовании массива везде используется value=new short int [lenght];
Аналогично строки (ессно чаровые).
На основе данного класса создан класс длинного действительного - полный набор функций, переделано чтение из/в строку, для всех прочих операций идет изменение "мантиссы" для подгонки характеристики (храниться как позиция десятичной точки) и вызов операторов длинного целого.
Создан класс функции - на данный момент чтение из строки и вычисление. Данные хранятся в виде линейного списка переменных структуры:

C++
1
2
3
4
5
struct elem{
    Lreal number;
    Lfunc arg;
    char * function;
    elem * next;}
Проблема следующая:

Данные классы были откомпилированы следующим образом:
Lariphm.dll - классы длинного целого и длинного действительного
Lmath.dll - набор функций мат библиотеки с аргументами типа длинной арифметики (целых/действительных) и класс функций.

Основное тестирование и отладка проводились в виде Console Application, после успешного вычисления всех базовых ф-й (e.g. "cos(x(1))", "sin(3.1415926525)",...) и "exp(x(1))*2-x(7)^2" стал создавать SDI Application с использованием этих библиотек - вычисление ф-й с возможностью рисования графиков ф-й от одной переменной.

И тут возникла проблема - либо error in "Lariphm.dll", или в rtl.dll или переменные перекрывали данные, созданные даже при запуске - например вместо текста в ShowMessage(), где строка строго константная - точнее "К сожалению на данный момент возможно рисование графиков ф-й только от одной переменной" - выводился набор чисел (похоже на кусок временных результатов вычислений). К этой же мысли привело и то, что перед любыми вычислениями все ОК и первое вычисление проходит вполне успешно.

Кто подскажет в чем проблема? Повторюсь, new использовалось ВЕЗДЕ, где идет работа с указателями.
Освобождение массивов проходит стандартными средствами, без delete, поскольку если их использовать (в деструкторе класса, хоть бы и длинного целого), то возвращаемые данные бессовестно искажались - вместо них шел мусор. Да и необходимости в них нету, если освобождение проходит автоматически (в противном случае, как показал эксперимент, даже при вычислении длинной арифметикой в ДВОИЧНОМ виде на 2500! (факториал) с учетом временных данных уходило 450 мб памяти).

порядок выделения памяти:
В элементе класса есть unsigned int lenght;

C++
1
value=new short int[lenght]; //проверено, везде в этой переменной сначала занесена длинна - это проводиться всего в конструкторах (войдовом,из инта) и присвоении (из строки и из другого элемента класса).
Все счетчики вида
C++
1
for (unsigned int i; i<lenght;i++)
Проверял это в первую очередь после проверки, или везде на месте стоит new;

Строки аналогично:
C++
1
2
char * res;
res=new char[lenght+2];
лишние 2 символа - это знак и запятая, если они есть. Если нету - действительно лишние, но это не столь критично.
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.07.2010, 23:42
Ответы с готовыми решениями:

Возникла проблема при установке компонента Shockwave Flash на CodeGear RAD Studio 2009 Builder C++
у меня возникла проблема при установке компонента Shockwave Flash на CodeGear RAD Studio 2009...

не устанавливается CodeGear RAD Studio 2009 на Windows 7
Раньше на XP все хорошо работало, потом перешел на Семерку, и не получается установить. Как я...

Graphics32 на CodeGear RAD Studio C++ Buider 2009
Здравствуйте! кто сталкивался с проблемой установки Graphics32 на CodeGear RAD Studio ?...

Выделение памяти и вывод её содержимого на печать в консоль
Здравствуйте, форумчане. Не подскажите, как в С++ выделить 1 кБайт памяти одним куском и вывести...

1
Эксперт С++
475 / 443 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
07.07.2010, 21:37 2
Цитата Сообщение от MornieOhtar Посмотреть сообщение
new использовалось ВЕЗДЕ, где идет работа с указателями.
Освобождение массивов проходит стандартными средствами, без delete
Память, выделенная с помощью оператора new, должна развыделяться ТОЛЬКО оператором delete.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.07.2010, 21:37

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

C++ Builder 6 и CodeGear RAD Studio
Добрый день! Хочу написать БД в системе CodeGear RAD Studio, но только не нахожу привычных средств...

CodeGear RAD Studio 2009: как сделать, чтобы проект открывал файлы из текущей папки?
Ситуация: на работе сделал проект, сохранил, закрыл, забрал папку домой. За выходные что-то...

Какой компилятор C++ Builder использовать? Rad Studio 2009 глючит. C++ Builder 6 старый
Много раз замечал непонятки с компилятором. Масла в огонь подлил Какой посоветуете?

CodeGear™ RAD Studio 2009 глючит, компилирует "призраков"
У меня CodeGear™ RAD Studio 2009 Version 12.0.3170., 99% времени он работает нормально и меня все...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.