Free Pascal: проеверка с 2-мя вариантами
| |
Andrey_M | Дата: Среда, 19 Декабря 2012, 16:27 | Сообщение # 21 |
старожил
Сейчас нет на сайте
| Проверил... сделал, как ты сказал.
Он требует ещё один begin. Видимо, он не так меня понял...
ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
|
|
| |
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 умнее, понимает пользователя лучше и умеет намного больше. Quote (Andrey_M) Может, выхов процедуры открытия файла создаёт сей баг? Ты нигде никакой "процедуры открытия файла" не вызывал. И это не баг, а твоё полное незнание языка. Почитай умные книжки, а? Поделаешь простых примерчиков из книжек, разберёшься в них и будешь лучше понимать то, что печатаешь в редакторе кода.
Прежде чем экспериментировать и тыкать куда попало begin и end - сначала разберись, что ты сделал (напечатал) и что думает о тебе твоя среда разработки...
*** Quote (Destroy) вот странно я полностью скопировал что у тебя было и поставил end; и все нормально А, ну точно. Delphi позволяет не писать begin (открывающий тело программы) перед заключительным end с точкой в программе, если он тебе не нужен (т.е. если у программы нет тела, только комплект процедур-функций). Правда, не совсем понятно, зачем это может понадобиться, ведь такая программа ничего не выполняет...
Сообщение отредактировал TimKruz - Среда, 19 Декабря 2012, 17:55 |
|
| |
Andrey_M | Дата: Среда, 19 Декабря 2012, 17:53 | Сообщение # 30 |
старожил
Сейчас нет на сайте
| Quote (TimKruz) Неизменяемый во время исполнения программы делай строковой константой. Константа - это именованные данные, которые компилятор вставляет в нужных местах программы (по имени константы); присваивать что-либо константе, естественно, нельзя, если константа не имеет определённого типа (тогда это уже не константа, а переменная с предопределённым значением), например: Я так и сделал вроде. HELPTEXT - это переменная с заранее заданным значением.
Quote (TimKruz) Переменным лучше давать говорящие названия, если это не счётчик какой-нибудь или ещё что-то временное Я просто вместо q в переменной request часто пишу tab.
Спасибо, пока всё. ПОКА.
ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
|
|
| |
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 - сначала разберись, что ты сделал (напечатал) и что думает о тебе твоя среда разработки... Я об этом думаю в первую очередь. Просто я подумал, что процедура всё сделает за меня
Quote (TimKruz) Ты нигде никакой "процедуры открытия файла" не вызывал. И это не баг, а твоё полное незнание языка. Почитай умные книжки, а? smile Поделаешь простых примерчиков из книжек, разберёшься в них и будешь лучше понимать то, что печатаешь в редакторе кода. Я сейчас и делаю эти примерчики. Просто меня ДИКО БЕСИТ переписывать из умных книжек длиннющие программы для высчитывания квадратного корня 567... мне сразу хочется сделать то, что можно будет использовать.
ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
|
|
| |
|