LINUX.ORG.RU

Введение в профессию (Столяров): MovingStar

 ,


0

2

Добрый день. На 375 странице 1-й части трёхтомника Столярова есть задача на Free Pascal MovingStar. При запуске должно быть что-то типа змейки звёздочкой в консоли. Код из книги выглядит так.

program MovingStar;
uses crt;
const
   DelayDuration =  100;
procedure GetKey(var code : integer );

{ ... }

type
   star	=  record
        CurX, CurY, dx, dy : integer;
   end;

procedure ShowStar(var s : star);
begin
   GotoXY(s.CurX, s.CurY);
   write('*');
   GotoXY(1, 1);
end;

procedure HideStar(var s : star);
begin
   GotoXY(s.CurX, s.CurY);
   write(' ');
   GotoXY(1, 1)
end;

procedure MoveStar(var s : star);
begin
   HideStar(s);
   s.CurX := s.CurX + s.dx;
   if s.CurX > ScreenWidth then
      s.CurX := 1
   else
      if s.CurX < 1 then
      s.CurX := ScreenWidth;
   s.CurY := s.CurY + s.dy;
   if s.CurY > ScreenHeight then
      s.CurY := 1
   else
      if s.CurY < 1 then
	 s.CurY := ScreenHeight;
   ShowStar(s)
end;

procedure SetDirection(var s : star; dx, dy: integer);
begin
   s.dx := dx;
   s.dy := dy
end;

var
   s  : star;
   ch : char;
begin
   clrscr;
   s.CurX := ScreenWidth div 2;
   s.CurY := ScreenHeight div 2;
   s.dx := 0;
   s.dy := 0;
   ShowStar(s);
   while true do
   begin
      if not KeyPressed then
      begin
	 MoveStar(s);
	 delay(DelayDuration);
	 continue
      end;
      GetKey(c);
      case c of
	-75 : SetDirection(s, -1, 0);
	-77 : SetDirection(s,  1, 0);
	-72 : SetDirection(s, 0, -1);
	-80 : SetDirection(s, 0, 1);
	 32 : SetDirection(s, 0, 0);
	 27 : break
      end
   end;
   clrscr
end.

Там сокрыто тело процедуры GetKey для экономии места, но оно есть в предыдущей задаче, откуда я его и взял. Вот так выглядит полностью процедура GetKey

procedure GetKey(var code : integer );
var
   c : char;
begin
   c := ReadKey;
   if c = #0 then
   begin
      c := ReadKey;
      code := -ord(c)
   end
   else
   begin
      code := ord(c)
   end
end;

Но при попытки компиляции выдаёт ошибку:

Free Pascal Compiler version 3.2.2+dfsg-11 [2022/05/26] for x86_64
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling MovingStar.pas
MovingStar.pas(83,14) Error: Identifier not found "c"
MovingStar.pas(84,12) Error: Identifier not found "c"
MovingStar.pas(85,6) Error: Constant and CASE types do not match
MovingStar.pas(86,6) Error: Constant and CASE types do not match
MovingStar.pas(87,6) Error: Constant and CASE types do not match
MovingStar.pas(88,6) Error: Constant and CASE types do not match
MovingStar.pas(89,6) Error: Constant and CASE types do not match
MovingStar.pas(90,6) Error: Constant and CASE types do not match
MovingStar.pas(95) Fatal: There were 8 errors compiling module, stopping
Fatal: Compilation aborted
Error: /usr/bin/ppcx64 returned an error exitcode

Строка 83 - это как раз вызов GetKey(c) в бесконечном цикле while. Проблема явно в этой процедуре, подскажите, как сделать правильно.

Перемещено hobbit из general

Но при попытки компиляции выдаёт ошибку:

я тоже сразу выдал ошибку )

Внимание: прочитайте описание разметки Markdown или LORCODE.

kindof ()

Скастуй автора, он есть на форуме.

chenbr0 ()

Проблема не в этой процедуре, а в той, в которой написаны строки

GetKey(c);
case c of ...

(то есть в главном блоке программы, или как там это в паскале называется)

Сначала все переменные надо объявлять, а только потом передавать внутрь GetKey.

