Forum > Russian

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

<< < (3/6) > >>

skalogryz:

--- Quote from: julkas on August 12, 2019, 05:38:20 pm ---
--- Quote --- (а ещё раньше read умел читать в PChar, но функционал запретили)
--- End quote ---
@skalogryz   Причина известна?

--- End quote ---
конечно. у PChar невозможно проверить границы памяти

https://www.freepascal.org/docs-html/current/rtl/system/read.html

--- Quote ---In earlier versions of FPC, it was also allowed to read Pchar null-terminated strings, but this has been removed, since there is no buffer checking possible.
--- End quote ---

devisa_san:

--- Quote from: skalogryz on August 12, 2019, 05:27:18 pm ---проблема в следующем:
Read() не очищает символы переноса строки в INPUT буфере.

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

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

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

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

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

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

--- End quote ---

Благодарю за развёрнутый ответ! Теперь всё на свои места встало. Но тогда у меня ещё один вопрос, а зачем Read() реализован так? Это же вот такие странные ситуации вызывает и, получается, делает невозможным ввод строк при помощи этого оператора.
Например в нижеприведённом коде мы сможем ввести только одну строку a. b окажется пустой.

program Project1;
var a,b:string;
begin
  read(a);
  read(b);
  writeln(a);
  writeln(b);
  readln;
  readln;
end.

skalogryz:

--- Quote from: devisa_san on August 12, 2019, 07:10:45 pm ---Благодарю за развёрнутый ответ! Теперь всё на свои места встало. Но тогда у меня ещё один вопрос, а зачем Read() реализован так? Это же вот такие странные ситуации вызывает и, получается, делает невозможным ввод строк при помощи этого оператора.

--- End quote ---
потому что Read() и Readln() был сделан для чтения текстовых файлов (где символы переноса строки имеют свой смысл).
Консоль в данном случае рассматривается только как частный случай файлов.

Если использовать read() для консоли, то правильнее исползовать именно readln(), а не read().
Потому что readln() обрабатывает входную строку целиком.

Можно добавить, что именно N-IDE работает неправильно ;)

а зачем в коде:

--- 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";}};} ---readln;readln;readln;????
почему их именно 3?

devisa_san:

--- Quote from: skalogryz on August 12, 2019, 07:49:03 pm ---
а зачем в коде:

--- 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";}};} ---readln;readln;readln;????
почему их именно 3?

--- End quote ---

Если оставить хотя бы два readln, то в исходной версии кода программа сразу по нажатии на enter на этапе ввода операции завершиться.

В исправленном коде с read заменёнными на readln хватает и одного readln, чтобы она не завершалась сразу по вводу операции.

Но вообще помимо вопроса по данному конкретному примеру у меня есть вопросы по другим случаям. Возможно ли их тут озвучить или надо новые темы создавать?  В общем то они все связаны с тем, что код выполняется не так как ожидалось.

Один всё таки озвучу. Например буквально на днях в проекте создавал класс который включал в себя массив записей. В записях планировал создать два поля типа boolean, последовательность действий была такая - сначала описал только одно поле с данным типом, проверил - всё работало, как только добавил второе поле с таким же типом, программа работать перестала. Убирал второе поле - работало, добавлял - переставало. Сам код не сохранился, так как я решил по другому действовать, а вот пример объявления остался (соответственно в полях StatData были объявлены поля типа boolean):

type StatData = record
     date:TDateTime;
     input:integer;
     output:integer;
     end;

type TStatistic = class
     SData:array of StatData;
     procedure StatDataFloat(firstdate,lastdate:TDateTime;Method:integer;UseCol:boolean);
     procedure StatDataToStringGrid(var StringGrid:TstringGrid);
     procedure StringGridAutoSize(Var StringGrid:TstringGrid);
     procedure StatDataToTabel(var tab:TTabel);
     procedure FinanceStatistic(firstdate,lastdate:TDateTime;Method:integer;UseCol:boolean);
end; 

skalogryz:

--- Quote from: devisa_san on August 14, 2019, 03:38:02 pm ---Возможно ли их тут озвучить или надо новые темы создавать? 

--- End quote ---
конечно, можно здесь...


--- Quote from: devisa_san on August 14, 2019, 03:38:02 pm ---Один всё таки озвучу. Например буквально на днях в проекте создавал класс который включал в себя массив записей. В записях планировал создать два поля типа boolean, последовательность действий была такая - сначала описал только одно поле с данным типом, проверил - всё работало, как только добавил второе поле с таким же типом, программа работать перестала. Убирал второе поле - работало, добавлял - переставало.  Сам код не сохранился...
--- End quote ---
я бы предложил реализовать проект ещё раз, и проверить воспроизведётся ошибка или нет.
Без кода, разговор получится на пустом месте.

но я уже вижу тревожные звоночки в виде:

--- 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";}};} ---     procedure StatDataToStringGrid(var StringGrid:TstringGrid);     procedure StringGridAutoSize(Var StringGrid:TstringGrid);     procedure StatDataToTabel(var tab:TTabel);а именно - тревожит наличие "var". Причём, я не думаю, что ошибка была в исползовании "var". Просто само его использование в данным случае излишне. "var" для класса имеет несколько иное значение, чем "var" для record-а.

Navigation

[0] Message Index

[#] Next page

[*] Previous page

Go to full version