diff options
author | Erich Eckner <git@eckner.net> | 2016-03-08 11:15:05 +0100 |
---|---|---|
committer | Erich Eckner <git@eckner.net> | 2016-03-08 15:47:01 +0100 |
commit | 63997bb9543eaeea60552cae9fd55964f4ed7682 (patch) | |
tree | 90bde894ab771e368ce6c6a019b181b23dd0002b | |
parent | cb694b029790243d93885293349cde99430506e7 (diff) | |
download | epost-63997bb9543eaeea60552cae9fd55964f4ed7682.tar.xz |
gemeinsamer Vorfahr von tKontur und tWerte
-rw-r--r-- | epost.lpr | 4 | ||||
-rw-r--r-- | epost.lps | 118 | ||||
-rw-r--r-- | epostunit.pas | 154 |
3 files changed, 143 insertions, 133 deletions
@@ -443,7 +443,7 @@ begin end; if startetMit('lösche Kontur ',s) then begin while s<>'' do begin - j:=findeKontur(erstesArgument(s),nil,@Konturen,false); + j:=findeKontur(erstesArgument(s),nil,@Wertes,@Konturen,false); if j<0 then begin aufraeumen; halt(1); @@ -461,7 +461,7 @@ begin halt(1); end; if startetMit('Kontur',s) then begin - i:=findeKontur(s,inf,@Konturen,true); + i:=findeKontur(s,inf,@Wertes,@Konturen,true); if (i>=0) and Konturen[i].Init(syntaxtest,inf,@wertes,maxthreads) then continue; aufraeumen; halt(1); @@ -7,8 +7,8 @@ <Unit0> <Filename Value="epost.lpr"/> <IsPartOfProject Value="True"/> - <TopLine Value="105"/> - <CursorPos Y="271"/> + <TopLine Value="56"/> + <CursorPos X="46" Y="73"/> <FoldState Value=" T0iXW39123111221]65151[84313[4421[Q4121[85]as"/> <UsageCount Value="202"/> <Loaded Value="True"/> @@ -25,9 +25,9 @@ <IsPartOfProject Value="True"/> <IsVisibleTab Value="True"/> <EditorIndex Value="1"/> - <TopLine Value="3909"/> - <CursorPos X="42" Y="3931"/> - <FoldState Value=" T0@4k{V0G1C1@"/> + <TopLine Value="6438"/> + <CursorPos Y="6478"/> + <FoldState Value=" T0\0m$0C1k"/> <UsageCount Value="201"/> <Loaded Value="True"/> </Unit2> @@ -41,17 +41,16 @@ <Unit4> <Filename Value="werteunit.pas"/> <IsPartOfProject Value="True"/> - <EditorIndex Value="2"/> + <EditorIndex Value="4"/> <TopLine Value="348"/> <CursorPos Y="619"/> - <FoldState Value=" T0pekl051X141O"/> <UsageCount Value="200"/> <Loaded Value="True"/> </Unit4> <Unit5> <Filename Value="typenunit.pas"/> <IsPartOfProject Value="True"/> - <EditorIndex Value="3"/> + <EditorIndex Value="5"/> <TopLine Value="560"/> <CursorPos Y="600"/> <UsageCount Value="200"/> @@ -63,7 +62,7 @@ <EditorIndex Value="-1"/> <TopLine Value="162"/> <CursorPos X="56" Y="177"/> - <UsageCount Value="51"/> + <UsageCount Value="60"/> </Unit6> <Unit7> <Filename Value="../units/fftunit.inc"/> @@ -71,41 +70,42 @@ <EditorIndex Value="-1"/> <TopLine Value="10"/> <CursorPos X="22" Y="10"/> - <UsageCount Value="48"/> + <UsageCount Value="57"/> </Unit7> <Unit8> <Filename Value="../fpGUI/src/corelib/render/software/agg_scanline_storage_aa.pas"/> <EditorIndex Value="-1"/> <TopLine Value="1612"/> <CursorPos X="2" Y="1675"/> - <UsageCount Value="1"/> + <UsageCount Value="10"/> </Unit8> <Unit9> <Filename Value="../units/mystringlistunit.pas"/> <EditorIndex Value="-1"/> <TopLine Value="313"/> <CursorPos Y="435"/> - <UsageCount Value="13"/> + <UsageCount Value="12"/> </Unit9> <Unit10> <Filename Value="../units/lowlevelunit.pas"/> - <EditorIndex Value="-1"/> - <TopLine Value="17"/> - <CursorPos X="3" Y="37"/> - <UsageCount Value="23"/> + <EditorIndex Value="3"/> + <CursorPos Y="20"/> + <UsageCount Value="27"/> + <Loaded Value="True"/> </Unit10> <Unit11> <Filename Value="../units/randomunit.pas"/> <EditorIndex Value="-1"/> - <UsageCount Value="1"/> + <UsageCount Value="10"/> </Unit11> <Unit12> <Filename Value="../units/matheunit.pas"/> - <EditorIndex Value="-1"/> - <TopLine Value="544"/> - <CursorPos X="53" Y="567"/> - <FoldState Value=" T3q50{m012A"/> - <UsageCount Value="13"/> + <EditorIndex Value="2"/> + <TopLine Value="460"/> + <CursorPos X="47" Y="482"/> + <FoldState Value=" T3v2041$"/> + <UsageCount Value="17"/> + <Loaded Value="True"/> </Unit12> <Unit13> <Filename Value="../units/systemunit.pas"/> @@ -119,149 +119,149 @@ <EditorIndex Value="-1"/> <TopLine Value="807"/> <CursorPos Y="818"/> - <UsageCount Value="4"/> + <UsageCount Value="3"/> </Unit14> <Unit15> <Filename Value="../units/protokollunit.pas"/> <EditorIndex Value="-1"/> <TopLine Value="82"/> <CursorPos X="15" Y="30"/> - <UsageCount Value="4"/> + <UsageCount Value="3"/> </Unit15> <Unit16> <Filename Value="/usr/lib/fpc/src/rtl/inc/objpash.inc"/> <EditorIndex Value="-1"/> <TopLine Value="182"/> <CursorPos X="21" Y="202"/> - <UsageCount Value="6"/> + <UsageCount Value="5"/> </Unit16> <Unit17> <Filename Value="/usr/lib/fpc/src/rtl/unix/bunxovlh.inc"/> <EditorIndex Value="-1"/> <TopLine Value="61"/> <CursorPos X="10" Y="99"/> - <UsageCount Value="9"/> + <UsageCount Value="8"/> </Unit17> </Units> <JumpHistory Count="30" HistoryIndex="29"> <Position1> <Filename Value="epostunit.pas"/> - <Caret Line="6180" Column="21" TopLine="6162"/> + <Caret Line="887" Column="19" TopLine="854"/> </Position1> <Position2> <Filename Value="epostunit.pas"/> - <Caret Line="6178" Column="15" TopLine="6070"/> + <Caret Line="982" Column="34" TopLine="963"/> </Position2> <Position3> - <Filename Value="typenunit.pas"/> - <Caret Line="49" Column="24" TopLine="26"/> + <Filename Value="epostunit.pas"/> + <Caret Line="72" Column="32" TopLine="52"/> </Position3> <Position4> - <Filename Value="typenunit.pas"/> - <Caret Line="101" Column="45" TopLine="68"/> + <Filename Value="epostunit.pas"/> + <Caret Line="5100" Column="32" TopLine="5068"/> </Position4> <Position5> - <Filename Value="werteunit.pas"/> - <Caret Line="646" Column="7" TopLine="627"/> + <Filename Value="epostunit.pas"/> + <Caret Line="5353" Column="56" TopLine="5341"/> </Position5> <Position6> - <Filename Value="werteunit.pas"/> - <Caret Line="633" Column="26" TopLine="602"/> + <Filename Value="epostunit.pas"/> + <Caret Line="1443" Column="49" TopLine="1412"/> </Position6> <Position7> <Filename Value="epostunit.pas"/> - <Caret Line="1371" Column="86" TopLine="1343"/> + <Caret Line="1442" Column="21" TopLine="1422"/> </Position7> <Position8> <Filename Value="epostunit.pas"/> - <Caret Line="1373" Column="19" TopLine="1340"/> + <Caret Line="1445" Column="61" TopLine="1423"/> </Position8> <Position9> <Filename Value="epostunit.pas"/> - <Caret Line="3547" Column="10" TopLine="3594"/> + <Caret Line="72" Column="32" TopLine="52"/> </Position9> <Position10> <Filename Value="epostunit.pas"/> - <Caret Line="140" Column="25" TopLine="122"/> + <Caret Line="5108" Column="32" TopLine="5076"/> </Position10> <Position11> <Filename Value="epostunit.pas"/> - <Caret Line="2856" Column="60" TopLine="2846"/> + <Caret Line="5365" Column="27" TopLine="5310"/> </Position11> <Position12> <Filename Value="epostunit.pas"/> - <Caret Line="78" Column="43" TopLine="58"/> </Position12> <Position13> <Filename Value="epostunit.pas"/> - <Caret Line="1385" Column="80" TopLine="1361"/> + <Caret Line="382" Column="24" TopLine="349"/> </Position13> <Position14> <Filename Value="epostunit.pas"/> - <Caret Line="923" TopLine="904"/> + <Caret Line="387" Column="27" TopLine="354"/> </Position14> <Position15> <Filename Value="epostunit.pas"/> - <Caret Line="934" TopLine="914"/> + <Caret Line="394" Column="79" TopLine="361"/> </Position15> <Position16> <Filename Value="epostunit.pas"/> - <Caret Line="1153" TopLine="1133"/> + <Caret Line="3405" Column="18" TopLine="3391"/> </Position16> <Position17> <Filename Value="epostunit.pas"/> - <Caret Line="1169" TopLine="1149"/> + <Caret Line="3236" Column="15" TopLine="3216"/> </Position17> <Position18> <Filename Value="epostunit.pas"/> - <Caret Line="1382" Column="64" TopLine="1353"/> + <Caret Line="3281" Column="25" TopLine="3249"/> </Position18> <Position19> <Filename Value="epostunit.pas"/> - <Caret Line="1576" Column="20" TopLine="1544"/> + <Caret Line="3404" Column="51" TopLine="3372"/> </Position19> <Position20> <Filename Value="epostunit.pas"/> - <Caret Line="3026" TopLine="2805"/> + <Caret Line="3405" Column="41" TopLine="3373"/> </Position20> <Position21> <Filename Value="epostunit.pas"/> + <Caret Line="3406" Column="89" TopLine="3374"/> </Position21> <Position22> <Filename Value="epostunit.pas"/> - <Caret Line="78" Column="43" TopLine="45"/> + <Caret Line="3559" Column="84" TopLine="3548"/> </Position22> <Position23> <Filename Value="epostunit.pas"/> - <Caret Line="1424" TopLine="1398"/> + <Caret Line="6481" TopLine="6441"/> </Position23> <Position24> <Filename Value="epostunit.pas"/> - <Caret Line="1426" Column="38" TopLine="1412"/> + <Caret Line="5368" TopLine="5352"/> </Position24> <Position25> <Filename Value="epostunit.pas"/> - <Caret Line="140" Column="25" TopLine="122"/> + <Caret Line="3559" Column="15" TopLine="3540"/> </Position25> <Position26> <Filename Value="epostunit.pas"/> - <Caret Line="3055" Column="28" TopLine="3035"/> + <Caret Line="117" Column="23" TopLine="99"/> </Position26> <Position27> <Filename Value="epostunit.pas"/> - <Caret Line="151" Column="24" TopLine="132"/> + <Caret Line="1627" Column="26" TopLine="1609"/> </Position27> <Position28> <Filename Value="epostunit.pas"/> - <Caret Line="2376" Column="22" TopLine="2344"/> + <Caret Line="3225" Column="51" TopLine="3220"/> </Position28> <Position29> <Filename Value="epostunit.pas"/> - <Caret Line="2377" Column="29" TopLine="2345"/> + <Caret Line="3226" Column="29" TopLine="3208"/> </Position29> <Position30> <Filename Value="epostunit.pas"/> - <Caret Line="3055" Column="23" TopLine="3023"/> + <Caret Line="3564" Column="22" TopLine="3548"/> </Position30> </JumpHistory> </ProjectSession> diff --git a/epostunit.pas b/epostunit.pas index e52f7cc..cf34038 100644 --- a/epostunit.pas +++ b/epostunit.pas @@ -42,7 +42,19 @@ type pTLiKo = ^tLiKo; pTWerteArray = ^tWerteArray; tWerteArray = array of tWerte; - tKontur = class(tObject) + tKontur = class; + tKonturenArray = array of tKontur; + pTKonturenArray = ^tKonturenArray; + + tDatenVorfahr = class(tObject) + bezeichner: string; + Konturen: pTKonturenArray; + wertes: pTWerteArray; + constructor create(Kont: pTKonturenArray; wert: pTWerteArray); + function callBackGetValue(s: string): extended; + end; + + tKontur = class(tDatenVorfahr) private function rxmin: extended; function rxmax: extended; @@ -50,10 +62,10 @@ type function rtmax: extended; function sortiere_nach_y(mt: longint): boolean; overload; function sortiere_nach_y(mt,von,bis: longint): boolean; overload; + function exprtofloat(st: boolean; s: string; kvs: tKnownValues): extended; public farbe: tRGB; orte: tExtPointArray; - bezeichner: string; function init(st: boolean; var f: tMyStringlist; w: pTWerteArray; mt: longint): boolean; function liesVonDatei(st: boolean; s: string; xmi,xma,tmi,tma: extended): boolean; function erzeugeAusWerten(st: boolean; s: string; w: pTWerteArray; mt: longint; _xmin,_xmax,_tmin,_tmax: string): boolean; @@ -61,13 +73,11 @@ type property xmax: extended read rxmax; property tmin: extended read rtmin; property tmax: extended read rtmax; - constructor create; + constructor create(Kont: pTKonturenArray; wert: pTWerteArray); destructor destroy; override; end; - tKonturenArray = array of tKontur; - pTKonturenArray = ^tKonturenArray; tLeseThread = class; - tWerte = class(tObject) + tWerte = class(tDatenVorfahr) { Diese Klasse ist die benutzerseitige Variante von tLLWerte und benutzt letztere. Sie übernimmt auch die Parallelisierung. @@ -100,7 +110,6 @@ type procedure wMinw(miw: extended); function rMaxw: extended; procedure wMaxw(maw: extended); - function callBackGetValue(s: string): extended; function xscale: extended; function tscale: extended; function dichtenParameterErkannt(st: boolean; s: string; threads,xmin,xmax,tmin,tmax: longint): boolean; @@ -114,9 +123,6 @@ type dWerte: tLLWerteDouble; sWerte: tLLWerteSingle; Genauigkeit: tGenauigkeit; - bezeichner: string; - Konturen: pTKonturenArray; - wertes: pTWerteArray; constructor create(Kont: pTKonturenArray; wert: pTWerteArray); overload; constructor create(original: tWerte; xmin,xmax: longint); overload; destructor destroy; override; @@ -343,7 +349,7 @@ function findePalette(out Palette: pTPalette; name: string): boolean; function erzeugeLegende(st: boolean; var f: tMyStringlist; datei: string; Qu: tWerte; minDichte,maxDichte: extended; nb: tTransformation; pal: pTPalette): boolean; function strToFftDo(out fftDo: tFFTDatenordnung; s: string): boolean; function findeWerte(s: String; f: tMyStringlist; pws: pTWerteArray; Kont: pTKonturenArray; darfErstellen: boolean): integer; -function findeKontur(s: String; f: tMyStringlist; pks: pTKonturenArray; darfErstellen: boolean): integer; +function findeKontur(s: String; f: tMyStringlist; pws: pTWerteArray; pks: pTKonturenArray; darfErstellen: boolean): integer; function externerBefehl(st: boolean; s: string): boolean; procedure warte_auf_externeBefehle; procedure beendeExterneBefehleWennFertig; @@ -357,22 +363,71 @@ implementation uses math, systemunit; +// tDatenVorfahr *************************************************************** + +constructor tDatenVorfahr.create(Kont: pTKonturenArray; wert: pTWerteArray); +begin + inherited create; + Konturen:=Kont; + wertes:=wert; + bezeichner:=''; +end; + +function tDatenVorfahr.callBackGetValue(s: string): extended; +var + i: longint; +begin + result:=nan; + if startetMit('Kontur[',s) or startetMit('Konturen[',s) then begin + if pos('].',s)=0 then + fehler('Syntaxfehler, '']'' fehlt!'); + i:=findeKontur(erstesArgument(s,'].'),nil,Wertes,Konturen,false); + if i<0 then + fehler('Finde Kontur nicht!'); + if s='xmin' then result:=Konturen^[i].xmin + else if s='xmax' then result:=Konturen^[i].xmax + else if s='tmin' then result:=Konturen^[i].tmin + else if s='tmax' then result:=Konturen^[i].tmax + else if s='Breite' then result:=Konturen^[i].xmax-Konturen^[i].xmin + else if s='Hoehe' then result:=Konturen^[i].tmax-Konturen^[i].tmin + else fehler('Kenne Bezeichner '''+s+''' nicht als Eigenschaft einer Kontur!'); + exit; + end; + if startetMit('Wert[',s) or startetMit('Werte[',s) or startetMit('Wertes[',s) then begin + if pos('].',s)=0 then + fehler('Syntaxfehler, '']'' fehlt!'); + i:=findeWerte(erstesArgument(s,'].'),nil,wertes,Konturen,false); + if i<0 then + fehler('Finde Werte nicht!'); + if (s='xmin') or (s='xstart') then result:=wertes^[i].Transformationen.xstart + else if (s='xmax') or (s='xstop') then result:=wertes^[i].Transformationen.xstop + else if (s='tmin') or (s='tstart') then result:=wertes^[i].Transformationen.tstart + else if (s='tmax') or (s='tstop') then result:=wertes^[i].Transformationen.tstop + else if (s='wmin') or (s='minw') then result:=wertes^[i]._minw + else if (s='wmax') or (s='maxw') then result:=wertes^[i]._maxw + else if s='np' then result:=wertes^[i]._np + else if (s='beta') or (s='β') then result:=wertes^[i]._beta + else if s='Breite' then result:=wertes^[i].Transformationen.xstart-wertes^[i].Transformationen.xstop + else if s='Hoehe' then result:=wertes^[i].Transformationen.tstart-wertes^[i].Transformationen.tstop + else fehler('Kenne Bezeichner '''+s+''' nicht als Eigenschaft von Werten!'); + exit; + end; + fehler('Ich kenne den Bezeichner '''+s+''' nicht!'); +end; + // tWerte ********************************************************************** constructor tWerte.create(Kont: pTKonturenArray; wert: pTWerteArray); var ps: tExtrainfos; begin - inherited create; + inherited create(Kont,wert); ps:=tExtrainfos.create; Genauigkeit:=gSingle; leseThread:=nil; sWerte:=tLLWerteSingle.create(ps); dWerte:=tLLWerteDouble.create(ps); eWerte:=tLLWerteExtended.create(ps); - Konturen:=Kont; - wertes:=wert; - bezeichner:=''; end; constructor tWerte.create(original: tWerte; xmin,xmax: longint); @@ -382,12 +437,11 @@ var pDo: pTLLWerteDouble; pEx: pTLLWerteExtended; begin - inherited create; + inherited create(original.Konturen,original.wertes); original.warteAufBeendigungDesLeseThreads; ps:=tExtrainfos.create; leseThread:=nil; Genauigkeit:=original.Genauigkeit; - Konturen:=original.Konturen; case Genauigkeit of gSingle: begin pSi:=@(original.sWerte); @@ -411,7 +465,6 @@ begin if original.bezeichner='' then bezeichner:='' else bezeichner:=original.bezeichner+''''; Transformationen:=original.Transformationen; - wertes:=original.wertes; end; destructor tWerte.destroy; @@ -3334,7 +3387,7 @@ begin if startetMit('Kontur:',s) then begin while length(s)>0 do begin setlength(verwKonturen,length(verwKonturen)+1); - verwKonturen[length(verwKonturen)-1]:=findeKontur(erstesArgument(s),nil,Konturen,false); + verwKonturen[length(verwKonturen)-1]:=findeKontur(erstesArgument(s),nil,Wertes,Konturen,false); if (verwKonturen[length(verwKonturen)-1]<0) or (verwKonturen[length(verwKonturen)-1]>=length(Konturen^)) then begin gibAus('Die Kontur gibt es nicht!',3); aufraeumen; @@ -3866,54 +3919,6 @@ begin // bearbeitet nur den Hauptteil (außer erster und mittlerer Zeile/Spalte) gibAus('Alle FFT2dNBThreads fertig!',1); end; -function tWerte.callBackGetValue(s: string): extended; -var - i: longint; -begin - result:=nan; - if startetMit('Kontur[',s) or startetMit('Konturen[',s) then begin - if pos('].',s)=0 then begin - gibAus('Syntaxfehler, '']'' fehlt!',3); - exit; - end; - i:=findeKontur(erstesArgument(s,'].'),nil,Konturen,false); - if i<0 then begin - gibAus('Finde Kontur nicht!',3); - exit; - end; - if s='xmin' then result:=Konturen^[i].xmin - else if s='xmax' then result:=Konturen^[i].xmax - else if s='tmin' then result:=Konturen^[i].tmin - else if s='tmax' then result:=Konturen^[i].tmax - else if s='Breite' then result:=Konturen^[i].xmax-Konturen^[i].xmin - else if s='Hoehe' then result:=Konturen^[i].tmax-Konturen^[i].tmin - else gibAus('Kenne Bezeichner '''+s+''' nicht als Eigenschaft einer Kontur!',3); - exit; - end; - if startetMit('Wert[',s) or startetMit('Werte[',s) or startetMit('Wertes[',s) then begin - if pos('].',s)=0 then begin - gibAus('Syntaxfehler, '']'' fehlt!',3); - exit; - end; - i:=findeWerte(erstesArgument(s,'].'),nil,wertes,Konturen,false); - if i<0 then begin - gibAus('Finde Werte nicht!',3); - exit; - end; - if s='xmin' then result:=wertes^[i].Transformationen.xstart - else if s='xmax' then result:=wertes^[i].Transformationen.xstop - else if s='tmin' then result:=wertes^[i].Transformationen.tstart - else if s='tmax' then result:=wertes^[i].Transformationen.xstop - else if (s='wmin') or (s='minw') then result:=wertes^[i]._minw - else if (s='wmax') or (s='maxw') then result:=wertes^[i]._maxw - else if s='Breite' then result:=wertes^[i].Transformationen.xstart-wertes^[i].Transformationen.xstop - else if s='Hoehe' then result:=wertes^[i].Transformationen.tstart-wertes^[i].Transformationen.tstop - else gibAus('Kenne Bezeichner '''+s+''' nicht als Eigenschaft von Werten!',3); - exit; - end; - gibAus('Ich kenne den Bezeichner '''+s+''' nicht!',3); -end; - function tWerte.exprtofloat(st: boolean; s: string): extended; begin case genauigkeit of @@ -4908,9 +4913,9 @@ end; // tKontur ********************************************************************* -constructor tKontur.create; +constructor tKontur.create(Kont: pTKonturenArray; wert: pTWerteArray); begin - inherited create; + inherited create(Kont,wert); farbe.rgbRed:=$00; farbe.rgbGreen:=$00; farbe.rgbBlue:=$00; @@ -4976,6 +4981,11 @@ begin result:=max(result,orte[i]['y']); end; +function tKontur.exprtofloat(st: boolean; s: string; kvs: tKnownValues): extended; +begin + result:=matheunit.exprtofloat(st,s,kvs,@callBackGetValue); +end; + function tKontur.init(st: boolean; var f: tMyStringlist; w: pTWerteArray; mt: longint): boolean; var s,xmi,xma,tmi,tma: string; @@ -5014,7 +5024,7 @@ begin gibAus('Diese Kontur hat schon Werte!',3); exit; end; - if not liesVonDatei(st,s,strtofloat(xmi),strtofloat(xma),strtofloat(tmi),strtofloat(tma)) then exit; + if not liesVonDatei(st,s,exprtofloat(st,xmi,nil),exprtofloat(st,xma,nil),exprtofloat(st,tmi,nil),exprtofloat(st,tma,nil)) then exit; continue; end; if startetMit('Werte:',s) then begin @@ -5990,7 +6000,7 @@ begin result:=length(pws^)-1; end; -function findeKontur(s: String; f: tMyStringlist; pks: pTKonturenArray; darfErstellen: boolean): integer; +function findeKontur(s: String; f: tMyStringlist; pws: pTWerteArray; pks: pTKonturenArray; darfErstellen: boolean): integer; var i: integer; istZahl: boolean; @@ -6021,7 +6031,7 @@ begin end; setlength(pks^,length(pks^)+1); - pks^[length(pks^)-1]:=tKontur.create; + pks^[length(pks^)-1]:=tKontur.create(pks,pws); pks^[length(pks^)-1].bezeichner:=s; i:=f.count-1; |