Я думаю, что объявление имелось в виду
ch : char;

определись с именем переменной - она должна быть либо везде «c», либо везде «ch». (везде - это в главном блоке программы и объявлении его переменных).

Shushundr ()
Последнее исправление: Shushundr (всего исправлений: 3)

Читай про различие процедур и функций в Паскале. А также про методы передачи входных параметров и получения результатов.

В твоем случае надо объявить глобальную переменную integer code, в которую процедура GetKey будет складывать результат своей работы.

Ну и убрать лишний параметр у GetKey.

Если так, то ошибка в учебнике получается

Учебник, чтобы читать и думать, а не просто копировать )

kindof ()
Последнее исправление: kindof (всего исправлений: 2)
Ответ на: комментарий от Shushundr

Наверное неправильно прозвучит - но может нам всем стоит поаплодировать господину Столярову (без сарказма)? Не смотря на все мои с ним, так назовём - разногласия по части вопросов, благим делом занимается товарищ. И по факту - ученики имеются, так что не за зря это всё…

bugfixer ★★ ()
Последнее исправление: bugfixer (всего исправлений: 1)
Ответ на: комментарий от bugfixer

Как начинающий скажу, что даже при желании овладеть программированием до вменяемого уровня найти полезный материал не так просто, когда ещё ничего не знаешь, где какие сообщества, где какие авторы. Информации много, но в подавляющем большинстве - это мусор. У меня достаточно много времени ушло, чтобы обнаружить, что существует вот такой структурированный пошаговый материал, который при этом современный и легко читается, находясь в постоянном диалоге с читателем.

ilyaGor ()
Ответ на: комментарий от ilyaGor

Вот только вы упускаете, что сам материал - треш, использующий неверные термины, где авто придумывает свои определения. Почитайте отзывы, например недавно был срач про то, что автор абсолютно не понимает термина чистая функция. Для Столярова любая процедура - это чистая функция, потому что она не возвращает результат.

PPP328 ★★★★ ()
Ответ на: комментарий от PPP328

Для Столярова любая процедура - это чистая функция, потому что она не возвращает результат.

Мы все понимаем что разницы ровно ноль - можно игнорировать eax, а можно нет. У него была куча других посылов которые меня лично передёрнули гораздо сильнее. Но. Давайте отдадим должное - подавляющее большинство из нас - не преподаватели. А ему удалось написать «книгу» (учебник). Вы бы смогли?

bugfixer ★★ ()
Ответ на: комментарий от ilyaGor

Я на будущее бы всё-таки посоветовал внимательнее вчитываться в сообщения об ошибках. В вашем случае если компилятор пишет

MovingStar.pas(83,14) Error: Identifier not found "c"

он же пишет прямым текстом: «имя не найдено», т.е. переменная c не объявлена. Осталось только понять, где она должна объявляться и присваиваться.

Да, бывают более сложные ошибки, которые не сразу поймёшь, откуда вылезли, особенно в C/C++, где вместо модулей костыли на препроцессоре из начала 70-х, и только год назад в плюсах наметился постепенный уход от них. Но эта — из простейших. Да и вообще, Паскаль в этом плане намного строже и однозначнее плюсов, поэтому Столяров и предлагает учить программирование с него.

hobbit ★★★★★ ()

Странно, в заголовке написано о профессии столяров, а внутри паскаль какой-то.

thesis ★★★★★ ()
Ответ на: комментарий от ilyaGor

Информации много, но в подавляющем большинстве - это мусор.

Именно поэтому и надо читать книжки. И даже не только современные. Есть довольно много старых книг, которые, да, не дадут вам информацию о современном положении вещей, но дадут фундамент (сообщение об отсутствующей переменной для вас уж точно загвоздкой не будет). И да, Столяров, как бы на него не наезжали — это довольно-таки хороший компромисс между фундаментом и современностью. Главное — помнить, что у него тоже не везде истина в последней инстанции.

P.S. И для вопросов по программированию у нас на форуме есть раздел Development. General — это если тема в другие разделы не подходит.

hobbit ★★★★★ ()
Последнее исправление: hobbit (всего исправлений: 2)
Ответ на: комментарий от thesis

