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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.03.2012, 17:29   #1
alexdelphi
Пользователь
 
Регистрация: 24.08.2011
Сообщений: 40
Вопрос Нетривиальный глюк компилятора Delphi 7

Код:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

const
  space: string = '';
type

  TStr = object
  private
    s: string;
  public
    constructor Init(const str: string);
    function IsPresent(const str: string): boolean;
    procedure DelSym;
    procedure ConsolePrint;
  end;

  PList = ^TList;
  PStr = ^TStr;

  FnModifyList = procedure of object;

  TList = object
  private
    el: PStr;
    next, prev: PList;
    procedure Generalize(func: FnModifyList);
    procedure ModifyObj(func: FnModifyList);
  public
    constructor Init(x: string);
    destructor Done;

    procedure Insert(x: string);
    procedure Delete;

    procedure DeleteABC;
    procedure DeleteSymbols;
    procedure Print;
  end;

procedure NextDir(var res: PList; ptr: PList; x: integer);
begin
  if x < 0 then
    res := ptr^.prev
  else if x = 0 then
    res := ptr
  else
    res := ptr^.next;
end;

constructor TStr.Init;
begin
  s := copy(str, 1, length(str));
end;

function TStr.IsPresent(const str: string): boolean;
begin
  result := (pos(str, s) <= length(s));
end;

procedure TStr.DelSym;
var
  i: integer;
begin
  i := 1;
  while i <= length(s) do
  begin
    if (s[i] >= '0') and (s[i] <= '9') then
      delete(s, i, 1)
    else
      i := i + 1;
  end;
end;

procedure TStr.ConsolePrint;
begin
  write(s, ' ');
end;

procedure TList.ModifyObj;
begin
  func();
end;

procedure TList.Generalize;
var
  p, q: PList;
begin
  NextDir(p, @Self, -1);
  repeat
    p.ModifyObj(func);
    NextDir(p, @Self, -1);
  until p = nil;
  NextDir(q, @Self, 1);
  repeat
    q.ModifyObj(func);
    NextDir(q, @Self, 1);
  until q = nil;
  Self.ModifyObj(func);
end;

constructor TList.Init;
var
  q: PList;
begin
  New(q);
  Self := q^;
  New(el, Init(x));
  next := nil;
  prev := nil;
end;

destructor TList.Done;
begin
  Generalize(Delete);
end;

procedure TList.Insert;
var
  q: PList;
begin
  New(q);
  if next = nil then
  begin
    next := q;
    q^.next := nil
  end
  else
  begin
    next := q;
    q^.next := next;
    next^.prev := q;
  end;
  q^.prev := @Self;
  Self := q^;
end;

procedure TList.Delete;
var
  q: PList;
begin
  q := @Self;
  if (next <> nil) and (prev <> nil) then
  begin
    prev^.next := next;
    next^.prev := prev;
    Self := Self.next^;
  end
  else if prev <> nil then
    Self := Self.prev^
  else if next <> nil then
    Self := Self.next^;
  dispose(q);
end;

procedure TList.DeleteABC;
begin
  if not el^.IsPresent('abc') then
    Self.Delete;
end;

procedure TList.Print;
begin
  Generalize(el^.ConsolePrint);
end;

procedure TList.DeleteSymbols;
begin
  Generalize(el^.DelSym);
end;

var
  i: integer;
  l: PList;
begin
  New(l, Init('1'));
  for i := 2 to 10 do
    l^.Insert(IntToStr(i));
  l^.Print;
  readln
end.
Компилятор генерирует этот код (в функции @LStrFromPCharLen во вложении):

И после такого извращения выдает EExternalException C000001D: "недопустимая инструкция". При продолжении программы префикс lock пропадает и работает все отлично.
P.S: мне кажется, это связано с неверным анализом кода по адресу 00403С9B. При прокручивании кода вверх адрес инструкции становится равным 00403C9C, а префикс lock пропадает.

В чем дело и как избавиться от EExternalException?
Изображения
Тип файла: jpg Безымянный.jpg (35.0 Кб, 119 просмотров)

Последний раз редактировалось alexdelphi; 12.03.2012 в 18:02.
alexdelphi вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужен нетривиальный виджет QT FYBVFPFYBC Qt и кроссплатформенное программирование С/С++ 5 06.02.2012 23:48
Глюк компилятора или ошибка в задаче? i.pas C++ Builder 6 29.08.2010 18:49
Глюк delphi? Сергей089 Общие вопросы Delphi 4 23.07.2010 12:57
Установки для компилятора Delphi Terran Общие вопросы Delphi 2 11.08.2009 13:45
Глюк компилятора(turbo pascal)? xinch Свободное общение 3 05.10.2008 00:55