PDA

View Full Version : Class operators in Freepascal records like in Delphi 2010?



paul_nicholls
15-04-2011, 04:16 AM
Hey all,
I was wondering if it is possible to use records in Freepascal (Lazarus 0.9.30, Win32) with class operators now like Delphi 2010?



interface

type
TVector2f = record
public
x, y: Single;
class operator Negative(const v: TVector2f): TVector2f;
class operator Add(const v1, v2: TVector2f): TVector2f;
class operator Subtract(const v1, v2: TVector2f): TVector2f;
class operator Multiply(const v: TVector2f; const s: Single): TVector2f;
procedure SetValue(const aX, aY: Single);
function Normalize: TVector2f;
function Len: Single;
function Dot(const v: TVector2f): Single;
function Perp: TVector2f;
end;



implementation

//
// TVector2f routines
//
function Vector2f(aX, aY: Single): TVector2f;
begin
Result.x := aX;
Result.y := aY;
end;

class operator TVector2f.Negative(const v: TVector2f): TVector2f;
begin
Result.x := -v.x;
Result.y := -v.y;
end;

class operator TVector2f.Add(const v1, v2: TVector2f): TVector2f;
begin
Result.x := v1.x + v2.x;
Result.y := v1.y + v2.y;
end;

class operator TVector2f.Subtract(const v1, v2: TVector2f): TVector2f;
begin
Result.x := v1.x - v2.x;
Result.y := v1.y - v2.y;
end;

class operator TVector2f.Multiply(const v: TVector2f; const s: Single): TVector2f;
begin
Result.x := v.x * s;
Result.y := v.y * s;
end;

procedure TVector2f.SetValue(const aX, aY: Single);
begin
x := aX;
y := aY;
end;

function TVector2f.Normalize: TVector2f;
var
mag: Single;
begin
mag := Len;
if mag < 1 then mag := 1;
x := x / mag;
y := y / mag;

Result.x := x;
Result.y := y;
end;

function TVector2f.Len: Single;
begin
Result := Sqrt(Sqr(x) + Sqr(y));
end;

function TVector2f.Dot(const v: TVector2f): Single;
begin
Result := x * v.x + y * v.y;
end;

function TVector2f.Perp: TVector2f;
begin
Result.SetValue(-y, x);
end;


I have tried, but it doesn't seem possible - the compiler is complaining :(

It says it does here, but I don't know if it is the version that comes with Lazarus 0.9.30:
http://wiki.freepascal.org/FPC_New_Features_Trunk#Advanced_record_syntax

cheers,
Paul

JSoftware
15-04-2011, 05:42 AM
It works fine with FPC 2.5.1(trunk version)

paul_nicholls
15-04-2011, 05:51 AM
It works fine with FPC 2.5.1(trunk version)

Bummer...Lazarus 0.9.30 seems to be using Freepascal 2.4.2

:(

cheers,
Paul

JSoftware
15-04-2011, 06:34 AM
Just rebuild FPC from source :D

It's easy

paul_nicholls
15-04-2011, 06:40 AM
Just rebuild FPC from source :D

It's easy

Can I do that AND use the new compiler in Lazarus; overriding the one that comes with it?

cheers,
Paul

JSoftware
15-04-2011, 07:36 AM
Yes, no problem. If you're going to use a newer compiler, I would advice you to upgrade lazarus to trunk version too anyway :)

paul_nicholls
15-04-2011, 09:14 AM
Yes, no problem. If you're going to use a newer compiler, I would advice you to upgrade lazarus to trunk version too anyway :)

LOL this sounds like more work than I wanted to do...I will look into it :)

So if I upgraded Lazarus to the trunk version, would this have freepascal 2.5.1 with it? Or would I have to download both separately from SVN?

cheers,
Paul

code_glitch
15-04-2011, 11:49 AM
Hang on j, you mean we're already at 2.5.x??? WTF? I'm still getting used to everything in 2.4.2.... :)

