Как исправить ошибку в паскале readln

kola kolin



Ученик

(175),
закрыт



4 года назад

Дополнен 4 года назад

команда которая не читается находится в самом низу кода перед end

Дополнен 4 года назад

если есть переменные типа real то не реагирует read с переменной типа string

Дополнен 4 года назад

тоесть я не могу комбинировать read с переменным string и real в одном коде

Gennady

Гений

(59312)


4 года назад

Замените все свои Read() на ReadLn() и будет вам счастье.

Фишка в том, что процедура Read() оставляет в буфере клавиатуры смвол перевода строки, который при чтении в строковую переменную и приводит к такому эффекту.

Процедура же ReadLn() очищает буфер клавиатуры полностью. Для проверки достаточно заменить Read(c) на ReadLn(c) и программа остановится в ожидании второго ответа юзера.

Источник: Учите матчасть

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

У меня ReadLn – не работает…

Ничего не понимаю…
У меня ReadLn не работает…
Кликните, пожалуйста, у себя Ctrl+клик на ReadLn.
В каком uses находится ReadLn? (для текстовых файлов)

.

Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
  • Профиль
  • Сайт

Re: У меня ReadLn – не работает…

Сообщение bormant » 25.03.2013 13:33:49

ReadLn находится в модуле System, который подключен всегда вне вашего желания.
Поэтому, скорее всего, вы просто перекрыли System.ReadLn одноимённой процедурой в своём коде. Попробуйте в нужном месте вписать System.ReadLn в место ReadLn.

Аватара пользователя
bormant
постоялец
 
Сообщения: 402
Зарегистрирован: 21.03.2012 11:26:01

Re: У меня ReadLn – не работает…

Сообщение vitaly_l » 25.03.2013 14:03:58

bormant писал(а):ReadLn находится в модуле System

Юмор в том что его там нет…
Но ReadLn – начал работать, только я всё равно – не могу посмотреть где он лежит…
т.к. Ctrl+клик на ReadLn не работает.
Assign – показывает.
Reset – показывает.
Close(f); – показывает.
А ReadLn – нет… и простым поиском его в System нет, хотя там: и Assign и Reset и Close…
Но это ужен не актуально, т.к. файл начал считываться и я прочитал то, что хотел и запустил cdecl.
правда только текстовый файл, а не форматированный.

Спасибо Вам.

Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
  • Профиль
  • Сайт

Re: У меня ReadLn – не работает…

Сообщение Sergei I. Gorelkin » 25.03.2013 14:27:49

Readln не существует в виде процедуры, она преобразуется в последовательность вызовов fpc_read_text_sint, fpc_read_text_float и т.д.

Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1390
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград
  • Профиль
  • ICQ

Re: У меня ReadLn – не работает…

Сообщение vitaly_l » 25.03.2013 14:33:42

Sergei I. Gorelkin писал(а):Readln не существует в виде процедуры, она преобразуется в последовательность вызовов fpc_read_text_sint, fpc_read_text_float и т.д.

Спасибо – большое, добрый Sergei I. Gorelkin

Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
  • Профиль
  • Сайт

Re: У меня ReadLn – не работает…

Сообщение bormant » 25.03.2013 15:02:35

ReadLn не работает

и “не находится реализация ReadLn” — несколько разные вещи. А так да, Read(Ln)/Write(Ln)/Str — compiler magic — операторы/процедуры, созданные надъязыковыми средствами, вместо них компилятор подставляет специфичные случаю реализации.

Аватара пользователя
bormant
постоялец
 
Сообщения: 402
Зарегистрирован: 21.03.2012 11:26:01

Re: У меня ReadLn – не работает…

Сообщение vitaly_l » 25.03.2013 15:14:06

bormant писал(а):и “не находится реализация ReadLn” — несколько разные вещи.

Нет он у меня вначале отказывался работать, т.к. в Вашем примере было ReadLn(f,n); где n: integer; и он выдавал ошибку. когда заменил на String всё стало работать. И тестовые файлы грузятся и cdecl работает. А вот мои файлы, я пока ещё не дешифровал…

Но зато благодаря Вам понял систему программирования того программиста который писал модуль.

Теперь пытаюсь понять как его модуль дешифровал форматированный файл…
Самое обидное, что модуль возможно не работает из-за несовместимости или не того порядка в инициализации uses’ов…

/

Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
  • Профиль
  • Сайт

