Forum > Russian
Неправильно исполняется код
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