Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 26.12.2010, 20:40   #1 (permalink)
MrSTEP
一步一步地会到目的
 
Аватар для MrSTEP
 
Регистрация: 09.05.2009
Адрес: Черноземье
Сообщений: 10,939
Записей в дневнике: 10
Сказал(а) спасибо: 140
Поблагодарили 80 раз(а) в 33 сообщениях
Репутация: 28362
По умолчанию Паскаль: сравнение версий, глюки и т.п.

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

Старый 26.12.2010, 20:40
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Эти темы сильно схожи с вашей, рекомендую пролистать

Сравнение сборок
Глюки игр в Windows7
Турбо Паскаль или Фри Паскаль. Задание по теме Типизированный файл
Глюки в играх

Старый 26.12.2010, 20:44   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от MrSTEP Посмотреть сообщение
Делали мы на практике какую-то программулину несложную, шло все не то, что бы легко, но и без особых сложностей. Проверяем ответ - моя писанина выводит 4, у старосты с тем же тестом - 0. Внимательно сравниваем, ничего не поймем - все одно. Уже и руководитель посмотрел - диву дался, на ровном месте обнуляет переменную и все.. Дали мне задание разобраться, хоть кровь из носу. Сажусь, открываю два окна, форматирую все под себя, даже переменные по-своему переименовал. И тут замечаю, что типы целый и вещественный описаны у нас в разном порядке. Меняю, тестирую.. Толи лыжи не едут, толи я чего-то не понимаю - прога выдает правильный ответ. Меняю местами типы в своем коде - ответ неправильный. В общем, от порядка описания типов зависел результат. До сих пор понять этого не можем. Если получится, найду на днях это чудо, покажу.
Да, интересно бы взглянуть.
P.S. А со строками - если напорюсь, тоже напишу.
Vladimir_S вне форума   Ответить с цитированием
Старый 26.12.2010, 21:40   #3 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Насчет строк.
Тонкость состоит в том, что строка, хоть формально и эквивалентна массиву символов, да не совсем. Строку мало объявить, нужно ее еще и в некотором роде инициализировать. Поясню на примере.
Допустим, я хочу получить строку, содержащую все строчные латинские буквы в алфавитном порядке, и вывести эту строку на экран. Так вот, такая программа не пойдет:
Код:
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.
Vladimir_S вне форума   Ответить с цитированием
Старый 26.12.2010, 23:32   #4 (permalink)
MrSTEP
一步一步地会到目的
 
Аватар для MrSTEP
 
Регистрация: 09.05.2009
Адрес: Черноземье
Сообщений: 10,939
Записей в дневнике: 10
Сказал(а) спасибо: 140
Поблагодарили 80 раз(а) в 33 сообщениях
Репутация: 28362
По умолчанию

Чудеса, да и только
MrSTEP вне форума   Ответить с цитированием
Старый 28.12.2010, 12:58   #5 (permalink)
AlexZir
support
 
Аватар для AlexZir
 
Регистрация: 19.08.2007
Адрес: Зея
Сообщений: 15,797
Записей в дневнике: 71
Сказал(а) спасибо: 166
Поблагодарили 203 раз(а) в 86 сообщениях
Репутация: 75760
По умолчанию

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

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 04.01.2011, 21:40   #6 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Обсуждается программа "Электронные часы":
Код:
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. А есть ли там возможность считывания системного времени, и если есть, то как?
Vladimir_S вне форума   Ответить с цитированием
Старый 04.01.2011, 22:03   #7 (permalink)
MrSTEP
一步一步地会到目的
 
Аватар для MrSTEP
 
Регистрация: 09.05.2009
Адрес: Черноземье
Сообщений: 10,939
Записей в дневнике: 10
Сказал(а) спасибо: 140
Поблагодарили 80 раз(а) в 33 сообщениях
Репутация: 28362
По умолчанию

Не знаю про абс паскаль. Нас ему не учили, но мы на своем опыте убедились в его ущербности. Вам обязательно нужен только АВС?
MrSTEP вне форума   Ответить с цитированием
Старый 04.01.2011, 22:13   #8 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от MrSTEP Посмотреть сообщение
Не знаю про абс паскаль. Нас ему не учили, но мы на своем опыте убедились в его ущербности. Вам обязательно нужен только АВС?
Да не мне - топикстартеру!
Название: offtopic.gif
Просмотров: 1282

Размер: 925 байтПо поводу ABC, хоть в глаза его не видел, но по тому судя, что о нем читал - полностью согласен с оценкой! Какой-то невразумительный гибрид, ни с чем толком не совместимый. Зачем-то графика туда ущербно-дельфийская всунута, модуль DOS не поддерживается и вообще.
Vladimir_S вне форума   Ответить с цитированием
Старый 04.01.2011, 22:19   #9 (permalink)
Stubbs
Member
 
Регистрация: 14.06.2010
Сообщений: 911
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 353
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Коллеги-паскалисты, выручайте!
Оказывается (а я и не знал), 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.

Честно говорю - программа не моя. Но как видно там есть еще секундомер с начала работы программы.
Stubbs вне форума   Ответить с цитированием
Старый 04.01.2011, 22:26   #10 (permalink)
MrSTEP
一步一步地会到目的
 
Аватар для MrSTEP
 
Регистрация: 09.05.2009
Адрес: Черноземье
Сообщений: 10,939
Записей в дневнике: 10
Сказал(а) спасибо: 140
Поблагодарили 80 раз(а) в 33 сообщениях
Репутация: 28362
По умолчанию

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

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.