Сборка FreePascal в Delphi ?

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Re: Сборка FreePascal в Delphi ?

Сообщение defecator » 26.09.2009 01:47:45

Данные до вхождения в цикл:
pSrc=4545988
pEnd=pSrc+3=4545991

Выполняем цикл:
pSrc=4545988, pEnd=4545991, pSrc^=16, Inc(pSrc)
pSrc=4545990, pEnd=4545991, pSrc^=17, Inc(pSrc)
pSrc=4545992, pEnd=4545991 <<<<-- Все, тут экипаж прощается с нами,
так как не выполняется условие цикла (pSrc < pEnd)

Итого просмотрели только ДВА значения вместо ТРЕХ и до значения 18 не дошли.
Команда Inc(pSrc) честно увеличивает счетчик на 2, так как psrc,pend объявлены как pword

Версия компилятора - Delphi 7. Это я в процессе адаптации компилятора FPC 2.2.2 наткнулся на это.
Самое смешное, что в FPC это работает ! Функция НАХОДИТ значение 18 ! А в Delphi - не находит :shock:
Ничего не понимаю, или здравый смысл мне изменил.

========================================================================================
========================================================================================
========================================================================================
P.S. По поводу моих слов о "помойке". Я нисколько не имею желания нападать на компилятор моего любимого языка, на котором (языке) я программирую уже почти 20 лет (с 1989 года), но хотите, я Вам вышлю полные исходные коды компилятора Borland Pascal 7.0 - и самого компилятора, и среды разработки ?
И вы просто сравните то, что ТАМ, с тем, что мы имеем в исходниках FPC ?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось defecator 26.09.2009 02:16:16, всего редактировалось 2 раз(а).
defecator
новенький
 
Сообщения: 43
Зарегистрирован: 07.09.2009 10:17:01
Откуда: Подольск

Re: Сборка FreePascal в Delphi ?

Сообщение Максим » 26.09.2009 02:08:47

Тут я вижу потенциальное поле для различных интерпретаций только в данной строке:
Код: Выделить всё
DWORD(pend):=DWORD(psrc)+len;

Вы уверены, что после выполнения этой строки значение pEnd увеличится на 3, а не на 6?

Этот вопрос у меня возник ввиду:
defecator писал(а):Команда Inc(pSrc) честно увеличивает счетчик на 2, так как psrc,pend объявлены как pword

В любом случае, думаю, не повредит задать вопрос в списке рассылки.
defecator писал(а):P.S. По поводу моих слов о "помойке". Я нисколько не имею желания нападать на компилятор моего любимого языка, на котором (языке) я программирую уже почти 20 лет (с 1989 года), но хотите, я Вам вышлю полные исходные коды компилятора Borland Pascal 7.0 - и самого компилятора, и среды разработки ?
И вы просто сравните то, что ТАМ, с тем, что мы имеем в исходниках FPC ?

Я вас ни в чём и не думал обвинять. Но всё же хотел бы заметить, что ваши претензии стоило бы оформить более конкретно хотя бы в виде сообщений об ошибках (а вообще шикарно - если в виде патчей, учитывая ваш опыт). Вам же потом меньше работы.
Последний раз редактировалось Максим 26.09.2009 02:19:45, всего редактировалось 2 раз(а).
Аватара пользователя
Максим
энтузиаст
 
Сообщения: 598
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Re: Сборка FreePascal в Delphi ?

Сообщение defecator » 26.09.2009 02:10:31

Максим писал(а):Тут я вижу потенциальное поле дл\ рахличных интерпретаций только в данной строке:
Код: Выделить всё
DWORD(pend):=DWORD(psrc)+len;

Вы уверены, что после выполнения этой строки значение pEnd увеличится на 3, а не на 6?

Этот вопрос у меня возник ввиду:
defecator писал(а):Команда Inc(pSrc) честно увеличивает счетчик на 2, так как psrc,pend объявлены как pword


Да, я же значения трассировки в отладчике привел, на сколько увеличивается значение - именно и ровно на 3:

pSrc=4545988
pEnd=pSrc+3=4545991

А почему должно увеличиваться на 6 ? Я же делаю операцию ЧИСЛО = ЧИСЛО + 3.
Откуда может взяться 6 ?
defecator
новенький
 