JSoftware
15-04-2011, 12:15 PM
It's been 2.5.1 for a very long time. That's just the version number for the trunk version

Lazarus and FPC are seperate products. Release versions of FPC are just bundled with the Lazarus releases so it's possible to compile programs

alexione
16-04-2011, 01:21 PM
If you're on Windows (32-bit version), here's .bat file I use to compile FPC trunk after I update SVN (just adjust FPCMAKEPATH, FPCPATH and OUTPATH - in this case, C:/dev/fpc/2.4.2 is location of the latest official FPC, and C:/dev/fpc/2.5.1 is location where I want FPC to be installed for later use). It does full clean-make-install cycle.

set FPCMAKEPATH=C:/dev/fpc/2.4.2
set FPCPATH=C:/dev/fpc/2.4.2
set OUTPATH=C:/dev/fpc/2.5.1
for /r %OUTPATH%\examples %%d in (.svn) do @rmdir /s /q %%d
%FPCMAKEPATH%/bin/i386-win32/make clean FPC=%FPCPATH%/bin/i386-win32/ppc386.exe
if errorlevel 1 goto quit
%FPCMAKEPATH%/bin/i386-win32/make all FPC=%FPCPATH%/bin/i386-win32/ppc386.exe
if errorlevel 1 goto quit
%FPCMAKEPATH%/bin/i386-win32/make install FPC=%FPCPATH%/bin/i386-win32/ppc386.exe INSTALL_BASEDIR=%OUTPATH%
for /r %OUTPATH%\examples %%d in (.svn) do @rmdir /s /q %%d
:quit

As of Lazarus, just point FPC directory to C:/dev/fpc/2.5.1 (or wherever you set OUTPATH in the above .bat file), and use built-in feature to recompile it.

paul_nicholls
16-04-2011, 09:53 PM
If you're on Windows (32-bit version), here's .bat file I use to compile FPC trunk after I update SVN (just adjust FPCMAKEPATH, FPCPATH and OUTPATH - in this case, C:/dev/fpc/2.4.2 is location of the latest official FPC, and C:/dev/fpc/2.5.1 is location where I want FPC to be installed for later use). It does full clean-make-install cycle.

set FPCMAKEPATH=C:/dev/fpc/2.4.2
set FPCPATH=C:/dev/fpc/2.4.2
set OUTPATH=C:/dev/fpc/2.5.1
for /r %OUTPATH%\examples %%d in (.svn) do @rmdir /s /q %%d
%FPCMAKEPATH%/bin/i386-win32/make clean FPC=%FPCPATH%/bin/i386-win32/ppc386.exe
if errorlevel 1 goto quit
%FPCMAKEPATH%/bin/i386-win32/make all FPC=%FPCPATH%/bin/i386-win32/ppc386.exe
if errorlevel 1 goto quit
%FPCMAKEPATH%/bin/i386-win32/make install FPC=%FPCPATH%/bin/i386-win32/ppc386.exe INSTALL_BASEDIR=%OUTPATH%
for /r %OUTPATH%\examples %%d in (.svn) do @rmdir /s /q %%d
:quit

As of Lazarus, just point FPC directory to C:/dev/fpc/2.5.1 (or wherever you set OUTPATH in the above .bat file), and use built-in feature to recompile it.

Wow! thanks alexione! I will download the new fpc and try this out :)

cheers,
Paul

paul_nicholls
16-04-2011, 11:06 PM
@alexione: hmm...I have downloaded the trunk fpc, but I have some questions.

1. Do I set the %OUTPATH% string to the fpc folder that I just downloaded from SVN?
2. Where do I put the batch file to do the compiling that you gave me? In the root fpc folder in 1 ?

cheers,
Paul

paul_nicholls
18-04-2011, 03:10 AM
Hmm...I think I may have figured it out...trying to compile it now :)

cheers,
Paul

