Автор |
Сообщение |
14.09.2011 14:39:00
Тема: Различия между Turbo Pascal, FP Win32, Delphi 7
|
Тимофей Грибанов
Темы: 1
Сообщений: 6
Мой профиль
|
Курс "Методы алгоритмизации"
Олимпиады по информатике\Реализация\Строки\10_Gg - "Аббревиатура" 100111 Вераксич, Коржик, Тимошков
Моё решение проходит на Delphi 7,но не проходит на FP Win32.
var
p : array [1..1000] of string;
d,n,i : longint;
s,z,f : string;
begin
readln(s);
s:=s+' ';
d:=length(s);
z:='';
n:=0;
for i:=1 to d do
if s[i]<>' '
then z:=z+s[i]
else begin
inc(n);
p[n]:=z;
z:='';
end;
f:='';
for i:=1 to n do f:=f+Upcase(p[i,1]);
writeln(f);
end.
|
22.09.2011 22:03:07
Тема: Re:Различия между Turbo Pascal, FP Win32, Delphi 7.
|
Вадим Грибанов
Темы: 4
Сообщений: 23
Мой профиль
|
В Delphi string по умолчанию ansistring, а в freepascal нет.
______________________
Never say never.
|
01.10.2011 13:27:25
Тема: Re:Различия между Turbo Pascal, FP Win32, Delphi 7.
|
Терентий Гацуков
Темы: 1
Сообщений: 43
Мой профиль
|
USACO 2004-2011\Bronze\Одномерный массив\08_NovB - "Switching Lights" 78207 LongFan, 2008
Моё решение не проходит на Turbo Pascal но проходит на FP Win32 и Delphi 7.
Оно проходит на Turbo Pascal если readln заменить на read.
{$r+}
var
A : array [1..1000] of longint;
n,m,c,b,r,k,i,j : longint;
begin
assign(input,'swtch.in'); reset(input);
assign(output,'swtch.out'); rewrite(output);
readln(n,m);
for i:=1 to n do a[i]:=0;
for i:=1 to m do
begin
readln(c,r,b);
if c=0
then for j:=r to b do a[j]:=1-a[j]
else begin
k:=0;
for j:=r to b do if a[j]=1 then k:=k+1;
writeln(k);
end;
end;
close(input); close(output);
end.
|
01.10.2011 13:29:10
Тема: Re:Различия между Turbo Pascal, FP Win32, Delphi 7.
|
Михаил Долинский
Темы: 1984
Сообщений: 47255
Мой профиль
|
У этой задачи тесты из под Linux (между строками только код 0A, а не 0D 0A, как принято в Windows )
|
25.10.2011 09:58:36
Тема: Re:Различия между Turbo Pascal, FP Win32, Delphi 7.
|
Терентий Гацуков
Темы: 1
Сообщений: 43
Мой профиль
|
Олимпиады по информатике\Реализация\Строки\10_BY - "Бактериальное родство" 98545
Моё решение проходит на Turbo Pascal, но непроходит на FP Win32(выдаёт "ошибка копиляции"):
var
s1,s2:string;
i,n,k,max : longint;
procedure Sdvig(s1:string; var k,i:longint);
var
y,d : longint;
f : string;
begin
k:=0;
d:=length(s1);
f:=copy(s1,i+1,d-i+1)+copy(s1,1,i);
for y:=1 to n do
if f[y]=s2[y] then inc(k);
end;
begin
assign(input,'input.txt'); reset(input);
assign(output,'output.txt'); rewrite(output);
readln(n); readln(s1); readln(s2);
for i:=1 to n do
begin
Sdvig(s1,k,i);
if k>max then max:=k;
end;
writeln(max);
close(input); close(output);
end.
Как оказалось ошибка была в этой строке:
procedure Sdvig(s1:string; var k,i:longint);
При такой записи переменная может быть изменена в procedure Sdvig;
FP win32 запрещает это, поскольку переменная i является переменной цикла в главной программе.
Исправленное решение, которое прошло в TP и FP Win32:
var
s1,s2:string;
i,n,k,max : longint;
procedure Sdvig(s1:string; i:longint; var k:longint);
var
y,d : longint;
f : string;
begin
k:=0;
d:=length(s1);
f:=copy(s1,i+1,d-i+1)+copy(s1,1,i);
for y:=1 to n do
if f[y]=s2[y] then inc(k);
end;
begin
assign(input,'input.txt'); reset(input);
assign(output,'output.txt'); rewrite(output);
readln(n); readln(s1); readln(s2);
for i:=1 to n do
begin
Sdvig(s1,i,k);
if k>max then max:=k;
end;
writeln(max);
close(input); close(output);
end.
|
26.11.2011 22:43:27
Тема: Re:Различия между Turbo Pascal, FP Win32, Delphi 7.
|
Александр Соловьёв
Темы: 7
Сообщений: 29
Мой профиль
|
Гомельская обл. \1998\День 1\C - "Такси"
Выложу сразу исходник.
var
a,b,ans : Array [1..100] of longint;
st : array [1..100] of longint;
n,i,sum,stn,kol,min : longint;
Procedure rec(k : longint);
var ak,i : longint;
begin
ak:=b[k];
if sum+ak>n then exit;
inc(sum,ak);
inc(st[ak]);
if sum=n then
begin
kol:=0;
for i:=1 to 10 do kol:=kol+a[i]*st[i];
if kol<min then
begin
min:=kol;
for i:=1 to 10 do ans[i]:=st[i];
end;
end;
rec(k);
for i:=k+1 to 10 do rec(i);
dec(sum,ak);
dec(st[ak]);
end;
begin
assign(input,'taxi.inp'); reset(input);
assign(output,'output.txt'); rewrite(output);
min:=maxlongint;
for i:=1 to 10 do read(a[i]);
read(n);
sum:=0;
for i:=1 to 10 do b[i]:=i;
for i:=1 to 10 do rec(i);
for i:=1 to 10 do
begin
while ans[i]>0 do
begin
writeln(i,' ',a[i]);
dec(ans[i]);
end;
end;
writeln(min);
close(input); close(output);
end.
Вот мои посылки на разные компиляторы:
C. Такси 100 / 100 Все тесты успешно пройдены 1С.pas DelTA3 at NewIT Delphi 7
26.11 20:20 C. Такси 0 / 100 ошибка компиляции 1С.pas DelTA3 at NewIT FP Win32 2.0.2
26.11 20:19 C. Такси 100 / 100 Все тесты успешно пройдены 1С.pas DelTA3 at NewIT FP go32v2 v1.0.10
26.11 20:18 C. Такси 0 / 100 Ошибка чекера на 5-ом тесте. Причина выхода: Runtime Error 201:Range check error 1С.pas DelTA3 at DLServer FP Win32 v2.2.0
C. Такси 100 / 100 Все тесты успешно пройдены 1C.pas DelTA3 at NewIT Turbo Pascal 7.0
Хотелось бы разобраться, почему один и тот же код на одних компиляторах проходит, а на других слетает.
(Конкретно интересует компилятор FP Win32 v2.2.0 там где ошибка чекера)
|
02.12.2011 09:26:09
Тема: Re:Различия между Turbo Pascal, FP Win32, Delphi 7.
|
Михаил Долинский
Темы: 1984
Сообщений: 47255
Мой профиль
|
Тимофей Дубовик:
интересную вещь наблюдал сегодня: отправляю код, написанный в дельфи при выбранном компиляторе дельфи - выдаёт либо "неверный ответ" либо "access violation". копирую ТОТ ЖЕ САМЫЙ код в блокнот, сохраняю с разрешением *.pas и отправляю, выбрав компилятор fpc. и вуаля - "все тесты пройдены"
и такое случалось на нескольки задачах. я сомневаюсь, что дело в выборе компилятора. в чём проблема?
Михаил Долинский:
Именно в компиляторе
Я говорил об этом на лекциях:
Turbo Pascal, Free Pascal, Delphi - это разные программы, написанные разными командами программистов в разное время.
Неудивительно, что они работают ПО-РАЗНОМУ.
У нас даже есть специальная тема, где мы описываем эти "разности":
Различия между Turbo Pascal, FP Win32, Delphi 7
Предлагаю тебе почитать ее, а затем выложить там же ссылку на задачу, которую ты решал, свой исходник и сообщение о том, где прошло, а где - нет, и что выдало.
А потом "всем миром" будем искать очередное отличие в их работе.
|
02.12.2011 09:27:06
Тема: Re:Различия между Turbo Pascal, FP Win32, Delphi 7.
|
Михаил Долинский
Темы: 1984
Сообщений: 47255
Мой профиль
|
-----Original Message-----
From: User 126138 [mailto:webmaster*gsu.by]
Sent: Thursday, December 01, 2011 11:22 PM
To: Michael Dolinsky
Subject: Consultation on course 15
Помогите, пожалуйста.
Почему-то когда отправляю код на Delphi (Dpr) не работает,(. Решение вызвало ошибку ACCESS_VIOLATION). пишу ту же программу на Паскале, все четко срабатывает.
-- Спрашивает 126138 [Зданович Егор]
-- Курс 'Методы алгоритмизации'
Distance Learning Belarus - http://dl.gsu.by - 01.12.2011 23:21
|
17.01.2012 17:06:50
Тема: Re:Различия между Turbo Pascal, FP Win32, Delphi 7.
|
Коробейникова Евгения
Темы: 4
Сообщений: 32
Мой профиль
|
В качестве поучительной истории для тех кто этого не знает.Cегодня Богдан Тихонов попросил меня посмотреть его задачу N3 с областной олимпиады. Он ее писал на Delphi и утверждал, что Delphi на первый тест ему выдавал правильный ответ, а в результате тестирования с компилятором FPC 0 баллов. Я взяла его решение и тесты. Действительно Delphi выдает на первых трех тестах( дальнейшие тесты не верный ответ) ответ правильный, а FPC нет. Стала смотреть программу.
Вот кусок кода.
while l<=k do
begin
for i:=x to x+d-1 do
sum[l]:=sum[l]+a[i];
inc(l);
inc(x,d);
end;
if i<=n then
for l:=i to n do
sum[k]:=sum[k]+a[l];
Так вот во FP после выполнения цикла for параметр цикла равен последнему значению, а в Delphi последнее значение +1.
Следовательно в FP если x+d-1 равно n, то этот if выполнится, а в Delphi нет.
if i<=n then
for l:=i to n do
sum[k]:=sum[k]+a[l];
|
23.01.2012 10:52:29
Тема: Re:Различия между Turbo Pascal, FP Win32, Delphi 7.
|
Михаил Долинский
Темы: 1984
Сообщений: 47255
Мой профиль
|
Баг с int64 и Q+ в Delphi 7
Автор сообщения - Quercitron (Codeforces):
Долго пытался найти, почему мое решение получает Runtime Error. Было установлено, что программа падает во время подсчета "векторного произведения" по трем точкам, текст ошибки:
"Project E.exe raised exception class EIntOverflow with message 'Integer overflow'."
Координаты точек не превосходили по модулю 10^9, значит координаты векторов не больше 2*10^9, и получаемый результат больше 8*10^18 никак не мог быть. А int64 это примерно до 9*10^18, и вроде все должно замечательно работать.
Тогда я поймал значения, на которых программа падала в этом месте. И получилась весьма странная вещь, суть которой сводится к следующему: если запустить такую программу:
{$Q+}
uses SysUtils;
var
a, b, c: int64;
procedure bug;
begin
a := -1834569418;
b := -330651027;
c := a * b;
end;
Begin
bug;
End.
то при умножении a на b случается описанная выше ошибка.
Но если выключить директиву проверки на переполнение целочисленных операций Q: {Q-} то все будет выполняться без ошибок. Так же было установлено, что даже с включенной Q+, если производить умножение в основном теле программы (т.е. между Begin и End.), то все будет нормально, пока включен оптимизатор (O+), а если его выключить, то и там падает... При этом числа не обязательно только такие, их можно менять в довольно большом диапазоне (+/- 5-10 %).
Короче, полная хрень какая-то.
Я хочу узнать, может кто-нибудь сталкивался с похожими вещами или просто может объяснить, почему такое происходит и как с этим бороться.
Заранее спасибо.
ИМХО, int64 в Delphi - зло, страшнее ядерной войны.
Работает долго, иногда вот с такими ошибками...
Я тоже сталкивался с этим в какой-то геометрии. Это вроде-бы из-за того, что delphi (не обязательно 7) неправильно проверяет на owerflow у int64. После этого окончательно перешел на fpc. В нем подобных багов я не замечал.
|
26.01.2012 15:29:02
Тема: Re:Различия между Turbo Pascal, FP Win32, Delphi 7.
|
Михаил Долинский
Темы: 1984
Сообщений: 47255
Мой профиль
|
Баг возвращения значения функции
Anatoliy Prisyazhnyuk:
Это не баг в компиляторе - это специфика FreePascal:
Функция
function less(a1, a2, b1, b2: string): boolean;
begin
result:= false;
if a1 < b1 then result:= true else
if a1 > b1 then result:= false else
if a1 = b1 then begin
if a2 <= b2 then result:= true else result:= false;
end;
end;
применительно к реализации на FPC должна выглядеть так:
function less(a1, a2, b1, b2: string): boolean;
begin
less := false;
if a1 < b1 then less:= true else
if a1 > b1 then less:= false else
if a1 = b1 then begin
if a2 <= b2 then less:= true else less:= false;
end;
end; Т.е. во фришнике не используется для возврата значения функции переменная result - в этом одно из отличий FPC от Delphi.
|
21.03.2012 08:46:03
Тема: Re:Различия между Turbo Pascal, FP Win32, Delphi 7.
|
Михаил Долинский
Темы: 1984
Сообщений: 47255
Мой профиль
|
Задача Гомельская гор.\2004\Младшая группа\6 - "Поле" 24154 Короткевич Геннадий
Решение (Сукач Сергей)
var
n,m,s : extended;
begin
read(n,m);
s:=(1+n)*(1+m)*n*m/4;
writeln(s:20:0);
end. Дает различные результаты в Turbo Pascal и Free Pascal
Рабочая версия
- в TP (при добавлении директив {$e+,n+}) идет программная реализация обработки вещественных чисел - ТОЧНАЯ
- в FP win 2.2.0 - идет аппаратная реализация и она неточна (за счет ошибок округления?)
Тест 19
Ввод
34282 19448
Вывод программы Сергея в FPwin 2.2.0
111136624006178630
Вывод программы Сергея в TP(при добавлении директив {$e+,n+})
и авторский ответ, полученный решением приведенным ниже, тоже в TP
111136624006178628
{$N+}
program sol;
var
n,m: comp;
begin
read(n,m);
writeln((n*(n+1)/2)*(m*(m+1)/2):0:0);
end.
Авторское решение (использующее тип comp, а не extended) при отсылке на FP Win,
как ни странно, также дает ДРУГОЙ ответ
111136624006179000
UPD. Получается,
наиболее точные (правильные) ответы у TP типы extended и comp.
средний по точности FP Win тип extended (10 байтов на число)
худший по точности FP Win тип comp (8 байтов на число).
UPD2: Правильное решение для FP Win
var
n,m,s : qword;
begin
read(n,m);
s:=(1+n)*(1+m)*n*m div 4;
writeln(s);
end.
|
30.03.2012 13:21:10
Тема: Re:Различия между Turbo Pascal, FP Win32, Delphi 7.
|
Терентий Гацуков
Темы: 1
Сообщений: 43
Мой профиль
|
Олимпиады по информатике\Реализация\Строки\09_COCI5 - "LJESNJAK" 92324
Моё решение проходит на Turbo Pascal,а на Delphi 7 и FP Win32 v2.2.0 не проходит!
Вот мой код.
var
s,p,o,k,l,h,g,f : string;
Kx : longint;
begin
readln(s);
Kx:=0;
while pos('c=',s)<>0 do begin delete(s,pos('c=',s),2); inc(Kx,1); end;
while pos('c-',s)<>0 do begin delete(s,pos('c-',s),2); inc(Kx,1); end;
while pos('dz=',s)<>0 do begin delete(s,pos('dz=',s)-1,3); inc(Kx,1); end;
while pos('d-',s)<>0 do begin delete(s,pos('d-',s),2); inc(Kx,1); end;
while pos('lj',s)<>0 do begin delete(s,pos('lj',s),2); inc(Kx,1); end;
while pos('nj',s)<>0 do begin delete(s,pos('nj',s),2); inc(Kx,1); end;
while pos('s=',s)<>0 do begin delete(s,pos('s=',s),2); inc(Kx,1); end;
while pos('z=',s)<>0 do begin delete(s,pos('z=',s),2); inc(Kx,1); end;
writeln(Kx+(length(s)));
end.
30.3 13:03 09_COCI5. LJESNJAK 18 / 30 не пройден 4-й тест(снято по времени (>2 сек)) PASCAL.PAS DelTA3 at Nit4 FP Win32 v2.2.0
30.3 13:01 09_COCI5. LJESNJAK 18 / 30 не пройден 4-й тест(снято по времени (>2 сек)) PASCAL.PAS DelTA3 at Nit4 Delphi 7
30.3 13:01 09_COCI5. LJESNJAK 30 / 30 Все тесты успешно пройдены PASCAL.PAS DelTA3 at Nit4 Turbo Pascal 7.0
Почему одно и тоже решение проходит на Turbo Pascal, а на FP Win32 v2.2.0 и Delphi 7 нет??
(Конкретно интересует компилятор FP Win32 v2.2.0)
А этот код проходит на всех 3 компиляторах.
var
w,q : string;
s,p : string;
d,i : longint;
Kx : longint;
begin
readln(s);
i:=1; d:=length(s); p:='';
while (i<=d) do
begin
q:=copy(s,i,2);
w:=copy(s,i,3);
if w='dz=' then begin inc(i,3); inc(Kx); end else
if q='c=' then begin inc(i,2);inc(Kx);end else
if q='c-' then begin inc(i,2);inc(Kx);end else
if q='d-' then begin inc(i,2);inc(Kx);end else
if q='lj' then begin inc(i,2);inc(Kx);end else
if q='nj' then begin inc(i,2);inc(Kx);end else
if q='s=' then begin inc(i,2);inc(Kx);end else
if q='z=' then begin inc(i,2);inc(Kx);end else
begin inc(kX); inc(i); end;
end;
writeln(Kx);
end.
|
30.03.2012 22:11:11
Тема: Re:Различия между Turbo Pascal, FP Win32, Delphi 7.
|
Виктор Терещук
Темы: 0
Сообщений: 1
Мой профиль
|
Почему одно и тоже решение проходит на Turbo Pascal, а на FP Win32 v2.2.0 и Delphi 7 нет??
(Конкретно интересует компилятор FP Win32 v2.2.0)
Ответ очевиден. Причина в этой строке:
while pos('dz=',s)<>0 do begin delete(s,pos('dz=',s)-1,3); inc(Kx,1); end;
Если 'dz=' находится в начале строки, то никогда не сможет приведенным кодом оттуда удалиться. Странно не то, что этот код не работает на Delphi и Free Pascal, а то, что он работает на Turbo Pascal.
|
11.04.2012 14:55:01
Тема: Re:Различия между Turbo Pascal, FP Win32, Delphi 7.
|
Терентий Гацуков
Темы: 1
Сообщений: 43
Мой профиль
|
Задачи из лекций Долинского М.С.\Лекция 19\Л19_8 - "Симметричное отображение" 639
Моё решение проходит на Tp , а на Fp и Delphi 7 нет!
Вот моё решение.
var
x1,y1,x2,y2,x0,y0,A,B,C,A1,B1,C1 : real;
procedure Per(A,B,C,x,y : real; var A1,B1,C1 : real);
begin
A1:=-B;
B1:=A;
C1:=B*x-A*y;
end;
procedure Tp(A,B,C,A1,B1,C1 : real; var x,y : real);
var
d,dx,dy : real;
begin
C:=-C; C1:=-C1;
d:=A*B1-A1*B;
dx:=C*B1-C1*B;
dy:=A*C1-A1*C;
x:=dx/d;
y:=dy/d;
end;
procedure EndOtr(x1,y1,x0,y0 : real; var x2,y2: real);
begin
x2:=2*x0-x1; y2:=2*y0-y1;
end;
begin
assign(input,'input.txt'); reset(input);
assign(output,'output.txt'); rewrite(output);
readln(x1,y1);
readln(A,B,C);
Per(A,B,C,x1,y1,A1,B1,C1);
Tp(A,B,C,A1,B1,C1,x0,y0);
EndOtr(x1,y1,x0,y0,x2,y2);
writeln(x2:0:2,' ',y2:0:2);
close(input); close(output);
end.
В Tp даёт ответ 0.00 0.00, а в Delphi 7 и Fp 0.00 -0.00
11.4 14:40 Л19_8. Симметричное отображение 66 / 100 не пройден 3-й тест (неверный ответ) PASCAL.PAS DelTA3 at DLServer Delphi 7
11.4 14:33 Л19_8. Симметричное отображение 66 / 100 не пройден 3-й тест (неверный ответ) pascal.pas DelTA3 at DLServer FP Win32 v2.2.0
11.4 14:32 Л19_8. Симметричное отображение 100 / 100 Все тесты успешно пройдены PASCAL.PAS DelTA3 at DLServer Turbo Pascal 7.0
Почему одно и тоже решение проходит на Turbo Pascal, а на FP Win32 v2.2.0 и Delphi 7 нет?
(Конкретно интересует компилятор FP Win32 v2.2.0)
UPD.
var
x1,y1,x2,y2,x0,y0,A,B,C,A1,B1,C1 : real;
procedure Per(A,B,C,x,y : real; var A1,B1,C1 : real);
begin
A1:=-B;
B1:=A;
C1:=B*x-A*y;
end;
procedure Tp(A,B,C,A1,B1,C1 : real; var x,y : real);
var
d,dx,dy : real;
begin
C:=-C; C1:=-C1;
d:=A*B1-A1*B;
dx:=C*B1-C1*B;
dy:=A*C1-A1*C;
x:=dx/d;
y:=dy/d;
end;
procedure EndOtr(x1,y1,x0,y0 : real; var x2,y2: real);
begin
x2:=2*x0-x1; y2:=2*y0-y1;
end;
begin
assign(input,'input.txt'); reset(input);
assign(output,'output.txt'); rewrite(output);
readln(x1,y1);
readln(A,B,C);
Per(A,B,C,x1,y1,A1,B1,C1);
Tp(A,B,C,A1,B1,C1,x0,y0);
EndOtr(x1,y1,x0,y0,x2,y2);
if abs(x2)<0.001 then x2:=0.0;
if abs(y2)<0.001 then y2:=0.0;
writeln(x2:0:2,' ',y2:0:2);
close(input); close(output);
end.
А этот код на всех 3 копмиляторах проходит
|
|
|