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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2010, 12:37   #1
seagull
Новичок
Джуниор
 
Регистрация: 29.05.2010
Сообщений: 2
По умолчанию Ошибка «Incompatible Type», которой, вроде бы, не должно быть.

Добрый день всем.

Имеется вот такой тестовый код для работы с динамической очередью:
Код:
type
  item_ = ^item;
  item = record
    next, prev: item_;
    data: integer;
  end;

  queue = record
    head, tail: ^item;
    qty: integer;
  end;

procedure init(var what: queue);
begin
  with what do begin
    qty := 0;
    head := nil;
    tail := nil;
  end;
end;

procedure push(var where: queue; what: integer);
var
  temp: ^item;
begin
  with where do
    if qty = 0 then begin
      new(head);
      head^.data := what;
      head^.next := nil;
      head^.prev := nil;
      tail := head;
      qty := 1;
    end else begin
      new(tail^.next);
      temp := tail;            {!!!}
      tail := tail^.next;     {!!!}
      tail^.prev := temp;   {!!!}
      tail^.next := nil;
      tail^.data := what;
      inc(qty);
    end;
end;

function pop(var from: queue): integer;
var
  res: integer;
  temp: ^item;
begin
  with from do begin
    res := head^.data;
    temp := head; {!!!}
    head := head^.next; {!!!}
    head^.prev := nil;
    dispose(temp);
    dec(qty);
    pop := res;
  end;
end;

procedure DESTRUCTION(var victim: queue);
var
  cur, tmp: ^item;
begin
  with victim do begin
    cur := head; {!!!}
    while cur <> nil do begin
      tmp := cur^.next; {!!!}
      dispose(cur);
      cur := tmp;
    end;
  end;
end;

procedure dump(what: queue);
var
  cur: ^item;
begin
  with what do begin
    writeln;
    writeln('Queue dump.');
    writeln('Elements quantity: ', qty);
    if qty = 0 then
      exit;
    writeln('Elements (first is popped next):');
    write(head^.data);
    cur := head^.next; {!!!}
    while cur <> nil do begin
      write(' < ', cur^.data);
      cur := cur^.next; {!!!}
    end;
  end;
  writeln;
end;

var
  foo: queue;

begin
  init(foo);
  dump(foo);
  push(foo, 3);
  push(foo, 1);
  push(foo, 4);
  push(foo, 1);
  push(foo, 5);
  dump(foo);
  writeln('Popped: ', pop(foo));
  dump(foo);

  push(foo, 9);
  dump(foo);
  writeln('Popped: ', pop(foo));
  dump(foo);
  readln;
  Destruction(foo);
end.
Дело в том, что во Free Pascal этот код работает безупречно, однако в Delphi выдаётся ошибка компиляции «Incompatible Type» на строках, помеченных комментарием {!!!}.
(причём, ошибка появляется без указания того, что именно не так; скажем, если переменной string попытаться присвоить переменную integer, будет сообщение «Incompatible Type: string and integer»; в данном же случае просто «Incompatible Type» без каких-либо подробностей.

Буду очень благодарен, если кто-то укажет, в чём может быть ошибка и как правильно сделать.
seagull вне форума Ответить с цитированием
Старый 29.05.2010, 13:05   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
type
Pitem=^Titem;
Titem=record
next, prev:PItem;
data: integer;
end;
так было б более по человечески(точнее принято так в Делфи но не суть)

ошибка здесь
Код:
  cur: ^item;
и подобных строках.
у вас есть тип указателя(item_), используйте его, Делфи немного строже чем Фри паскаль.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.05.2010, 13:19   #3
seagull
Новичок
Джуниор
 
Регистрация: 29.05.2010
Сообщений: 2
По умолчанию

Работает. Огромное спасибо!
Я вчера весь вечер убил, пытаясь понять, что же это всё-таки было.
seagull вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
свойствах показывает 1,50 гб (хотя должно быть 2, 00 гб) MORFIK Компьютерное железо 21 15.06.2009 04:31
Ошибка incompatible type conversion Danil21 Общие вопросы C/C++ 5 18.05.2009 04:23
Incompatible type conversion Fox99 Общие вопросы C/C++ 4 14.08.2008 11:45