Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2011, 18:32   #1
barm
 
Регистрация: 17.06.2009
Сообщений: 7
По умолчанию delphi... access violation error

пишу програму на фреймворке дэлфи7. Документацию по стандартным классам я найти не смог так же как и стандартную реализацию структуры стек (FILO). Решил использовать вот эту реализацию http://snippets.dzone.com/posts/show/2198 код:
Код:
unit Stack;

interface

uses
  SysUtils, Classes;

type
  TStack = class
  private
    FList: PPointerList;
    FCapacity, FCount: Cardinal;
    procedure Grow;
  public
    destructor Destroy; override;
    procedure Push( const Data: Pointer );
    function Pop: Pointer;
  end;

implementation

{ TStack }

destructor TStack.Destroy;
begin
  FreeMem( FList );
  inherited;
end;

procedure TStack.Grow;
begin
  if FCapacity > 64 then
    Inc( FCapacity, FCapacity div 4 )
  else
    if FCapacity > 8 then
      Inc( FCapacity, 16 )
    else
      Inc( FCapacity, 4 );
  ReallocMem( FList, FCapacity * SizeOf( Pointer ) );
end;

function TStack.Pop: Pointer;
begin
  if FCount > 0 then
  begin
    Dec( FCount );
    Result := FList^[FCount];
  end
  else
    Result := nil;
end;

procedure TStack.Push(const Data: Pointer);
begin
  if FCapacity = FCount then
    Grow;
  FList^[FCount] := Data;
  Inc( FCount );
end;

end.
При вызове процедуры Push (при обращении к переменным FCapacity и FCount), дебугер выдает ошибку ацес виолэйшн ерор бла-бла.. Т.к. я программирую на скриптовых языках, эти ссылки на память просто разрушают мои мозги, пол дня просидел так и не понял в чем дело... пожалуйста объясните или хотябы предложите решение проблемы
barm вне форума Ответить с цитированием
Старый 13.11.2011, 19:07   #2
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Описание класса - это и есть описание.
Для того чтобы обращаться к методам, свойствам и пр. этого класса при работе программы нужно создать экземпляр этого класса.
Что-то в этом роде:
Код:
var
  S : TStack;
begin
  S := TStack.Create;
  try
    S.Push(D);
  finally
    S.Free; //ясен перец, что уничтожение объекта делается тогда когда надо, а не как здесь в примере.
  end;
end;
Где и как - это уже фантазии разработчика.
Прик вне форума Ответить с цитированием
Старый 13.11.2011, 19:21   #3
barm
 
Регистрация: 17.06.2009
Сообщений: 7
По умолчанию

спасибо большое.. я так и знал что надо делать как-то так но меня настораживало отсутсвие конструктора.... я так понял есть конструктор по умолчанию? странно что компиляция проходит без ошибок
barm вне форума Ответить с цитированием
Старый 13.11.2011, 20:52   #4
barm
 
Регистрация: 17.06.2009
Сообщений: 7
По умолчанию

еще вопрос: как мне использовать указатель который возвращает Pop?
ну допустим я кладу в стек указатель на символ
Код:
var a:Char
begin
a := 'a';
stack.Push(@a);
теперь мне получить символ на который указывает этот указатель и передать его в другую функцию
Код:
func(stack.Pop^);
так нельзя
Код:
var b: pointer;
b := stack.Pop;
func(b^);
так тоже не получается

Последний раз редактировалось mihali4; 14.11.2011 в 17:12.
barm вне форума Ответить с цитированием
Старый 13.11.2011, 20:55   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

типизированные указатели используйте.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.11.2011, 06:01   #6
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Т.к. я программирую на скриптовых языках, эти ссылки на память просто разрушают мои мозги, пол дня просидел так и не понял в чем дело...
О, ты попал.

Как можно использовать стек, который работает с указателями, не представляя себе, как это работает?

Есть два варианта - не работать с указателями или изучать, как они работают.

По второму пункту могу предложить чтение мат-части: http://www.transl-gunsmoker.ru/2009/09/blog-post.html
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с DirectMySQL, Access Violation error! Askar_g БД в Delphi 1 15.06.2011 10:22
Access Violation и I/O error 103 без видимых причин whatever Помощь студентам 2 10.12.2010 08:50
Delphi - непонятный access violation KingOfNothing Помощь студентам 7 03.11.2009 00:46
Access Violation SunKnight Общие вопросы Delphi 2 05.06.2008 16:46
Access Violation Carbon Общие вопросы Delphi 12 18.09.2007 19:55