Forum > Russian

Неправильно исполняется код

<< < (2/6) > >>

julkas:
Я думаю, что если начнешь решать online задачки (если уже не начал), тебе будет легче.
Ты из России? Я так понял там популярен PascalABC. Это правда?

devisa_san:
Так мне не надо online задачки решать. Я в pascal-delphi-lazarus программирую с 2002 года, я школьнику преподаю и вот такое поведение lazarus для меня оказалось неожиданным. Хотелось бы причину понять. Независимо от того, что использовать read или readln в данном коде, программа себя не должна была вести так, как вела. Я из России. PascalABC использовать не хочу, так как планирую школьника обучать в том числе и программированию приложений с GUI. Повторюсь - мне причину понять интересно, так как код так работать не должен был и другая среда разработки это подтверждает.

skalogryz:

--- Quote from: devisa_san on August 12, 2019, 03:35:54 pm ---Я в pascal-delphi-lazarus программирую с 2002 года, я школьнику преподаю и вот такое поведение lazarus для меня оказалось неожиданным. Хотелось бы причину понять.
--- End quote ---
тонкости реализации read.

вот такой код:

--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---program project1; uses  SysUtils, Classes; var  a,b: double;  c:  string;begin  try    read(a);    read(b);    read(c);    writeln(c);    writeln(byte(c[1]));    readln;  except    on e: exception do      writeln(e.message);  end;end. падает с AccessViolation.

ВНИМАНИЕ! в Delphi 10.3 он точно так же падает с Access Violation!

upd а падает он с AccessViolation потому что я сам дурак.
в данном примере Read(c) возвращает пустую строку. Причём оставшиеся в символы переноса, пудут прочитаны в следующем readln();
а тк я без проверки обращаюсь к c[1] - происходит тот самый AccessViolation


--- Quote from: devisa_san on August 12, 2019, 03:35:54 pm ---Независимо от того, что использовать read или readln в данном коде, программа себя не должна была вести так, как вела.

--- End quote ---
это вопрос к реализации процедуры read().
догадываюсь, что read просто пытается прочитать всё, с командной строки (игнорируя знак переноса), и в итоге, читает не то и ни туда.
по-этому использовать readln() безопаснее.
(а ещё раньше read умел читать в PChar, но функционал запретили)


--- Quote from: devisa_san on August 12, 2019, 03:35:54 pm ---... и другая среда разработки это подтверждает.

--- End quote ---
не думаю, что N-IDE будет авторитетом для FPC.
Т.к. N-IDE это интерпретатор, и у него вполне могут быть свои особенности.

skalogryz:
проблема в следующем:
Read() не очищает символы переноса строки в INPUT буфере.

по-этому каждый следующий read() вынужден сам разбираться с ними.

когда ты делаешь read(a) (или read(b)) где "a" и "b" double; то FPC игнорирует пустые строки, и продолжает ожидать ввод числа. (ты можешь это проверить сам. просто запусти программу, не вводя число, нажми "enter". Программа не будет падать, и будет настойчиво продолжать ввода числа).

НО, read(c) рабоатет подругому. Увидев символ конца строки (который остался ещё от ввода числа "b"), он код принимает решение о том, что ввели пустую строку, и тут же её возвращает.

В твоём коде, это приводит к выводу "Wrong" (потому пустая строка, не являеится символом операции).

т.е. нужно использовать именно ReadLn(), чтобы после прочтения значения, символы переноста строки подчищались;
Очевидно, что в N-IDE такими вещами не заморачивались. (надо думать, что у них своя обработка "командной строки", где нет симоволов переноса строк)

FPC работает правильно.

julkas:

--- Quote --- (а ещё раньше read умел читать в PChar, но функционал запретили)
--- End quote ---
@skalogryz   Причина известна?
Я вообще новичок в FPC и просто исходил из опыта чтения входных данных на разных онлайн ...

Navigation

[0] Message Index

[#] Next page

[*] Previous page

Go to full version