Сообщения: 43
Зарегистрирован: 07.09.2009 10:17:01
Откуда: Подольск

Re: Сборка FreePascal в Delphi ?

Сообщение Максим » 26.09.2009 02:18:27

defecator
Чего-то клинит меня, поздно уже :wink:

Можете написать короткую тестовую программку и отправить сообщение об ошибке в багтрекер? Если есть проблемы с английским, я могу помочь.

P.S. Также смотрите апдейт к моему предыдущему посту.
Аватара пользователя
Максим
энтузиаст
 
Сообщения: 598
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Re: Сборка FreePascal в Delphi ?

Сообщение скалогрыз » 26.09.2009 07:40:17

defecator писал(а):pSrc=4545988
pEnd=pSrc+3=4545991

А почему должно увеличиваться на 6 ? Я же делаю операцию ЧИСЛО = ЧИСЛО + 3.
Откуда может взяться 6 ?


1-х) выше описанный buf, это массив из byte или массив из word? ;)
если buf это массив из word, число должно быть именно 3 * sizeof(word), иначе

на ниже приведённой схеме, len = 3, это там где стоит b2, а не b5
Код: Выделить всё
b0  b1  b2  b3  b4  b5
w0____  w1____  w3____


2-х) это всё-таки паскаль и работать с поинтерной арифметикой не принято работать:
(и вообще весь предыдущий код - индуский, особенно возвращение результата!)
Код: Выделить всё
function IndexWord(Const buf: array of word;len:LongInt;b:word):LongInt; overload;
begin
  for i := 0 to len - 1 do
    if buf[i]=b then begin
      Result := i;
      Exit
    end;
  Result:=-1;
end;


ах, да! и конечно же:
Код: Выделить всё
function IndexWord(Const buf;len:LongInt;b:word):LongInt; overload;
begin
  Result:=IndexWord( PWordArray(@buf), len, b);
end;
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Сборка FreePascal в Delphi ?

Сообщение defecator » 26.09.2009 10:24:19

скалогрыз писал(а):1-х) выше описанный buf, это массив из byte или массив из word?


в сорцах компилятора (файл cgbase.pas) массив объявлен как:
Код: Выделить всё
      TSuperRegister = type word;

      Tsuperregisterarray=array[0..$ffff] of Tsuperregister;
      Psuperregisterarray=^Tsuperregisterarray;


скалогрыз писал(а):2-х) это всё-таки паскаль и работать с поинтерной арифметикой не принято работать


Как это - не принято ? Всю жисть работали ! Потому что работа с адресной арифметикой позволяет очень сильно повысить быстродействие кода без применения ассемблера.

скалогрыз писал(а):(и вообще весь предыдущий код - индуский, особенно возвращение результата!)


Тогда весь FreePascal написали индусы - этот код именно оттуда, и такие приемы работы и функции там сплошь и рядом. В частности, IndexWord и еще много подобного описано в файле:

"FreePascal_2.2.2\fpcbuild-2.2.2\fpcsrc\rtl\inc\generic.inc"
defecator
новенький
 
Сообщения: 43
Зарегистрирован: 07.09.2009 10:17:01
Откуда: Подольск

Re: Сборка FreePascal в Delphi ?

Сообщение скалогрыз » 26.09.2009 10:58:33

defecator писал(а):Как это - не принято ? Всю жисть работали ! Потому что работа с адресной арифметикой позволяет очень сильно повысить быстродействие кода без применения ассемблера.

быстродействие?! =) хе... да, наверное, прибавит, если знать что делаешь.

defecator писал(а):Тогда весь FreePascal написали индусы - этот код именно оттуда, и такие приемы работы и функции там сплошь и рядом. В частности, IndexWord и еще много подобного описано в файле:

только эти индусы знают, что делают ;) и байты у них пополам не ломаются

выдержка из rtl, generic.inc
Код: Выделить всё
var
  psrc,pend : pword; 

  ....then
    pend:=pword(high(PtrUInt)-sizeof(word))
  else
    pend:=psrc+len;

т.к. pend, psrc это pword-ы, прибавка 3 ("попугаев"), в результате даёт увеличение на 6 (байт) - арифметика поинтеров ;)