Странно, в заголовке написано о профессии столяров, а внутри паскаль какой-то.

Лучший коммент треда)

goingUp ★★★★★ ()

все нормальные языки(у которых есть оператор case или switch ) проверяют тип значения варианта и проверяемой переменной. в данном случае метки имеют отрицательное значение, что странно для паскалевского char, что стоит в case(c). ну вот не бывает отрицательных символов. значит там какой-то знаковый тип должен быть…

замес char и int в одну кучу оставим на совести автора кода.

alysnix ★★ ()

Если что, все программы из книги есть в отдельном архиве. Там всё должно компилироваться. А дальше применяй diff и смотри чего не хватает в версии, которую ты собрал.

Но, может быть, вообще лучше самому написать аналог этой фигни, а не перепечатывать из книги?

Xenius ★★★★★ ()
Ответ на: комментарий от bugfixer

Мы все понимаем что разницы ровно ноль - можно игнорировать eax, а можно нет

Вы, по-ходу, тоже не понимаете, что такое чистая функция

yoghurt ★★★★★ ()
Ответ на: комментарий от yoghurt

Вы, по-ходу, тоже не понимаете, что такое чистая функция

Возможно. Готов услышать Ваше определение. Вы сейчас про «без побочных эффектов» пласт вскроете?

bugfixer ★★ ()
Ответ на: комментарий от bugfixer

Мы все понимаем что разницы ровно ноль

Столяров так и хотел сказать: процедура - это чисто такая функция…

rupert ★★★★★ ()
Ответ на: комментарий от hobbit

Есть есть довольно много старых книг, список в студию

ilyaGor ()
Ответ на: комментарий от PPP328

Почитайте отзывы, например недавно был срач про то, что автор абсолютно не понимает термина чистая функция. Для Столярова любая процедура - это чистая функция, потому что она не возвращает результат.

По-моему вы просто ничего не поняли. Столяров считает, что процедуры должны концептуально отличаться от функций. Функции не должны использовать побочных эффектов. В то же время если они необходимы, то следует использовать процедуру, а не функцию.

Поскольку в C нет различия между функциями и процедурами (в отличии от паскаля), для начального обучения программированию рекомендуется использовать именно паскаль. А на C переходить стоит уже после твёрдого усвоиения основных концепций.

Xenius ★★★★★ ()
Последнее исправление: Xenius (всего исправлений: 1)
Ответ на: комментарий от yoghurt

ПризнаЮ - упустил акцент на «чистая». Но, кмк, это исключительно столяровское определение довольно оторванное от реальности - класс таких функций исчезающе мал (что теперь делать со всеми syscalls - они у нас неожиданно все стали «процедурами»?)

bugfixer ★★ ()
Последнее исправление: bugfixer (всего исправлений: 1)
Ответ на: комментарий от Croco

О, а Вы таки появились ;) Расскажите нам лучше зачем на 543ой странице 1го тома Вы реализовали strcpy() копируя сначала в стек (который сильно ограничен) используя 4x(!!) больше места (и memory bandwidth) чем необходимо. Я уже молчу про очевидные partial register stalls в этом коде, но это уже полёты другого уровня…

bugfixer ★★ ()
Ответ на: комментарий от bugfixer

для наглядности, он же там и пишет... Вообще все претензии к господину Столярову делятся на два типа: 1) не читал, но не одобряю и 2)я могу в сто раз лучше... Так в чем проблема? Где ваша книга с блекджеком и правильным way для нубов?

shTigrits ()
Ответ на: комментарий от shTigrits

Где ваша книга с блекджеком и правильным way для нубов?

Как я уже говорил - я ни в одном глазу не преподаватель. И я очень признателен (на самом деле) господину Столярову за его труды. Если бы он был больше открыт к общению и конструктивной критике - всё было бы гораздо проще. Но господин реально зазнался (Вы пробовали с ним связаться через его сайт - это реально нечто). И код который он показывает (с моей колокольни), мягко говоря - не очень. Оставляя за скобками часть его «теоретических» посылов, которые, как я говорил, имхо имеют мало отношения к реальности. Давайте подождём его ответ на те конкретные претензии что я уже высказал публично. Дальше будет более-менее понятно что делать.