Re: У меня ReadLn – не работает…

Сообщение Alex2013 » 03.04.2013 13:32:50

Текстовые файлы лучше всего читать-писать через TStringList или если читается только часть файла через TFileStream
А кроме того с ошибками в/в через исключения работать надежнее
Что-то вроде …

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

Function ReadFromFile (Fn:String; FilePos,Size :Longint):string;
Var
Data:String;
F:TFileStream;
I:Longint;
begin
Data:='';
if FileExists(FN) then begin
  F:=TFileStream.Create(FN,fmOpenRead);
  try
   if FilePos+Size<=F.Size then
   begin
    f.seek(FilePos,soFromBeginning);
    For I:=1 to Size do
    begin
      data:=data ;
     f.Read(data[i],1);
    end;
   end
finally
  f.free;
end;
ReadFromFile:=Data;
end
end;
Alex2013
долгожитель
 
Сообщения: 2695
Зарегистрирован: 03.04.2013 11:59:44


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12

Topic: Readln in lazarus pascal not working  (Read 4489 times)

When I

writeln(‘enter number’);
readln(number);
writeln(‘enter number2’);
readln(number2);

it asks for the number and I type it and it reads it upon hitting return as it should.

The second writeln shows on screen but when I type a number it doesn’t show on the keyboard unless I type it a second time.

Any idea why this is happening?


Logged


Hi!

Your terminal window or cmd window is not high enough. Expand it to full screen.

Or:

  1. write(‘enter number:  ‘);

  2. readln(number);

  3. write(‘enter number2:  ‘);

  4. readln(number2);

Winni


Logged


Thank you very much for the response but neither of them worked.

Do you have anything else you can think of for me to try?


Logged


what OS are you on and can you please post the complete lines here ?

Btw, if that is the last line of the program and you are in console mode it seems, you need to place a readln as the last function so the console screen will stay open and wait for you to hit enter.


Logged

The only true wisdom is knowing you know nothing


Thanks.

Windows 10 version 1903

This happens with every keyboard input after the first one which works fine.  The rest of them I have to type the number or letter a second time before it shows up on the screen and can be read in.

Actual Code is:

Write(‘Choose the Home team by number and hit enter  ‘);
  Readln(teamnumber);
  HomeTeamAcronym := teamacronym[teamnumber];
  t1 := teamnamelist[teamnumber];
  Write(‘Choose the Visiting team by number and hit enter  ‘);
  Readln(teamnumber);
  VisitingTeamAcronym := teamacronym[teamnumber];   


Logged


Hi!

Yeah, that’s the trick – what Jamie said about the last line of code.

In the tradition of the 80s the last three lines of code have to look like this:

  1. writeln (‘Thats all folks ……’);

  2. readln;

  3. end.

Buena note
Winni


Logged


I have the code you show here as my last 3 lines.

What I am referring to is early in a 10,000 line program where I am inputting what teams I want to use for a game.

The first writeln and readln the input number shows up on the screen on the first keystroke.

The second writeln and readlin I have to press the number on the keyboard twice for it to show up on the screen.

Now if I press 1 for team 1 and then hit enter twice then press 2 for team 2.  The 2 does show up on the screen on the first press.

But this code is nowhere near the end of the program.  It is at the very beginning and there are keyboard inputs throughout the entire program. 


Logged


I think I solved it.

If I right click in the upper left corner of the command prompt and select “properties” then “Use Legacy Console” it works properly with my pascal programs.

Thanks everyone for giving me ideas on the fix.


Logged


I spoke too soon.  It still doesn’t work.

I have to type 1 then enter then either enter or type 2 twice…sigh


Logged


I have to type 1 then enter then either enter or type 2 twice…sigh

What you describe sounds like there is an extra (unwanted) “read” somewhere in your code.

Can you reproduce the problem in a short, standalone program ?  If you could post a short program that exhibits the problem, it would be easier to determine the cause.


Logged

FPC v3.0.4 and Lazarus 1.8.2 on Windows 7 SP1 64bit.


complete version:

  1. program numbers;

  2. {$ifdef mswindows}{$apptype console}{$endif}

  3. var

  4.  number,number2:integer;

  5. begin

  6. writeln(‘enter number’);

  7. readln(number);

  8. writeln(‘enter number2’);

  9. readln(number2);

  10. writeln(number);

  11. writeln(number2);

  12. end.