FPC
Код: Выделить всё
{$mode objfpc}
var  a, b : PWord;
begin
  a := nil;
  b := a + 3;
  writeln(PtrInt(a), ' ', PtrInt(b));
end.


Delphi 7
компилятор откажется этот код от fpc компилировать, исправить нужно так:
Код: Выделить всё
{$APPTYPE CONSOLE}
type  PtrInt = Integer;
var  a, b : PWord;
begin
  a := nil;
  PtrInt(b) := PtrInt(a)+ 3*sizeof(a^); // карсивее взять sizeof(word), но sizeof(a^) корректнее
  writeln(PtrInt(a), ' ', PtrInt(b));
end.


именно из-за таких различий в компиляторах, ни rtl и сам fpc собрать с помощью делфи не получится!
а лучше использовать открытый массив array of ..., тогда НИКАКИХ проблем с компиляторами не возникнет!
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Сборка FreePascal в Delphi ?

Сообщение defecator » 26.09.2009 11:09:15

скалогрыз писал(а):
выдержка из rtl, generic.inc
Код: Выделить всё
var
  psrc,pend : pword; 

  ....then
    pend:=pword(high(PtrUInt)-sizeof(word))
  else
    pend:=psrc+len; {ТОЧКА 1}

т.к. pend, psrc это pword-ы, прибавка 3 ("попугаев"), в результате даёт увеличение на 6 (байт) - арифметика поинтеров ;)


Отладчик попадает в ТОЧКУ 1, и именно там происходит УВЕЛИЧЕНИЕ НА 3, а не на шесть !
Я верю своим глазам и отладчику ! Хотя, может быть, FPC добавляет 6. Но в Delphi Этот код добавляет 3.

Данные до вхождения в цикл:
pSrc=4545988
pEnd=pSrc+3=4545991

Где тут увеличение на шесть ???

скалогрыз писал(а):именно из-за таких различий в компиляторах, ни rtl и сам fpc собрать с помощью делфи не получится!


Нормально он собирается, я же собрал ! Он даже сам себя компилит ! А на эту ошибку я наткнулся в процессе проверки его работы.

А RTL дельфей собирать совсем незачем ! Достаточно собрать FPC, и уже им самим собрать его RTL.
defecator
новенький
 
Сообщения: 43
Зарегистрирован: 07.09.2009 10:17:01
Откуда: Подольск

Re: Сборка FreePascal в Delphi ?

Сообщение скалогрыз » 26.09.2009 11:17:36

defecator писал(а):Отладчик попадает в ТОЧКУ 1, и именно там происходит УВЕЛИЧЕНИЕ НА 3, а не на шесть !
Я верю своим глазам и отладчику !

хорошо, скажу ещё раз:
Код: Выделить всё
  pend := psrc + 3;

это смещение указателя на три элемента (в зависимости от размера элемента). В результате байтовое смещение может быть гораздо большим, чем 3!

Код: Выделить всё
  DWORD(pend) := DWORD(psrc) + 3;

а это увеличение числа на 3

спорим - DWORD (в твоём первом примере) ты добавил от себя ;)
потому что pend := psrc + 3; в делфи не комплилируется! Что и порадило ошибку!

--------

если ты, веришь своим глазам, и отладчику (а ещё лучше дизассемблеру).
и у тебя есть fpc (даже 2.2.2 подойдёт),
то пожалуйста собери и проверь этот код, как он работает:
Код: Выделить всё
{$mode objfpc}
var  a, b : PWord;
begin
  a := nil;
  b := a + 3;
  writeln(PtrInt(a), ' ', PtrInt(b));
  DWORD(b):=DWORD(a)+3;
  writeln(PtrInt(a), ' ', PtrInt(b));
end.
Последний раз редактировалось скалогрыз 26.09.2009 11:21:00, всего редактировалось 1 раз.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Сборка FreePascal в Delphi ?

Сообщение defecator » 26.09.2009 11:20:41

Да, DWORD добавил я сам.

Гм... Задумался... :roll:

