Проблема: процедура не нормально работает

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Ответить
DDR
незнакомец
Сообщения: 5
Зарегистрирован: 07.02.2011 11:19:57

Проблема: процедура не нормально работает

Сообщение DDR »

Я тут вот с каким вопросом. Пишу программу "телефонная книга", алгоритм готов на бумаге. Начал кодирование, и тут столкнулся со следующей проблемой. При линейном вызове процедуры из модуля, процедура выполняет код нормально (в данном случае создает файл, имя задается переменной). Но если ту же процедуру вызывать из конструкций if then, repeat - until, case и т.д. то она проходит без создания файла. Если имя задать константой то все нормально проходит.
Код сильно утрирован для простоты восприятия:

Код: Выделить всё

Unit pr;
INTERFACE
procedure MakePh;

IMPLEMENTATION
procedure MakePh;
const c='.ph';
type
   phon = record
   Surname:string[10];
   Name:string[10];
   Telephon:string[10];
   Stat:boolean;
   end;
   Ph = array [1..11] of phon;
var
F:file of Ph;
Name:string;

begin
write('Введите имя файла: ');
readln(Name);
Name:=Name+c;
Assign(F,Name);
{$I-}
reset(F);
if Ioresult <> 0 then rewrite(F);
{$I+}
close(F);
end;

BEGIN
END.

при вызове из основной программы с линейным алгоритмом:

Код: Выделить всё

uses crt,pr;

BEGIN
MakePh;
END.

Файл создается.
При вызове из основной программы с нелинейным алгоритмом.

Код: Выделить всё

uses crt,pr;
var I:integer;
BEGIN
write('Создать файл - "1": ');
read (I);
if I = 1 then MakePh;
END.

Программа выводит "Введите имя файла", и завершает свою работу.
Может, я книжки верх ногами читаю?!
Подскажите мне молодому, не опытному, что тут не так. Буду очень благодарен за совет.
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

Возможно:

Код: Выделить всё

uses crt,pr;
var I:string;
BEGIN
write('Создать файл - "1": ');
read (I);
if I = '1' then MakePh;
END.
DDR
незнакомец
Сообщения: 5
Зарегистрирован: 07.02.2011 11:19:57

Сообщение DDR »

Попробовал, не помогло. У меня впечатление, что это компилятор кривой. Никак не могу обойти этот косяк. Сижу на Ubuntu 10.10, редактор Geany 0.19.1, Free Pascal Compiler version 2.4.0-2 [2010/03/06] for i386. Грешу уже на все(((
Alexey_Melky
новенький
Сообщения: 21
Зарегистрирован: 14.05.2005 14:55:31

Сообщение Alexey_Melky »

Попробуй вместо Read(I) использовать ReadLn(I).
DDR
незнакомец
Сообщения: 5
Зарегистрирован: 07.02.2011 11:19:57

Сообщение DDR »

Спасибо большое за readln :D Процедура работает исправно :D :D :D
Подскажите, где найти информацию о таких деталях?
Аватара пользователя
informat
новенький
Сообщения: 62
Зарегистрирован: 27.10.2010 09:44:20
Откуда: http://informat.name
Контактная информация:

Сообщение informat »

Во всех приличных книгах по Pascal, в разделах о read и readln.
Например.
Мансуров К.Т. Основы программирования в среде Lazarus, 2010.
Глава 2 Введение в язык программирования Pascal.
Стр. 57
При использовании оператора read в буфере остается код клавиши Enter. В некоторых случаях это может привести к неправильной работе следующего оператора ввода.
DDR
незнакомец
Сообщения: 5
Зарегистрирован: 07.02.2011 11:19:57

Сообщение DDR »

Спасибо.
Ответить