1 Востаннє редагувалося Torbins (25.04.2016 15:14:51)

Тема: Робота зі стеком у окремому модулі (PascalABC)

Всім добрий вечір. Почали в школі вивчати із паскалю стеки та черги. Щоб на практичній було легше вирішив вдома створити модуль.

unit stek_cher;

interface

type
  PStack = ^Stack;
  Stack = record
    data: integer;
    next: PStack;
  end;
  PQueue = ^Queue;
  Queue = record
    data: integer;
    next: PQueue;
  end;
  TQueue = record
    head: PQueue;
    tail: PQueue;
  end;

var
  a: PStack;
  i, el: integer;
  q: PQueue;

procedure CreateStack(var s: PStack);
function pop(var s: PStack; var elem: integer): boolean;
function push(var s: PStack; elem: integer): boolean;
procedure chutanna_bez_vydalanna(s: PStack);
procedure CreateQueue(var q: TQueue);
function add(var q: TQueue; elem: integer): boolean;
function del(var q: TQueue; var elem: integer): boolean;
implementation

procedure CreateStack(var s: PStack);
begin
  s := nil;
end;

function pop(var s: PStack; var elem: integer): boolean;
var
  temp: PStack;
begin
  if s = nil then pop := false else
  begin
    pop := tru;
    elem := s^.data;
    temp := s;s := s^.next;
    dispose(temp);
  end;
end;

function push(var s: PStack; elem: integer): boolean;
var
  temp: PStack;
begin
  new(temp);
  temp^.data := elem;
  temp^.next := s;
  s := temp;
  push := true;
end;

procedure chutanna_bez_vydalanna;
begin
  while s^.data mod 2 = 1 do
  begin
    write(s^.data, ' ');
    s := s^.next;
  end;
end;

procedure CreateQueue(var q: TQueue);
begin
  q.head := nil;
  q.tail := nil;
end;

function add(var q: TQueue; elem: integer): boolean;
var
  temp: PQueue;
begin
  new(temp);
  temp^.data := elem;
  temp^.next := nil;
  if q.head = nil then q.head := temp else q.tail := temp;
  add := true;
end;

function del(var q: TQueue; var elem: integer): boolean;
var
  temp: PQueue;
begin
  if(q.head = nil) and (q.tail = nil) then del := false else
  begin
    elem := q.head^.data;
    temp := q.head;
    q.head := q.head^.next;
    dispose(temp);
    if q.head = nil then q.tail := nil;
    del := true;
  end;
end;
end.

Начебто все добре, проте при компіляції видає, що у 6-ій лінійці очікувався тип, себто
PStack = ^Stack; і
PQueue = ^Queue;
воно не розуміє. Підкажіть, будь ласка, що робити.

2 Востаннє редагувалося ADR (23.04.2016 21:32:07)

Re: Робота зі стеком у окремому модулі (PascalABC)

Ви використовуєте тип перед його оголошенням.
Використайте попереднє оголошення типів. Здається так:

  
  Stack = record;
  PStack = ^Stack;
  Stack = record
    data: integer;
    next: PStack;
  end;

П. С.:
Бажано копіювати повідомлення про помилку сюди.
Також за стилістикою Borland всі типи мають починатись із букви "T" ("TObject"), а змінні починатись із великої букви.

Бачу, ви стараєтесь дотримуватись стилістики. Вас цьому вчать на уроках, чи це ваша ініціатива?

Подякували: koala, letitbe, leofun013

3

Re: Робота зі стеком у окремому модулі (PascalABC)

letitbe, я додав вам теги code. Наступного разу робіть це самостійно.

Подякували: letitbe1

4

Re: Робота зі стеком у окремому модулі (PascalABC)

Нас цьому навчають. До того ж за рік вивчення паскалю я переконався, що дотримування стилістики дозволяє не запутатися в коді

Подякували: koala, Torbins2

5

Re: Робота зі стеком у окремому модулі (PascalABC)

letitbe написав:

Нас цьому навчають. До того ж за рік вивчення паскалю я переконався, що дотримування стилістики дозволяє не запутатися в коді

А де ви навчаєтеся, якщо не секрет?

6

Re: Робота зі стеком у окремому модулі (PascalABC)

Львівський фізико-математичний ліцей (ЛФМЛ)

7

Re: Робота зі стеком у окремому модулі (PascalABC)

ADR написав:

Ви використовуєте тип перед його оголошенням.
Використайте попереднє оголошення типів. Здається так:

  
  Stack = record;
  PStack = ^Stack;
  Stack = record
    data: integer;
    next: PStack;
  end;

Я реалізував вашу ідею,

unit stek_cher;

interface

type
  Stack = record
  PStack = ^Stack;
  Stack = record
    data: integer;
    next: PStack;
  end;

проте компілятор невблаганний:

stek_cher.pas(7) : Встречено '=', а ожидалось ':'

8

Re: Робота зі стеком у окремому модулі (PascalABC)

А це вже ніяк не може бути, адже в 'type' оголошення рефлізовується через '=', а не через ':'.

9

Re: Робота зі стеком у окремому модулі (PascalABC)

Який компілятор? fpc нормально обробляє передоголошення посилання http://ideone.com/Hi3NkB як і gpc http://ideone.com/qEgt8t.
Зрештою, можна всередині запису посилатися на нього самого:

type
  Stack = record
    data: integer;
    next: ^Stack;
  end;

Це що, PascalABC?

Подякували: letitbe1

10

Re: Робота зі стеком у окремому модулі (PascalABC)

Так, це PascalABC

11

Re: Робота зі стеком у окремому модулі (PascalABC)

Stack - це стандартний тип в PascalABC (на кшталт), оберіть іншу назву і все буде ОК.

Подякували: letitbe, 0xDADA11C7, leofun013

12

Re: Робота зі стеком у окремому модулі (PascalABC)

Дякую, тепер все працює.