Четверг, 21 Ноября 2024, 20:07

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 2 из 2
  • «
  • 1
  • 2
Free Pascal: проеверка с 2-мя вариантами
Andrey_MДата: Среда, 19 Декабря 2012, 16:27 | Сообщение # 21
старожил
Сейчас нет на сайте
Проверил... сделал, как ты сказал.

Он требует ещё один begin. Видимо, он не так меня понял... biggrin


ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
DestroyДата: Среда, 19 Декабря 2012, 16:30 | Сообщение # 22
постоянный участник
Сейчас нет на сайте
Quote (Andrey_M)
Он требует ещё один begin

вот странно я полностью скопировал что у тебя было и поставил end; и все нормально
Andrey_MДата: Среда, 19 Декабря 2012, 16:33 | Сообщение # 23
старожил
Сейчас нет на сайте
У тебя какой компилятор?

ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
DestroyДата: Среда, 19 Декабря 2012, 16:36 | Сообщение # 24
постоянный участник
Сейчас нет на сайте
delphi 7
Andrey_MДата: Среда, 19 Декабря 2012, 16:37 | Сообщение # 25
старожил
Сейчас нет на сайте
ВООТ! А у меня FREE PASCAL IDE.

ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
DestroyДата: Среда, 19 Декабря 2012, 16:50 | Сообщение # 26
постоянный участник
Сейчас нет на сайте
хм..странно все равно мне кажется сильных различий не должно быть
Andrey_MДата: Среда, 19 Декабря 2012, 17:07 | Сообщение # 27
старожил
Сейчас нет на сайте
Возможно, какие-то отдельные тонкости вроде вот этого там и различаются как раз.

Со вторым begin-ом прога запускается и компилируется всё норм, но при этом рабботает только второй бегин - первый вообще игнорируется.

Может, выхов процедуры открытия файла создаёт сей баг?


ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
TimKruzДата: Среда, 19 Декабря 2012, 17:38 | Сообщение # 28
старожил
Сейчас нет на сайте
Quote (Andrey_M)
Он требует ещё один begin. Видимо, он не так меня понял...

Ты напечатал только процедуру. А программа где? Должно быть так:
Code
program... //заголовок программы - необязателен
const...
label...
type...
var...
//процедуры и функции
procedure/function... //заголовок процедуры/функции - обязателен
var... блаблабла
begin
   //тело процедуры/функции - обязательно, если заголовок не имеет директивы forward (тогда тело с дополнительным заголовком будет ниже)
end;

begin
   //тело программы
end.

Блок begin..end с точкой для основного кода программы должен быть всегда, даже если он пустой.
В модулях (unit <имя>; вместо program <имя>;) точно так же, но заключительный begin..end исполняется во время инициализации модуля и может совсем отсутствовать, но заключительный end с точкой всё равно должен быть.

Правда ошибка у тебя немного другая. Ты напечатал только заголовок процедуры (procedure ...;), потом сразу тело программы, а тело процедуры - нет, поэтому компилятор принял тело программы за тело процедуры, а тело программы не обнаружил, отсюда невозможность компиляции.

Quote (Andrey_M)
HELPTEXT:=('Текстовый редактор by Andrey_Mironenko. Создан при помощи Free Pascal. Среда разработки - Free Pascal IDE.Введите OPEN для открытия файла, HELP - для справки, EXIT - для выхода из программы.');

Зачем скобки?
Неизменяемый во время исполнения программы делай строковой константой. Константа - это именованные данные, которые компилятор вставляет в нужных местах программы (по имени константы); присваивать что-либо константе, естественно, нельзя, если константа не имеет определённого типа (тогда это уже не константа, а переменная с предопределённым значением), например:
Code
const helpstr='справка'; //константа-строка
   optimal_fps=30; //константа-число, при чём целое
   v1:byte=99; //типизированная константа типа байт, фактически - переменная с заданным изначально значением
var v2:byte=99; //переменная типа байт со стартовым значением 99
//v2 идентична v1

***
begin
   //Эти две инструкции одинаковы:
   writeln(helpstr);
   writeln('справка');
   //Но вызывать статичную длинную строку из разных мест программы проще по короткому имени,
   //а чтобы изменить её, достаточно изменить константу в начале программы, и не бегать по коду.
end.


Короче, вот немного исправленный код, разбирайся в нём:
Code
program CoolEditor; //на всякий случай, пусть имя программы будет задано
//Константа с текстом, изменять её в коде программы нельзя, только вызывать:
const HELPTEXT='Текстовый редактор by Andrey_Mironenko. Создан при помощи Free Pascal. Среда разработки - Free Pascal IDE.Введите OPEN для открытия файла, HELP - для справки, EXIT - для выхода из программы.';

var i:byte; request,s:string; //компактная запись
//Переменным лучше давать говорящие названия, если это не счётчик какой-нибудь или ещё что-то временное

procedure createfile(name:string);
begin
   //output - стандартная текстово-файловая переменная, допускает только вывод;
   //ещё есть input, только для ввода
   assign(output,name);
   rewrite(output);
   close(output);
end;