@Croco: прокомментируйте плз Ваш strcpy(), мне реально интересно что Вас сподвигло…

bugfixer ★★ ()
Ответ на: комментарий от bugfixer

Там просто пример какого-то случайного кода на ассемблере, чтобы показать форму записи кода. Написано же: «Код пишется в столбик примерно так». Там даже не написано, что он делает что-либо осмысленное. То, что код оказался странной версией strcpy - просто совпадение.

rupert ★★★★★ ()
Ответ на: комментарий от shTigrits

для наглядности, он же там и пишет…

Это учебник. И хотелось бы видеть там код хотя бы отдаленно напоминающий то к чему народ стремится. А этот конкретный фрагмент, мягко говоря, «фу-фу-фу». И, спешу заметить - это asm, ручной, откомментированный. Но (да прости меня господи) - яркий пример того как делать не надо (хотел сказать гораздо жёстче, но сдержался).

Вообще все претензии к господину Столярову делятся на два типа: 1) не читал

Гхм, странная претензия. Учитывая что я даже удосужился разобраться что этот код таки делает. В отличие от многих…

2)я могу в сто раз лучше…

В плане кода - могу. Более того - мне за это денюжку платят…

bugfixer ★★ ()
Ответ на: комментарий от bugfixer

Если бы он был больше открыт к общению и конструктивной критике - всё было бы гораздо проще. Но господин реально зазнался (Вы пробовали с ним связаться через его сайт - это реально нечто). И код который он показывает (с моей колокольни), мягко говоря - не очень.

  1. много лет отслеживаю посты Столярова. Тем более он свои книги на всеобщее обсуждение выкладывает до их официального релиза. Ни разу не видел его закрытость. Если он не отвечает на некоторые посты - это его право. Ну не хочет он в очередной раз очередному мамкиному неосилятору «суперстару» в программировании объяснять прописные истины.
  2. Возможно автору критического поста и кажется, что он приводит «супер» аргументы в адрес Столярова, но на самом деле, при определенной затрате умственной энергии получается, что эти «аргументы» выеденного яйца не стоят. Если критика шла с действительно стоящими аргументами, Столяров всегда отвечал вполне конкретно и по теме, не съезжая на личности.
  3. Я несколько раз писал ему на сайт об увиденных ошибках и всегда он корректно отвечал, даже если я был неправ.
Milker ()
Ответ на: комментарий от Milker

очередной раз очередному мамкиному неосилятору «суперстару» в программировании

Улыбнулся.

объяснять прописные истины

Цитирую (2ое издание, том 1ый, стр. 29):

разумеется, дальше vector’а и list’а обучение никогда не заходит (как раз эти два контейнера, пожалуй, самые бесполезные из всего STL)

Какое счастье что такие «прописные истины» никто до меня в своё время не донёс. И таких, мягко говоря - вызывающих вопросы, посылов там предостаточно.

Я несколько раз писал ему на сайт об увиденных ошибках и всегда он корректно отвечал

А мне вот не ответил, после нескольких неуспешных попыток связаться. Причём, емнип, я даже вопросы пожертвований / спонсорства поднимал. Но сейчас это подтвердить будет невозможно так как сайт сделан настолько неюзабельным что никакие подтверждения «Ваше сообщение получено» (и ниже текст) не отсылаются. Про капчу через которую удаётся прорваться с 10ой попытки я вообще молчу.

даже если я был неправ

Тот asm фрагментик про который я писал выше настолько ужасен, что если бы я подобное увидел у нас - руки бы автору оторвал. Показывать такое условным детишкам - преступление (имхо).

bugfixer ★★ ()
Последнее исправление: bugfixer (всего исправлений: 1)
Ответ на: комментарий от bugfixer

Тут вот какая загогулина.

У нас например студентов мало, поэтому мы их всячески холим и лелеем, ко всем отзывам на образовательный процесс относимся трепетно. Причем эти студенты наши будущие коллеги, плохо научим - сами потом мучаться будем же.

