Технический форум

Технический форум (http://www.tehnari.ru/)
-   Delphi, Kylix and Pascal (http://www.tehnari.ru/f43/)
-   -   Паскаль: сравнение версий, глюки и т.п. (http://www.tehnari.ru/f43/t43891/)

MrSTEP 26.12.2010 20:40

Паскаль: сравнение версий, глюки и т.п.
 
Делали мы на практике какую-то программулину несложную, шло все не то, что бы легко, но и без особых сложностей. Проверяем ответ - моя писанина выводит 4, у старосты с тем же тестом - 0. Внимательно сравниваем, ничего не поймем - все одно. Уже и руководитель посмотрел - диву дался, на ровном месте обнуляет переменную и все.. Дали мне задание разобраться, хоть кровь из носу. Сажусь, открываю два окна, форматирую все под себя, даже переменные по-своему переименовал. И тут замечаю, что типы целый и вещественный описаны у нас в разном порядке. Меняю, тестирую.. Толи лыжи не едут, толи я чего-то не понимаю - прога выдает правильный ответ. Меняю местами типы в своем коде - ответ неправильный. В общем, от порядка описания типов зависел результат. До сих пор понять этого не можем. Если получится, найду на днях это чудо, покажу.

Vladimir_S 26.12.2010 20:44

Цитата:

Сообщение от MrSTEP (Сообщение 434953)
Делали мы на практике какую-то программулину несложную, шло все не то, что бы легко, но и без особых сложностей. Проверяем ответ - моя писанина выводит 4, у старосты с тем же тестом - 0. Внимательно сравниваем, ничего не поймем - все одно. Уже и руководитель посмотрел - диву дался, на ровном месте обнуляет переменную и все.. Дали мне задание разобраться, хоть кровь из носу. Сажусь, открываю два окна, форматирую все под себя, даже переменные по-своему переименовал. И тут замечаю, что типы целый и вещественный описаны у нас в разном порядке. Меняю, тестирую.. Толи лыжи не едут, толи я чего-то не понимаю - прога выдает правильный ответ. Меняю местами типы в своем коде - ответ неправильный. В общем, от порядка описания типов зависел результат. До сих пор понять этого не можем. Если получится, найду на днях это чудо, покажу.

Да, интересно бы взглянуть.
P.S. А со строками - если напорюсь, тоже напишу.

Vladimir_S 26.12.2010 21:40

Насчет строк.
Тонкость состоит в том, что строка, хоть формально и эквивалентна массиву символов, да не совсем. Строку мало объявить, нужно ее еще и в некотором роде инициализировать. Поясню на примере.
Допустим, я хочу получить строку, содержащую все строчные латинские буквы в алфавитном порядке, и вывести эту строку на экран. Так вот, такая программа не пойдет:
Код:

VAR
 S:String;
 i:Byte;
BEGIN
 for i:=1 to 26 do
  S[i]:=CHR(i+96);
 WriteLn(S);
 ReadLn;
END.

То есть ошибки не выдаст, но и ожидаемого результата - тоже.
А зато такая - пожалуйста:
Код:

VAR
 S:String;
 C:ARRAY[1..26] of Char;
 i:Byte;
BEGIN
 for i:=1 to 26 do
  C[i]:=CHR(i+96);
 S:=C;
 WriteLn(S);
 ReadLn;
END.

Казалось бы, дело в том, что, "не зная" длины строки, транслятор просто не отводит для нее место в памяти. Но дело в том, что даже вариант с объявленной длиной не спасает, т.е. такое решение:
Код:

VAR
 S:String[26];
 i:Byte;
BEGIN
 for i:=1 to 26 do
  S[i]:=CHR(i+96);
 WriteLn(S);
 ReadLn;
END.

тоже оказывается неправильным.
Вот еще пример корректного решения:
Код:

CONST
 G:String='Long ago there were three ';
VAR
 S:String;
 i:Byte;
BEGIN
 S:=G;
 for i:=1 to 26 do
  S[i]:=CHR(i+96);
 WriteLn(S);
 ReadLn;
END.


MrSTEP 26.12.2010 23:32

Чудеса, да и только

AlexZir 28.12.2010 12:58

Если не ошибаюсь, строковые величины определяются как динамические массивы. Из-за разных тонкостей динамического обращения к памяти и возникают такие ситуации.

Vladimir_S 04.01.2011 21:40

Обсуждается программа "Электронные часы":
Код:

Uses Crt,Dos;
VAR
 hour,min,sec_old,sec_new:Word;
 sec100,msec,usec:Word;
BEGIN
 ClrScr;
 GetTime(hour,min,sec_new,sec100);
 Repeat
  Repeat
  sec_old:=sec_new;
  GetTime(hour,min,sec_new,sec100);
  Until sec_old<>sec_new;
  GoToXY(1,1);
  If (min<10) and (sec_new<10) then
  Write(hour:2,':0',min,':0',sec_new)
  else
  If sec_new<10 then
  Write(hour:2,':',min,':0',sec_new)
  else
  If min<10 then
  Write(hour:2,':0',min,':',sec_new)
  else
  Write(hour:2,':',min,':',sec_new);
 Until KeyPressed;
 ReadKey;
END.

Коллеги-паскалисты, выручайте!
Оказывается (а я и не знал), Pascal-ABC не поддерживает модуля DOS и, соответственно, процедуру GetTime. А есть ли там возможность считывания системного времени, и если есть, то как?

MrSTEP 04.01.2011 22:03

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

Vladimir_S 04.01.2011 22:13

Вложений: 1
Цитата:

Сообщение от MrSTEP (Сообщение 439098)
Не знаю про абс паскаль. Нас ему не учили, но мы на своем опыте убедились в его ущербности. Вам обязательно нужен только АВС?

Да не мне - топикстартеру!
Вложение 27436По поводу ABC, хоть в глаза его не видел, но по тому судя, что о нем читал - полностью согласен с оценкой! Какой-то невразумительный гибрид, ни с чем толком не совместимый. Зачем-то графика туда ущербно-дельфийская всунута, модуль DOS не поддерживается и вообще.

Stubbs 04.01.2011 22:19

Цитата:

Сообщение от Vladimir_S (Сообщение 439080)
Коллеги-паскалисты, выручайте!
Оказывается (а я и не знал), Pascal-ABC не поддерживает модуля DOS и, соответственно, процедуру GetTime. А есть ли там возможность считывания системного времени, и если есть, то как?

Процедуры GETTIME нет. Есть модуль Timers.



Можно так сделать:

uses
Utils,Crt;
type
DateTime=record
Day,Month,Year,Hour,Minute,Second,Milliseconds:int eger;
end;
var
time: DateTime; (убрать пробел, с пробелом вылазит смайлик)
begin
HideCursor;
repeat
time:=CurrentDateTime;
write('C начала работы программы прошло: ',Milliseconds div 1000,' сек. Дата: ',time.year,'.',time.month,'.',
time.day,' Время: ',time.hour,':',time.minute,':',time.second,':',ti me.Milliseconds div 100);
GotoXY(1,1)
until
1<0
end.

Честно говорю - программа не моя. Но как видно там есть еще секундомер с начала работы программы.

MrSTEP 04.01.2011 22:26

Да понятно, я к автору темы и обратился :) а вот если перенести файл Dos из простого паскаля в ABC? Володь, прилепи-ка сюда свой, поэкспериментируем :))


Часовой пояс GMT +4, время: 06:13.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.