paul_nicholls
18-04-2011, 06:08 AM
Dang! The compiler sat there compiling for x amount of time, and then bombed with an error :(


Error: Util as.exe not found, switching to external linking

Here is the last part of the dos output:

mpiler/i386 -FuG:/fpc/2.5.1/compiler/targets -FuG:/fpc/2.5.1/compiler/systems -F
uG:/fpc/2.5.1/rtl/units/i386-win32 -FiG:/fpc/2.5.1/compiler -FiG:/fpc/2.5.1/comp
iler/i386 -FE. -FUG:/fpc/2.5.1/ide/units/i386-win32 -dRELEASE compunit.pas
aasmtai.pas(396,11) Warning: Constructor should be public
pdecsub.pas(1630,5) Warning: unreachable code
symdef.pas(3480,12) Warning: unreachable code
symdef.pas(3618,12) Warning: unreachable code
symdef.pas(5424,10) Warning: User defined: : this is completely wrong on so many
levels...
pmodules.pas(2357,12) Warning: unreachable code
ognlm.pas(1317,18) Warning: unreachable code
t_nwm.pas(973,38) Warning: Function result does not seem to be set
agx86att.pas(253,16) Warning: unreachable code
browcol.pas(1264,5) Note: Local variable "esym" not used
make[5]: Leaving directory `G:/fpc/2.5.1/ide/compiler'
make[4]: Leaving directory `G:/fpc/2.5.1/ide'
C:/lazarus/fpc/2.4.2/bin/i386-win32/make testgdb
make[4]: Entering directory `G:/fpc/2.5.1/ide'
LibGDB not found
LIBGDBFILE=
GDBLIBDIR=G:/fpc/2.5.1/libgdb/win32

make[4]: Leaving directory `G:/fpc/2.5.1/ide'
C:/lazarus/fpc/2.4.2/bin/i386-win32/make fpc_all
make[4]: Entering directory `G:/fpc/2.5.1/ide'
G:/fpc/2.5.1/compiler/ppc386.exe -di386 -Ur -Xs -O2 -n -Sg -FuG:/fpc/2.5.1/rtl/u
nits/i386-win32 -FuG:/fpc/2.5.1/packages/fv/units/i386-win32 -FuG:/fpc/2.5.1/pac
kages/gdbint/units/i386-win32 -FuG:/fpc/2.5.1/packages/regexpr/units/i386-win32
-FuG:/fpc/2.5.1/packages/fcl-base/units/i386-win32 -FuG:/fpc/2.5.1/packages/fcl-
xml/units/i386-win32 -FuG:/fpc/2.5.1/packages/chm/units/i386-win32 -FE. -FUunits
/i386-win32 -dRELEASE -dNODEBUG -Xe -k--allow-multiple-definition fp.pas
fp.pas(552,1) Error: Util as.exe not found, switching to external linking
fp.pas(552,1) Fatal: There were 1 errors compiling module, stopping
Fatal: Compilation aborted
make[4]: *** [fp.exe] Error 1
make[4]: Leaving directory `G:/fpc/2.5.1/ide'
make[3]: *** [buildfp] Error 2
make[3]: Leaving directory `G:/fpc/2.5.1/ide'
make[2]: *** [gdb] Error 2
make[2]: Leaving directory `G:/fpc/2.5.1/ide'
make[1]: *** [ide_all] Error 2
make[1]: Leaving directory `G:/fpc/2.5.1'
make: *** [build-stamp.i386-win32] Error 2

G:\fpc\2.5.1>if errorlevel 1 goto quit

G:\fpc\2.5.1>pause
Press any key to continue . . .

I don't know what happened...do you think this means I need something path in my path environmental variable or similar?

This is my compile script batch file that I placed in the g:\fpc\2.5.1 folder contain the SVN source and make file, etc.:


set FPCMAKEPATH=C:/lazarus/fpc/2.4.2
set FPCPATH=C:/lazarus/fpc/2.4.2
set OUTPATH=G:/dev/fpc/2.5.1
for /r %OUTPATH%\examples %%d in (.svn) do @rmdir /s /q %%d
%FPCMAKEPATH%/bin/i386-win32/make clean FPC=%FPCPATH%/bin/i386-win32/ppc386.exe
if errorlevel 1 goto quit
%FPCMAKEPATH%/bin/i386-win32/make all FPC=%FPCPATH%/bin/i386-win32/ppc386.exe
if errorlevel 1 goto quit
%FPCMAKEPATH%/bin/i386-win32/make install FPC=%FPCPATH%/bin/i386-win32/ppc386.exe INSTALL_BASEDIR=%OUTPATH%
for /r %OUTPATH%\examples %%d in (.svn) do @rmdir /s /q %%d
:quit
pause

G:/dev/fpc/2.5.1 is where I want to install? freepascal 2.5.1, and C:/lazarus/fpc/2.4.2 is where (obviously, DUH!) where I have the existing freepascal comiler...

cheers,
Paul

JSoftware
18-04-2011, 07:27 AM
It has nothing to do with directories. The problem is that you don't have binutils's gas assembler(as.exe) in your path. This is for some reason required when building the textmode IDE

paul_nicholls
18-04-2011, 09:23 AM
It has nothing to do with directories. The problem is that you don't have binutils's gas assembler(as.exe) in your path. This is for some reason required when building the textmode IDE

Ok, I have now added C:\lazarus\fpc\2.4.2\bin\i386-win32 to my path in the batch file (has as.exe there), so I will see if this helps :)

cheers,
Paul

paul_nicholls
18-04-2011, 11:05 AM
Sweet! I think it worked...no errors now :)

Here is the updated batch file:

set PATH=%PATH%;C:\lazarus\fpc\2.4.2\bin\i386-win32
set FPCMAKEPATH=C:/lazarus/fpc/2.4.2
set FPCPATH=C:/lazarus/fpc/2.4.2
set OUTPATH=G:/dev/fpc/2.5.1
for /r %OUTPATH%\examples %%d in (.svn) do @rmdir /s /q %%d
%FPCMAKEPATH%/bin/i386-win32/make clean FPC=%FPCPATH%/bin/i386-win32/ppc386.exe
if errorlevel 1 goto quit
%FPCMAKEPATH%/bin/i386-win32/make all FPC=%FPCPATH%/bin/i386-win32/ppc386.exe
if errorlevel 1 goto quit
%FPCMAKEPATH%/bin/i386-win32/make install FPC=%FPCPATH%/bin/i386-win32/ppc386.exe INSTALL_BASEDIR=%OUTPATH%
for /r %OUTPATH%\examples %%d in (.svn) do @rmdir /s /q %%d
:quit
pause

All I have to do is try it out now with Lazarus :)

cheers,
Paul

paul_nicholls
18-04-2011, 11:12 AM
Woo Hoo! My TVector2f record with class operators compiles now :D

Thanks so much JSoftware and alexione!

cheers,
Paul

paul_nicholls
19-04-2011, 11:22 AM
Ok, now I'm having another issue...it is obviously because I am using a different version of FPC to compile my Lazarus projects now, but I am not sure what to do about it :(

My Lazarus projects can't find standard units like IniFiles, Contnrs, etc. and I am unsure how to proceed.

Here is a screenshot of my Lazarus Environmental (Files) options:

http://img15.imageshack.us/img15/5369/lazarusenvironmentoptio.png (http://img15.imageshack.us/i/lazarusenvironmentoptio.png/)

And here is my fpc.cfg file (version 2.4.2, the 2.5.1 doesn't have one):

#
# Config file generated by fpcmkcfg on 11/04/2011 - 22:24:39
# Example fpc.cfg for Free Pascal Compiler
#

# ----------------------
# Defines (preprocessor)
# ----------------------

#
# nested #IFNDEF, #IFDEF, #ENDIF, #ELSE, #DEFINE, #UNDEF are allowed
#
# -d is the same as #DEFINE
# -u is the same as #UNDEF
#

#
# Some examples (for switches see below, and the -? helppages)
#
# Try compiling with the -dRELEASE or -dDEBUG on the commandline
#

# For a release compile with optimizes and strip debuginfo
#IFDEF RELEASE
-O2
-Xs
#WRITE Compiling Release Version
#ENDIF

# For a debug version compile with debuginfo and all codegeneration checks on
#IFDEF DEBUG
-glh
-Crtoi
#WRITE Compiling Debug Version
#ENDIF

# ----------------
# Parsing switches
# ----------------

# Pascal language mode
# -Mfpc free pascal dialect (default)
# -Mobjfpc switch some Delphi 2 extensions on
# -Mdelphi tries to be Delphi compatible
# -Mtp tries to be TP/BP 7.0 compatible
# -Mgpc tries to be gpc compatible
# -Mmacpas tries to be compatible to the macintosh pascal dialects
#
# Turn on Object Pascal extensions by default
#-Mobjfpc

# Assembler reader mode
# -Rdefault use default assembler
# -Ratt read AT&T style assembler
# -Rintel read Intel style assembler
#
# All assembler blocks are AT&T styled by default
#-Ratt

# Semantic checking
# -S2 same as -Mobjfpc
# -Sc supports operators like C (*=,+=,/= and -=)
# -Sa include assertion code.
# -Sd same as -Mdelphi
# -Se<x> compiler stops after the <x> errors (default is 1)
# -Sg allow LABEL and GOTO
# -Sh Use ansistrings
# -Si support C++ styled INLINE
# -SI<x> set interface style to <x>
# -SIcomCOM compatible interface (default)
# -SIcorbaCORBA compatible interface
# -Sm support macros like C (global)
# -So same as -Mtp
# -Sp same as -Mgpc
# -Ss constructor name must be init (destructor must be done)
# -St allow static keyword in objects
#
# Allow goto, inline, C-operators, C-vars
-Sgic

# ---------------
# Code generation
# ---------------

# Uncomment the next line if you always want static/dynamic units by default
# (can be overruled with -CD, -CS at the commandline)
#-CS
#-CD

# Set the default heapsize to 8Mb
#-Ch8000000

# Set default codegeneration checks (iocheck, overflow, range, stack)
#-Ci
#-Co
#-Cr
#-Ct

# Optimizer switches for i386 compiler
# -Os generate smaller code
# -O1 level 1 optimizations (quick optimizations)
# -O2 level 2 optimizations (-O1 + slower optimizations)
# -O3 level 3 optimizations (same as -O2u)
# -Oa=N set alignment to N
# -OoX switch on optimalization X.
# -OoNOX switch off optimalization X.
# X is one of REGVAR UNCERTAIN STACKFRAME PEEPHOLE ASMCSE LOOPUNROLL
# -OpCPU set target processor.
# CPU is one of 386, PENTIUM, PENTIUM2, PENTIUM3, PENTIUM4, PENTIUMM


# -----------------------
# Set Filenames and Paths
# -----------------------

# Both slashes and backslashes are allowed in paths

# path to the messagefile, not necessary anymore but can be used to override
# the default language
#-Frc:\lazarus\fpc\2.4.2/msg/errore.msg
#-Frc:\lazarus\fpc\2.4.2/msg/errorn.msg
#-Frc:\lazarus\fpc\2.4.2/msg/errores.msg
#-Frc:\lazarus\fpc\2.4.2/msg/errord.msg
#-Frc:\lazarus\fpc\2.4.2/msg/errorr.msg

# path to the gcclib
#-Flc:\lazarus\fpc\2.4.2/lib

#IFDEF FPCAPACHE_1_13
-Fuc:\lazarus\fpc\2.4.2/units/$FPCTARGET/httpd13/
#ELSE
#IFDEF FPCAPACHE_2_0
-Fuc:\lazarus\fpc\2.4.2/units/$FPCTARGET/httpd20
#ELSE
-Fuc:\lazarus\fpc\2.4.2/units/$FPCTARGET/httpd22
#ENDIF
#ENDIF

# searchpath for units and other system dependent things
-Fuc:\lazarus\fpc\2.4.2/units/$FPCTARGET/
-Fuc:\lazarus\fpc\2.4.2/units/$FPCTARGET/*
-Fuc:\lazarus\fpc\2.4.2/units/$FPCTARGET/rtl

# searchpath for libraries
#-Flc:\lazarus\fpc\2.4.2/lib
#-Fl/lib;/usr/lib

# searchpath for tools
-FDc:\lazarus\fpc\2.4.2/bin/$FPCTARGET

# binutils prefix for cross compiling
#IFDEF FPC_CROSSCOMPILING
-XP$FPCTARGET-
#ENDIF


# -------------
# Linking
# -------------

# generate always debugging information for GDB (slows down the compiling
# process)
# -gc generate checks for pointers
# -gd use dbx
# -gg use gsym
# -gh use heap trace unit (for memory leak debugging)
# -gl use line info unit to show more info for backtraces
# -gv generates programs tracable with valgrind
# -gw generate dwarf debugging info
#
# Enable debuginfo and use the line info unit by default
#-gl

# always pass an option to the linker
#-k-s

# Always strip debuginfo from the executable
-Xs


# -------------
# Miscellaneous
# -------------

# Write always a nice FPC logo ;)
-l

# Verbosity
# e : Show errors (default) d : Show debug info
# w : Show warnings u : Show unit info
# n : Show notes t : Show tried/used files
# h : Show hints m : Show defined macros
# i : Show general info p : Show compiled procedures
# l : Show linenumbers c : Show conditionals
# a : Show everything 0 : Show nothing (except errors)
# b : Show all procedure r : Rhide/GCC compatibility mode
# declarations if an error x : Executable info (Win32 only)
# occurs
#
# Display Info, Warnings, Notes and Hints
-viwn
# If you don't want so much verbosity use
#-vw


Any ideas?

cheers,
Paul

JSoftware
19-04-2011, 11:58 AM
Replace all mentions you can find of 2.4.2 with 2.5.1, and you should be good again :)

Units compiled with a different version of the compiler cannot be used by the same compiler. It might be a very different PPU structure. Hence, you will also have to recompile lazarus when you've inserted the new FPC version info

paul_nicholls
19-04-2011, 12:06 PM
Replace all mentions you can find of 2.4.2 with 2.5.1, and you should be good again :)

Units compiled with a different version of the compiler cannot be used by the same compiler. It might be a very different PPU structure. Hence, you will also have to recompile lazarus when you've inserted the new FPC version info

When you say replace 2.4.2 with 2.5.1 do you mean in the fpc.cfg and Lazarus options?

I did notice that there is no ...)fpc\2.5.1\source\ folder, only a ...fpc\2.4.2\source\ what do I do about that?
Copy those files across so they can be re-compiled for 2.5.1?

There is also no make.exe for 2.5.1, only 2.4.2

cheers,
Paul

JSoftware
19-04-2011, 12:16 PM
It doesn't matter where the source is, just that lazarus is pointed to the right version. You need to point lazarus to the directory where the 2.5.1 source is(compiler,ide,rtl,packages,utils,etc)

Edit: which version of make.exe doesn't matter either

alexione
19-04-2011, 04:50 PM
Ok, now I'm having another issue...it is obviously because I am using a different version of FPC to compile my Lazarus projects now, but I am not sure what to do about it :(

And here is my fpc.cfg file (version 2.4.2, the 2.5.1 doesn't have one):


That's probably the problem - you need fpc.cfg for 2.5.1 because you set it to be the compiler you use to compiler projects. Just copy fpc.cfg from 2.4.2 to 2.5.1 and replace all 2.4.2 with 2.5.1. Also, point FPC source directory to your SVN checkout-ed source of FPC (the source you compile with the above batch file). That should fix the problem.

paul_nicholls
19-04-2011, 10:51 PM
Thanks guys! I used a modified copy of fpc.cfg for 2.5.1 and pointed to the 2.5.1 'source' folder...it all now works :)

Thanks again ;)

cheers,
Paul