А на ВМК этих студентов по 400 рыл на курсе, девать некуда. После защиты дипломов они с ВМК уходят, поэтому как и чему их научили самому ВМК пофиг. Из моего небольшого опыта работы с вмкашниками - все плохо. Единицы там знают математику но программировать в среднем толком не умеют.

Типичная история когда нет фидбека.

AntonI ★★ ()
Последнее исправление: AntonI (всего исправлений: 1)
Ответ на: комментарий от AntonI

Из моего небольшого опыта работы с вмкашниками - все плохо. Единицы там знают математику но программировать в среднем толком не умеют.

Парочка моих коллег именно с ВМК (старой формации люди), очевидно что это не показатель «en masse» - но довольно грамотные спецы.

Типичная история когда нет фидбека.

И вот здесь мы подходим к самому главному - почему этот вот самый пресловутый feedback от людей занимающихся плюсовой разработкой в промышленных масштабах несколько последних десятилетий игнорируется?

bugfixer ★★ ()
Ответ на: комментарий от bugfixer

Парочка моих коллег именно с ВМК (старой формации люди)

Я про сейчас. Те кто заканчивал ВМК дцать лет назад совсем другие люди.

почему этот вот самый пресловутый feedback от людей занимающихся плюсовой разработкой в промышленных масштабах несколько последних десятилетий игнорируется?

Потому что это не фидбек (для ВМК). Он не влияет ни на доход преподавателей ни на решение студентов при выборе вуза.

Я как то общался с преподом академии ВВС, нам было тогда по 30ть но он уже был полковником. Так вот у них на КАЖДОГО слушателя через какое то время после выпуска приходила с места службы характеристика. Официальная бумага. Я уж не помню влияли эти характеристики на премии/повышения педсостава, но даже в смысле почитать было очень полезно и мотивирующе.

Ну и цитируя одного из коллег из МГУ - «в РФ высшее образование наладиться когда у профессора ЗП будет 500тыр, у доцента 300.» Сейчас это образование все еще неплохое (клятый совесткий задел был огого), но тенденция не айс.

AntonI ★★ ()
Последнее исправление: AntonI (всего исправлений: 1)
Ответ на: комментарий от AntonI

Потому что это не фидбек (для ВМК). Он не влияет ни на доход преподавателей ни на решение студентов при выборе вуза.

Ты реально думаешь что господин Столяров настолько «в системе»? Мне казалось - он очень (назовём это так) упёртый борец за идеи «свободы», местами переходящий в своих убеждениях (прости меня господи) грани маразма?

bugfixer ★★ ()
Ответ на: комментарий от bugfixer

Это скорее всего упертый «теоретик». Что бы быть в системе надо как минимум самому заниматься разработкой коммерческих проектов. Если делать это всерьез, то на преподавание (фуллтайм, как Столяров) уже не останется ни сил ни времени.

У яндекса был правильный заход, они готовили на ВМК кадры под себя. Погугли школу обработки данных от Яндекса. Ну так там джаст-фор-фан (или за маленькую денюшку) работают сотрудники яндекса которые точно знают что и как надо Яндексу. Попасть в эту школу трудно, доп.нагрузка зверская, отсев большой, но на выходе ты заточен под решение яндексовых задач.

И поверь, если бы там было важно качество асм-кода - они бы учили писать качественный асм код. Потому что там правильное соотношение практики и теории.

AntonI ★★ ()
Последнее исправление: AntonI (всего исправлений: 1)
Ответ на: комментарий от AntonI

И поверь, если бы там было важно качество асм-код

Вот здесь я должен уточнить. Ты понимаешь мои претензии к этому конкретному example на который я так взъелся? Это (а) безумно медленный код (на вскидку: 5x - 20x медленней чем могло бы быть) и (б) - potential sporadic coredumper (и вот тут я не понимаю почему народ этого не видит).

bugfixer ★★ ()
Последнее исправление: bugfixer (всего исправлений: 1)
Ответ на: комментарий от bugfixer

Я асма не знаю, так что не могу никак прокомментировать.

Я подозреваю что у аффтора был какой то кусок асма с незапамятных пор, причем тогда он был рабочий и акутальный. Но все течет, все меняется…

AntonI ★★ ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.