IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Freemem
сообщение
Сообщение #1


Гость






Ошибка у меня возникает при вызове этой процедуры...
Либо указатель пустой или число освобождамых байтов выходит за границы кучи ???
вот код:

procedure Push(E:ElementType;var S:Stack);
var
P:pStackElem;
begin
P:=new(pStackElem);
GetMem(P^.Elem,SizeOf(ElementType));
Move(E,P^.Elem,SizeOf(ElementType));
P^.Next:=S.Top;
S.Top:=P;
S.Size:=S.Size+Sizeof(ElementType)+SizeOf(pStackElem)*2+SizeOf(Pointer);
end;

procedure Pop(S:Stack;var E:ElementType);
var top:pStackElem;
begin
if S.Top<>nil then
begin
Move(S.Top^.Elem,E,SizeOf(ElementType));
top:=S.Top^.Next;
FreeMem(S.Top^.Elem,SizeOf(ElementType));{Вот здесь и возникает ОШИБКА!!!}
dispose(S.Top);
S.Top:=top;
S.Size:=S.Size-Sizeof(ElementType)-SizeOf(pStackElem)*2-SizeOf(Pointer);
end
end;

 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






дополнение:
pStackElem = ^StackElem;
pElement = ^Element;
StackElem = record
Elem:Pointer;
Next:pStackElem;
end;

Stack = record
Top: pStackElem;
Size: Integer;
end;

Element = record
data:byte;
end;
ElementType = Element;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Вроде бы все так делаю:
сколько выделил места в памяти под указатель - столько и освобождаю:

...
GetMem(P^.Elem,SizeOf(ElementType));
...


...
FreeMem(S.Top^.Elem,SizeOf(ElementType));
...


 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Ты в операторе Move используешь указатель вместо самой величины. Этим самым ты портишь пойнтер.
procedure Push(E:Element;var S:Stack);
var
P:pStackElem;
begin
P:=new(pStackElem);
GetMem(P^.Elem,SizeOf(Element));
Move(E,P^.Elem^,SizeOf(Element)); {было Move(E,P^.Elem,SizeOf(ElementType));}
P^.Next:=S.Top;
S.Top:=P;
S.Size:=S.Size+Sizeof(Element)+SizeOf(pStackElem)*2+SizeOf(Pointer);
end;

procedure Pop(S:Stack;var E:Element);
var
top:pStackElem;
begin
if S.Top<>nil then begin
Move(S.Top^.Elem^,E,SizeOf(Element)); {было Move(S.Top^.Elem,E,SizeOf(Element));}
top:=S.Top^.Next;
FreeMem(S.Top^.Elem,SizeOf(Element));{Вот здесь и возникает ОШИБКА!!!}
dispose(S.Top);
S.Top:=top;
S.Size:=S.Size-Sizeof(Element)-SizeOf(pStackElem)*2-SizeOf(Pointer);
end
end;


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5





Группа: Пользователи
Сообщений: 6
Пол: Мужской

Репутация: -  0  +


Цитата(lapp @ 30.11.2006 14:56) *

Ты в операторе Move используешь указатель вместо самой величины. Этим самым ты портишь пойнтер.

ужас! какая глупая ошибка моя ... wacko.gif невнимательность (((
не таким образом я "разжевал" параметры процедуры Move )))
большое спасибо вам, lapp!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(int64 @ 30.11.2006 16:27) *

ужас! какая глупая ошибка моя ... wacko.gif невнимательность (((

smile.gif бывает..
Хочешь совет? Если совсем ничего не получается долгое время, то начинай убирать из программы все "несущественное". Либо на некотором этапе ошибка пропадет (как сейчас), либо ты упростишь себе задачу, освободившись от шелухи.
Успехов!


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






А ошибка по-прежнему возникает... smile.gif

Переезжаем в Задачи...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8





Группа: Пользователи
Сообщений: 6
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 30.11.2006 15:41) *

А ошибка по-прежнему возникает... smile.gif

Переезжаем в Задачи...

угу возникает - уже пофиксил wink.gif
а именно это исправил:
Код
procedure Pop(S:Stack;var E:Element);


на

Код
procedure Pop(var S:Stack;var E:Element);


TO lapp: да действительно не впервые.... хотя некоторые участки кода я убирал (комментировал) все равно не решало проблему... Все зависит от того насколько грубо мы ошиблись )
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9





Группа: Пользователи
Сообщений: 6
Пол: Мужской

Репутация: -  0  +


еще один вопрос касаемый реализации стека...
Размер одного элемента стека.
Я таким образом его задал -
Код
sizeOne=Sizeof(Element)+SizeOf(pStackElem)*2+SizeOf(Pointer);


исходя из определенных типов данных
Код
StackElem = record   {Элемент стека}
              Elem:Pointer;       {указатель на данные}
              Next:pStackElem;
              end;
    Stack = record
          Top: pStackElem;
          Size: Integer;
          end;
    Element = record
            .....
            end;


я правильно рассудил?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


А почему нельзя просто
sizeOne=Sizeof(StackElem)

?


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Цитата
А почему нельзя просто
Потому что это будет "неправильный мед" (С) Винни-Пух... Стек содержит указатель, который в свою очередь содержит адрес выделенной памяти, а насколько я понимаю автора, ему нужен именно размер области памяти, занимаемый самой структурой + той областью, где хранятся данные; то есть, насколько уменьшилось количество доступной памяти в куче при размещении в стеке очередного элемента...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12





Группа: Пользователи
Сообщений: 6
Пол: Мужской

Репутация: -  0  +


volvo верно рассудил good.gif

но ведь мне не очень то понятно что именно является "размером стека" - не путать с количеством элементов в стеке... Размер которые занимают данные? или размер всего структуры организации стека?
ну я выбрал последнее... правда на самом деле в из кучи при создании очередного элемента (путем new и GetMem) берется больше байтов чем в sizeOne..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


Цитата
правда на самом деле в из кучи при создании очередного элемента (путем new и GetMem) берется больше байтов чем в sizeOne.

Это ты о чем?


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Гость






Цитата
Это ты о чем?
О том, что GetMem/New выделяют память блоками с размером кратным 8... yes2.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


Цитата
правда на самом деле в из кучи при создании очередного элемента (путем new и GetMem) берется больше байтов чем в sizeOne.

Это мы знали. smile.gif
Цитата
берется больше байтов чем в sizeOne..

Ну тогда, если это и имелось ввиду, то правильней будет - больше или ровно...


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 31.10.2020 15:27
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name