Works (of course…..)….
Note Lazarus is -still – not really friendly with console programs and you should never (almost never) use such code in a GUI app if that is your confusion.

« Last Edit: November 05, 2019, 07:17:17 am by Thaddy »


Logged

I actually get compliments for being rude… (well, Dutch, but that is the same)


Thanks!

When I run your program it works!

Now I have to figure out why mine doesn’t.

Maybe its the top line:  {$ifdef mswindows}{$apptype console}{$endif}


Logged


complete version:

  1. program numbers;

  2. {$ifdef mswindows}{$apptype console}{$endif}

  3. var

  4.  number,number2:integer;

  5. begin

  6. writeln(‘enter number’);

  7. readln(number);

  8. writeln(‘enter number2’);

  9. readln(number2);

  10. writeln(number);

  11. writeln(number2);

  12. end.

Works (of course…..)….
Note Lazarus is -still – not really friendly with console programs and you should never (almost never) use such code in a GUI app if that is your confusion.

Is anyone able to look at my code and find the error for a small paypal donation?


Logged


Yes debugging is hard, but is something you must learn to do. Try adding extra writeln in your code to see where it fails.
Maybe you’re using just write instead of writeln?


Logged


When I debug and step into it line by line it works fine.

When I take the debug step by step out, it does not work and I have to type the number twice.

I’ve used pascal since 1988 and have never seen anything like this.


Logged


Вот ещё довод в пользу решения этой проблемы.

source.pas (https://ideone.com/itdAqx):

var
  k: longint;
begin
  readln(k);
  writeln(2*k);
end.

Запускаем с перенаправлением ввода-вывода:

source.exe <input.txt >output.txt

Если в файле input.txt было только число без следующего за ним перевода строки, то программа, скомпилированная Pascal ABC, зависнет навечно, а при компиляции через Turbo или Free Pascal – завершится успешным выводом в output.txt правильного ответа.

Это неожиданное отличие в поведении Pascal ABC сильно затрудняет автоматизированное тестирование написанных на нём решений.
Например, мы недавно добавили поддержку компилятора Pascal ABC на образовательном портале http://dl.gsu.by, но оказалось, что теперь в некоторых задачах не проходят по времени авторские решения.
В таких случаях помогает вручную добавить недостающие переводы строки в конце проблемных тестов. Но вручную так мигрировать множество задач слишком затратно, а автоматизированно опасно, т.к. в некоторых случаях с нечисловым вводом лишний перевод строки в тестах может всё поломать.

Надеюсь, проблему удастся разрешить внутри readln в Pascal ABC, приведя её в соответствие с остальными реализациями Паскаля.
Необходимо трактовать EOF точно так же как и EOL.

Я использую переменную: a: string. Для того чтобы не закрывалась CMD и пользователь успел разглядеть результат: read (a).

Почему это помогает в других проектах, а именно в этом не помогает?

var god, rost: integer; a: string;

begin 
    Write('Ваш рост (в см): '); // Получаем данные в переменную rost 
    Read(rost);

    Write('Ваш возраст : '); // Получаем данные в переменную god
    Read(god);
    Writeln('');

    begin

        if (rost > 130 ) then
            Writeln('Ваш рост - ', rost)
        else 
            Writeln('Ошибка ввода: Минимальный вводимый рост 130 см.');

        if (god >= 12 ) then
            Writeln('Вам ', god, ' лет' )
        else
            Writeln('Ошибка ввода: Минимальный вводимый возраст 12 лет');
    end;

    Writeln('Ваш идеальный вес: ', rost - 110 );

    read (a)
end.

var
  god, rost: integer;
  a: string;


begin
  Write('Ваш рост (в см): ');                                        // Получаем данные в переменную   rost
  Read(rost);


  Write('Ваш возраст : ');                                           // Получаем данные в переменную   god  
  Read(god);

  Writeln('');





 begin


    if (rost > 130 ) then

      Writeln('Ваш рост - ', rost)






    else 

      Writeln('Ошибка ввода: Минимальный вводимый рост 130 см.');



    if (god >= 12 ) then

      Writeln('Вам ', god, ' лет' )



    else

      Writeln('Ошибка ввода: Минимальный вводимый возраст 12 лет');


   end;



  Writeln('Ваш идеальный вес: ', rost - 110 );

  read (a)


end.

Добавить комментарий