![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
KOL и FreePascal
_vadim © (2007-09-16 15:39:00)Пытаюсь откомпилировать KOL 2.79 во FreePascal, но получаю такую ошибку:
Unexpected end of file.
Не подскажите, в чём может быть проблема.
FreePascal 2.2.
_vadim (2007-09-19 13:44:00) [1]To Galkov:
Это в файле kol.pas.
_vadim (2007-09-19 13:43:00) [2]To Galkov:
Проще будет убрать вот из этой строки:
sequence of {$DEFINE ... directives.
символ "{" вместо того, что советует Thaddy. FPC довольно строго, в отличие от Дельфи, подходит даже к символам комментария. :)
Yury Sidorov (2007-09-19 13:10:00) [3]Скомпилируй такой код с ключиком -gh и запусти прогу:
type
PMyObj = ^TMyObj;
TMyObj = object
public
constructor Init;
destructor Destroy;
end;
destructor TMyObj.Destroy;
begin
FreeMem(@Self);
end;
constructor TMyObj.Init;
begin
end;
var
O: PMyObj;
begin
New(O, Init);
Dispose(O, Destroy);
end.
FreeMem в деструкторе TObj.Destroy сделан для того, чтобы объект можно было освободить просто вызовом деструктора. Как для случая с классами.
В FPC это и так можно сделать, без FreeMem, т.к. код для деструктора объектов и классов генерится одинаковый.
Galkov (2007-09-18 21:38:00) [4]2 Yury Sidorov
Скомпилил. Ничего криминального не увидел.
А что должен был ???
btw: Лазарь у меня не стоит, мне нервы дороже :)
В принципе, ситуация действительно немного криминальная, в моем понимании.
Мне представляется, что никакой компилятор не будет гарантировать "не штатное" завершение в деструкторе. Оно им надо...
Эдак на грабли можнонаступить и на очедной версии Дельфи...
Поскольку мне не очень понятна цель этих хитростей (чем например был плох штатный inherited вместо FreeMem):
destructor TObj.Destroy;
begin
Final;
FreeMem( @ Self );
end;
- интересно послушать Владимира
Типа: откройте глаза, пожалуйста.
Но беспокоить бога по пустякам - не дело, однако.
Логично начинать разговор с примера в десяток строк: здесь - работает, а здесь - нет.
Ибо слова - они слова прежде всего и есть.
А мне такой пример пока неизвестен :(
2 thaddy
I don't undestand you still !!!
I was included your fragment, and have error message as result:
> kol.pas(311,1) Fatal: illegal character "'}'" ($7D)
> kol.pas(5,18) Fatal: Compilation aborted
And I have no error in original KOL, accordingly
At FPC 2.0.4 (VER2 is defined, as you see)
thaddy (2007-09-18 20:42:00) [5]There really is a parsing issue with fpc 2.2 and kol 2.79:
In delphi everything is ok, but in FPC there is a missing right-bracket ("}") at line 310 in kol.pas.
So, in order to get it working add:
{$IFDEF VER2} //FPC 2+
}
{$ENDIF}
btw: the reason I am not so active is a lot of work. I wish it were different...
Yury Sidorov (2007-09-18 19:26:00) [6]В 2.0.х поведение такое же.
Скомпили программу с ключиком -gh и посмотри что напишет при выходе.
Galkov (2007-09-18 18:01:00) [7]
> смотри в destructor TObj.Destroy
Ага, увидел - спасибо
Но возникает следующий вопрос: с какой версии FPC это начинается ???
Если знаете.
Ибо под 2.04 проблем не вижу...
Ну, чтобы не напрягаться понапрасну с обновлением сего замечательного продукта....
Yury Sidorov (2007-09-18 16:00:00) [8]смотри в destructor TObj.Destroy на FreeMem( @ Self ) и читай мой предыдущий пост.
Galkov (2007-09-18 14:07:00) [9]
> что KOL и делает.
Пальцем покажите, пожалуйста.
> И если использовать основную ветку KOL с FPC, то при освобождении
> объектов память будет освобождаться дважды, что приведет
> к ошибке и краху программы
Примерчик не приведете ???
А то у меня как-то не получается првести к краху.
Yury Sidorov (2007-09-18 12:04:00) [10]
> > Освобождение объектов для FPC нужно делать не так как
> для Delphi
>
> Очень информативно, однако.
> И многообещающе :)
>
> Нельзя ли с этого места по-подробнее ???
Подробности:
Дельфи при вызове Dispose для объекта с деструктором генерит вызов деструктора, а затем вызов Dispose для освобождения памяти. Поэтому при желании можно вызывать деструктор отдельно и отдельно освободить память, что KOL и делает.
FPC в таком случае вызывает только деструктор, который и освобождает память. Поэтому отдельно вызвать деструктор и отдельно освободить память нельзя.
Вот в этом и отличие. И если использовать основную ветку KOL с FPC, то при освобождении объектов память будет освобождаться дважды, что приведет к ошибке и краху программы.
Galkov (2007-09-17 22:41:00) [11]Встречное утверждение: Пытаюсь откомпилировать KOL 2.79 во FreePascal 2.04 - и не имею проблем.
Не изощряясь c дефайнами - мне показалось, что Thaddyдавно и о многом позаботился.
Вопрос: что я делаю не так, и при чем здесь KOL, мягко говоря ???
Про err.pas - не говорю, это отдельная и не простая песня.
С мотивом которой, разобраться обещал Yury Sidorov, если мне не изменяет память...
2 Thaddy: I don't undestand your recomendation :shock:
Is it possible to explain this more minutely ???
ZiTRaX (2007-09-17 21:45:00) [12]to ANTPro [7]: если это было мне, то:
а) с использованием KOL CE ничего не изменилось (только вместо 16 ошибок стало 14 ;-) );
б) а про [3] я и так догадался/знал - просто вывод консоли в качестве примера привёл.
to Thaddy [8]: and what I need to add?
Thaddy (2007-09-17 20:29:00) [13]Goto line 310 in kol.pas
Add:
{$IFDEF VER2}
}
{$ENDIF}
That helps!
ANTPro (2007-09-17 20:06:00) [14][1],[3] прочитать не всилах?
ZiTRaX (2007-09-17 19:30:00) [15]У меня в fpc.cfg созданы такие "типа-условия" (версия FPC - 2.2.0, KOL - 2.79):
#IFDEF KOL_RELEASE
-Og1p2
-Xs
-Mdelphi
-CX
-Sg
-dFPC21
-dKOL_MCK
-dPAS_VERSION
#WRITE Compiling KOL Release Version
#ENDIF
...
#IFDEF KOL_DEBUG
-gcl
-Crtoi
-Sg
-Sa
-Mdelphi
-dFPC21
-dKOL_MCK
-dPAS_VERSION
#WRITE Compiling KOL Debug Version
#ENDIF
Ну и, соответственно, компилю так:fpc -dKOL_RELEASE(или KOL_DEBUG) имя_файла.
Все юниты используются из стандартной поставки FPC. Простенькие примеры компилятся нормально, а чё-нить посложнее уже не хотит - выдаёт что-то типа такого:
E:\Programming\FPC\kolforfpc\kol_mck_2_54\zip\MPEGPlay>fpc -dKOL_RELEASE KOLMp3P
layer.dpr
Compiling KOL Release Version
Free Pascal Compiler version 2.2.0 [2007/09/09] for i386
Copyright (c) 1993-2007 by Florian Klaempfl
Target OS: Win32 for i386
Compiling KOLMp3Player.dpr
Compiling KOLMP3player1.pas
Compiling E:\Programming\FPC\dev-pascal\units\kol_mck_279\err.pas
err.pas(479,22) Error: Identifier not found "EnumResourceModules"
err.pas(479,51) Error: Illegal expression
err.pas(545,35) Error: Identifier not found "FindResourceHInstance"
err.pas(546,32) Error: Illegal qualifier
err.pas(549,38) Warning: Local variable "Fmt" does not seem to be initialized
err.pas(579,31) Warning: Use of -offset(%ebp) is not recommended for local varia
ble access
err.pas(777,17) Error: Unknown identifier "SYSTEM.RAISEEXCEPT"
err.pas(777,17) Error: Assembler syntax error
err.pas(922,73) Warning: Procedure type "FAR" ignored
err.pas(944,17) Error: Identifier not found "ExceptClsProc"
err.pas(1079,24) Error: Identifier not found "PLibModule"
err.pas(1079,24) Error: Error in type definition
err.pas(1087,31) Error: Identifier not found "LibModuleList"
err.pas(1088,21) Error: Operator is not overloaded
err.pas(1090,23) Error: Illegal qualifier
err.pas(1090,23) Error: Expression type must be class or record type
err.pas(1092,48) Error: Identifier not found "Instance"
err.pas(1092,71) Error: Identifier not found "Instance"
err.pas(1096,30) Error: Illegal qualifier
err.pas(1187) Fatal: There were 16 errors compiling module, stopping
Fatal: Compilation aborted
Так что либо напильником допиливать, либо всё-таки использовать Delphi для KOL :-) .
_vadim (2007-09-17 18:35:00) [16]Единственное условие компиляции, которое я там увидел, это {$DEFINE _FPC}.
В readme только вскольз упоминается, что KOL работает с FreePascal 1.0.5, 2.0.4 и выше. Вот только как компилировать - ни слова. Так что путаться можно до потери пульса.
Может быть кто-то уже путался и успешно из этого дела выпутался? Подскажите, будте добры.
Galkov (2007-09-17 17:09:00) [17]
> Освобождение объектов для FPC нужно делать не так как для Delphi
Очень информативно, однако.
И многообещающе :)
Нельзя ли с этого места по-подробнее ???
Yury Sidorov (2007-09-17 15:55:00) [18]Основная ветка KOL не будет работать правильно с FPC. Освобождение объектов для FPC нужно делать не так как для Delphi.
Простейшие примеры работать будут, а вот что-то посложднее уже будет валиться...
vampir_infernal (2007-09-17 14:21:00) [19]Скорее всего, что-то напутали с директивами условной компиляции
Yury Sidorov (2007-09-17 13:29:00) [20]Используй KOL-CE.