procedure openfile(name:string);
var N:string; //ведь эта переменная применяется только здесь
begin
   write('Введите имя файла: '); //"имя" может включать в себя путь к файлу
   Readln(N);
   if N<>'' then
   begin
     Assign(input, N); //используем input, если записывать в файл ничего не нужно
     Reset(input);
     //Здесь хорошо бы сделать проверку ошибки ввода-вывода,
     //считав значение ioresult (равно 0, если ошибки нет, либо код ошибки);
     //ioresult хранит код последней ошибки и обнуляется после считывания
     while not Eof(input) do
     begin
       Readln(input,N);
       Writeln(N);
     end;
   Close(input);
   end;
end;

begin
   repeat
     readln(request);
     for i:=1 to length(request) do request[i]:=upcase(request[i]);
     if request='OPEN' then openfile('') else
     if request='CREATE' then createfile('test.txt') else
     if request='HELP' then writeln(HELPTEXT) else
     if request='EXIT' then exit else
       writeln('Неправильная команда!');
until false;
end.

Я не уверен, что это всё будет нормально работать, но это как бы заготовка. Думай в этом направлении. Тут по-прежнему много чего нужно сделать.

P.S. Почитай какой-нибудь учебник по TurboPascal. По FreePascal вряд ли найдёшь, но FP поддерживает всё (ну или почти всё, но это тебе сейчас не должно быть важно) из TP.


TimKruzДата: Среда, 19 Декабря 2012, 17:46 | Сообщение # 29
старожил
Сейчас нет на сайте
Quote (Destroy)
хм..странно все равно мне кажется сильных различий не должно быть

Сильные отличия Delphi от Pascal есть (и много) - Delphi умнее, понимает пользователя лучше и умеет намного больше. biggrin
Quote (Andrey_M)
Может, выхов процедуры открытия файла создаёт сей баг?

Ты нигде никакой "процедуры открытия файла" не вызывал. И это не баг, а твоё полное незнание языка. Почитай умные книжки, а? smile Поделаешь простых примерчиков из книжек, разберёшься в них и будешь лучше понимать то, что печатаешь в редакторе кода.

Прежде чем экспериментировать и тыкать куда попало begin и end - сначала разберись, что ты сделал (напечатал) и что думает о тебе твоя среда разработки...

***
Quote (Destroy)
вот странно я полностью скопировал что у тебя было и поставил end; и все нормально
Quote (Destroy)
delphi 7

А, ну точно. Delphi позволяет не писать begin (открывающий тело программы) перед заключительным end с точкой в программе, если он тебе не нужен (т.е. если у программы нет тела, только комплект процедур-функций). Правда, не совсем понятно, зачем это может понадобиться, ведь такая программа ничего не выполняет...




Сообщение отредактировал TimKruz - Среда, 19 Декабря 2012, 17:55
Andrey_MДата: Среда, 19 Декабря 2012, 17:53 | Сообщение # 30
старожил
Сейчас нет на сайте
Quote (TimKruz)
Неизменяемый во время исполнения программы делай строковой константой. Константа - это именованные данные, которые компилятор вставляет в нужных местах программы (по имени константы); присваивать что-либо константе, естественно, нельзя, если константа не имеет определённого типа (тогда это уже не константа, а переменная с предопределённым значением), например:

Я так и сделал вроде. HELPTEXT - это переменная с заранее заданным значением.

Quote (TimKruz)
Переменным лучше давать говорящие названия, если это не счётчик какой-нибудь или ещё что-то временное

Я просто вместо q в переменной request часто пишу tab.

Спасибо, пока всё. ПОКА. biggrin


ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
TimKruzДата: Среда, 19 Декабря 2012, 18:01 | Сообщение # 31
старожил
Сейчас нет на сайте
Quote (Andrey_M)
Я так и сделал вроде. HELPTEXT - это переменная с заранее заданным значением.

Нет, в твоём коде на первой странице этой темы ты объявляешь обычную переменную, а затем присваиваешь ей значение в коде программы. Присваивание занимает процессорное время (т.к. выполняется каждый раз, как ты запускаешь свою программу), а инициализирующее значение переменной записывается непосредственно по адресу (в готовом машинном коде программы), где будет расположена переменная, т.е. на этапе компиляции/компоновки программы. Ну в наше время быстрых ЭВМ это как-то уже не важно, но всё-таки лучше программировать красиво и оптимально...

Quote (Andrey_M)
Я просто вместо q в переменной request часто пишу tab.

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


Andrey_MДата: Среда, 19 Декабря 2012, 18:01 | Сообщение # 32
старожил
Сейчас нет на сайте
Quote (TimKruz)
Прежде чем экспериментировать и тыкать куда попало begin и end - сначала разберись, что ты сделал (напечатал) и что думает о тебе твоя среда разработки...

Я об этом думаю в первую очередь. Просто я подумал, что процедура всё сделает за меня biggrin

Quote (TimKruz)
Ты нигде никакой "процедуры открытия файла" не вызывал. И это не баг, а твоё полное незнание языка. Почитай умные книжки, а? smile Поделаешь простых примерчиков из книжек, разберёшься в них и будешь лучше понимать то, что печатаешь в редакторе кода.

Я сейчас и делаю эти примерчики. Просто меня ДИКО БЕСИТ переписывать из умных книжек длиннющие программы для высчитывания квадратного корня 567... мне сразу хочется сделать то, что можно будет использовать.


ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг