Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 393

/ вопрос открыт /

Приветствую, уважаемые эксперты!
как сделать так чтобы командная строка в консольном режиме не исчезала сразу, после нажатия Run?

такой код ввел, вроде считает, но не показывает:

Приложение:
  1. program Project1;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6. SysUtils;
  7.  
  8.  
  9. var i: integer;
  10. x: variant;
  11.  
  12. begin
  13. i:= 1;
  14. repeat
  15. begin
  16. Inc(i);
  17. Inc(x, (1/i));
  18. WriteLn(i);
  19. end;
  20. until x > 5;
  21. writeln('i = ', i);
  22. end.


габибыч Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: габибыч (статус: Заблокирован)
Вопрос отправлен: 7 июля 2010, 11:53
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 8; последнее сообщение — 7 июля 2010, 20:26; участников в обсуждении: 5.
AlexMPEI

AlexMPEI (статус: 1-ый класс), 7 июля 2010, 12:15 [#1]:

надо добавить readln - на ней встанешь
габибыч

габибыч (статус: Заблокирован), 7 июля 2010, 12:45 [#2]:

AlexMPEI , спасибо, понял
min@y™

min@y™ (статус: Доктор наук), 7 июля 2010, 12:54 [#3]:

Интересная прога! Особенно радует нецелочисленный инкремент непроинициализированной переменной x: variant. Неужели компилятор пропустил такое безобразие и прога работает?

Вот это номер! Действительно, компилятор пропускает конструкцию Inc(x, (1/i)), если x: variant, но не пропускает, если x: integer.

Как это понимать? В хэлпе про процедуру Inc() чётко написано, что оба параметра должны быть целыми или указателями.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
padonak

padonak (статус: Посетитель), 7 июля 2010, 13:50 [#4]:

min@y™: пропустил... хотя странно...

габибыч, ты со своим примером революцию сделать хочешь? )))
Паровоз

Паровоз (статус: 10-ый класс), 7 июля 2010, 13:54 [#5]:

"Как это понимать?"
Это потому, что x - variant. Код не только пропускается через компилятор, но и выполняется:
var
  x: variant;
begin
  x:=3;
  Inc(x, 1.5);
  WriteLn('x = ', x);//x=4.5
  Readln;
end.
Думаю, что такая "недокументированная возможность" является багом компилятора.
min@y™

min@y™ (статус: Доктор наук), 7 июля 2010, 13:59 [#6]:

Я так покумекал немного и сделал кой-какие выводы.
Видимо, поскольку x: variant, а процедура Inc() встроена в компилятор, компилятор решает работать с вариантной переменной в общем виде, т.е. раскладывает вызов Inc(x, (1/i)) на выражение x:= x + 1 / i, а т.к. результат должен получиться вещественным, преобразовывает x к типу Extended (или Double). Иной причины я не вижу, но о такой особенности не знал.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Паровоз

Паровоз (статус: 10-ый класс), 7 июля 2010, 14:46 [#7]:

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

габибыч (статус: Заблокирован), 7 июля 2010, 20:26 [#8]:

Inc() не принимает дробную часть, делаю из енго целую,тем более, а Variant на ура поставил - получилось..)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:27
Выполнено за 0.02 сек.