Прямо сейчас проверить не смогу, но, скорее всего, вы правы.
Просто в FPC реализована адресная арифметика (и я столкнулся с ней, когда переводил код под компилятор Delphi), а в Delphi - ее нет.

в исходниках, например, есть места:

Код: Выделить всё
type
   TRecord = record
      Field : LongInt ;
    end ;
   PRecord = ^TRecord ;

var
  Rec : ^TRecord ;
  Sel : LongInt ;
begin
   GetMem(Rec,100*SizeOf(TRecord)) ;
   { а вот тут - самое интересное }
   for Sel := 0 to 99 do
     Rec^[Sel].Field := ....


такое объявление типа приходится менять на:

Код: Выделить всё
type
   TRecord_Rec = record
      Field : LongInt ;
    end ;
  TRecordArr = array[0..1] of TRecord_Rec ;
   PRecord = ^TRecordArr ;

с заменой всех имен в коде c TRecord на TRecord_Rec. Благо, что таких мест оооочень немного.
Последний раз редактировалось defecator 26.09.2009 13:03:33, всего редактировалось 5 раз(а).
defecator
новенький
 
Сообщения: 43
Зарегистрирован: 07.09.2009 10:17:01
Откуда: Подольск

Re: Сборка FreePascal в Delphi ?

Сообщение Sergei I. Gorelkin » 26.09.2009 12:52:30

generic.inc содержит "обобщенную" реализацию. На большинстве платформ она просто не используется, вместо нее работают реализации соответствующих функций на ассемблере (находятся в соотвествующих папках - i386, powerpc и т.д). Даже комментарий в начале IndexWord говорит о том, что это эмуляция ассемблерной ф-ции.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Сборка FreePascal в Delphi ?

Сообщение defecator » 26.09.2009 12:59:55

Sergei I. Gorelkin писал(а):generic.inc содержит "обобщенную" реализацию. На большинстве платформ она просто не используется, вместо нее работают реализации соответствующих функций на ассемблере (находятся в соотвествующих папках - i386, powerpc и т.д). Даже комментарий в начале IndexWord говорит о том, что это эмуляция ассемблерной ф-ции.


Ну да, я понимаю. Но эта же ф-ция используется и в самом компиляторе, поэтому я ее обобщенный вариант перетащил к себе.
defecator
новенький
 
Сообщения: 43
Зарегистрирован: 07.09.2009 10:17:01
Откуда: Подольск

Re: Сборка FreePascal в Delphi ?

Сообщение скалогрыз » 26.09.2009 13:16:42

Писать под делфи, имеет актуальность только, в том случае, когда нужно доработать (существующий) VCL проект.
во всех остальных случаях лучше использовать FPC.

Во всех остальных случаях лучше использовать FPC+Lazarus.
глючно? - местами =) но никто не мешает глюки исправить, и ещё возгордиться этим, выслав разработчикам патчи ))
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Сборка FreePascal в Delphi ?

Сообщение defecator » 26.09.2009 15:02:49

У меня весь софт на Delphi, и 4-5 лет назад я на основе FreePascal версии 1.х сделал кросс-компилятор под свою собственную виртуальную машину. То есть FPC генерит P-код, а сама виртуальная машина реализована в "железе", на FPGA Altera, и ее система команд похожа на систему команд процессора ARM (а поддержки ARM в ту пору в FPC не было).

Вот теперь я хочу сделать то же самое для FPC 2.х.

Если честно, я много раз пытался работать в Lazarus, но я, видимо, испорчен средой Delphi, и от среды Lazarus меня просто тошнит.

Без обид, если что. :lol:
defecator
новенький
 
Сообщения: 43
Зарегистрирован: 07.09.2009 10:17:01
Откуда: Подольск

Re: Сборка FreePascal в Delphi ?

Сообщение скалогрыз » 26.09.2009 15:46:33

defecator писал(а):Вот теперь я хочу сделать то же самое для FPC 2.х.

а смысл кромсать "помойку", если есть исходники Borland Pascal-я :?

defecator писал(а):Если честно, я много раз пытался работать в Lazarus, но я, видимо, испорчен средой Delphi, и от среды Lazarus меня просто тошнит.
Без обид, если что. :lol:

ничего страшного! здесь все уже привыкли...
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Пред.След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru