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


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

Группа: Пользователи
Сообщений: 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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





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

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


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

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

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

Сообщений в этой теме
ангел   Freemem   30.11.2006 6:17
Гость   дополнение: pStackElem = ^StackElem; pElement = ^…   30.11.2006 6:39
ангел   Вроде бы все так делаю: сколько выделил места в па…   30.11.2006 17:44
lapp   Ты в операторе Move используешь указатель вместо с…   30.11.2006 18:56
int64   Ты в операторе Move используешь указатель вместо …   30.11.2006 19:27
lapp   ужас! какая глупая ошибка моя ... :wacko: не…   30.11.2006 19:40
volvo   А ошибка по-прежнему возникает... :) Переезжаем в…   30.11.2006 19:41
int64   А ошибка по-прежнему возникает... :) Переезжаем …   30.11.2006 19:44
int64   еще один вопрос касаемый реализации стека... Разме…   30.11.2006 19:55
Bokul   А почему нельзя просто sizeOne=Sizeof(StackElem) …   1.12.2006 9:27
volvo   Потому что это будет "неправильный мед" …   1.12.2006 13:09
int64   volvo верно рассудил :good: но ведь мне не очен…   2.12.2006 5:10
Bokul   Это ты о чем?   2.12.2006 5:15
volvo   О том, что GetMem/New выделяют память блоками с ра…   2.12.2006 5:36
Bokul   Это мы знали. :) Ну тогда, если это и имелос…   2.12.2006 5:41


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

 





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