FreePascal "forward" orulet

Fórumok

Minden megtalalt dokumentacio /gugli, hupwiki, konyv/ (meg a sajat ezer eves emlekeim) szerint a lenti kodot valahogy igy kell megirni. Ellenben FreePascal anyazik. Esetleg meg tudja valaki mondani, hogy hogyan kellene azt a rohadt forward hivatkozast megejteni ahhoz, hogy le is forduljon?


program lo;

procedure egy( dd: longint );forward;

procedure ketto( d: longint );
var     i:longint;
begin
i := d * d;
egy( i );
writeln( 'Ez itt a ketto: ', i );
end;

procedure egy;
var     i: longint;
begin
i := dd * dd;
writeln( 'Ez itt az egy: ', i );
end;

BEGIN
egy( 8 );
ketto( 8 );
END.

Es ez itt a fordito nyavalygasa:
$ fpc x
Free Pascal Compiler version 2.2.2 [2009/02/22] for i386
Copyright (c) 1993-2008 by Florian Klaempfl
Target OS: FreeBSD/ELF for i386
Compiling x.pas
x.pas(17,9) Error: Identifier not found "dd"
x.pas(17,13) Error: Identifier not found "dd"
x.pas(25) Fatal: There were 2 errors compiling module, stopping
Fatal: Compilation aborted
Error: /usr/local/bin/ppc386 returned an error exitcode (normal if you did not specify a source file to be compiled)
$

De mi a jo edes anyjaert nem latja?

Hozzászólások

No erre jo egy forum. Miutan mar kb 2 oraja szenvedek vele, kiderult. Ellentetben a doksikkal - legalabbis FreeBSD-n a FreePascal 2.2.2 - elvarja, hogy az elorehivatkozott eljaras teljes fejlecet megadjuk megegyszer. Azaz:

procedure ketto( i: longint);forward;
procedure ketto( i: longint);
begin
..
end;

formaban. Az en ezer eves konyvem, a hupwiki-fele pascal szocikk, meg a net kismillio peldaja szerint nem igy kell. De legalabb megy.

Kedves Zahy!

ftp://ftp.freepascal.org/pub/fpc/docs-pdf/ref.pdf

FreePascal Language Reference,
Chapter 11. Using Functions and Procedures,
11.5 Forward defined functions

Ott a példa, pont olyan, mint amit Te is szerettél volna csinálni.

Megjegyzés: a paraméterlistát vélhetően azért is kellett leírni pontosan, hogy a fordító be tudja azonosítani, hogy a programozó melyik kézjeggyel (szignatúrával) ellátott eljárásra hivatkozik hamarabb, mint ahogyan azt a forráskódban deklarálták. Ez -- részben egyetértve egy korábbi hozzászólóval -- hasonlít ugyan az OOP-ben levő túlterheléshez (overloading), bár ez a Pascal-ban OOP nélkül is megy gondoljunk csak a

write()

illetve

writeln()

eljárások különböző típusú paramétereire.

G.
============================================
"Share what you know. Learn what you don't."

Overloadingnak mi köze az OOP-hez? AFAIK az overloading azt jelenti, hogy azonos néven több eljárás is van különböző paraméteretéssel, és a fordító a paraméterezés alapján dönti el, hogy melyiket hívja. Mindegy, hogy sima eljárásról vagy osztálymetódusról van szó.

Vígaszul: http://en.wikibooks.org/wiki/Pascal_Programming/Syntax_and_functions

Ez olyan, amikor elkezd veszekedni veled egy nő, te közlöd vele, hogy na, erről majd később beszélünk, nos ha odaértek, nem elég megmondani, hogy akkor most beszéljünk a problémáról, hanem jól ki kell fejteni,hogy akkor most melyikről is. Mert ugye túl is lehet terhelve (overload) a probléma, és akkor nem tudod, melyikről akar beszélni veled. :)

Úgy tűnik, Free Pascal-ban azért kell újra kiírni a fejlécet, mert (a Turbo Pascallal és a Delphivel ellentétben) alapértelmezés szerint az overload-os definícióknál nem kell kiírni az overload direktívát, hanem ha egy függvény kétszer különböző paraméterlistával van deklarálva, akkor automatikusan overload-osok lesznek. Delphi kompatibilis módban ki kell tenni az overload-ot, és ennek megfelelően a forward deklarált eljárás definiálásakor se kell kiírni a paraméterlistát.