Hvad bilder du dig ind? (:-) Man bruger sgu da ikke goto i andet end batch-filer (det mener jeg!). Dit eksempel er rigtignok næsten uforståeligt og som førstegangs eksemplar er det ret dårligt. Brugen af goto er en oplagt synder, mens de manglende indryk, overflødige linjeskift deslige, gør det grimt. Derfor, som afslutning på min autonome kritik: Lær' at indrykke koden og drop goto.
I nedenstående - og jeg er ikke sikker på jeg har forstået koden - er variable ændret til konstanter og så er goto fjernet. Desuden er min og max omdøbt da de også er funktionsnavne i Delphi (i math-unitten). Endelig er kaldet lavet om til en generel procedure der returnerer de tre værdier (hvad den skal gøre når stigningen er 0.50 kunne jeg ikke lige hitte ud af).
MaxFaktor = 0.032; // !! NorFaktor = 0.055; MinFaktor = 0.091; begin aMaxValue := 0.0; // Initializér variablene. Er ellers garanteret af Delphi men jeg gør det alligevel. aNorValue := 0.0; aMinValue := 0.0;
if aStigning = 0.45 then begin if (aDiameter >= MinDiameter) and (aDiameter <= MaxDiameter) then begin // Glemte du en begin/end her? aMinValue := aDiameter + GenerelFaktor - MinFaktor; // Ingen grund til paranteserne aNorValue := aDiameter + GenerelFaktor - NorFaktor; aMaxValue := aDiameter + GenerelFaktor - MaxFaktor; end; end else if aStigning = 0.50 then // Nemlig - hvad du nu vil gøre her? end;
I dit program kan du kalde funktionen således:
procedure TForm3.Button1Click(Sender: TObject); var MinValue: double; NorValue: double; MaxValue: integer; begin BeregnTraad(StrToFloatDef(Edit1.Text,0.0), // StrToFloatDef sikrer at noget validt sendes StrToFloatDef(Edit2.Text,0.0), MinValue, NorValue, MaxValue); end;
jeg beklager hvis, du ikke helt syntes om det. men brugte det som udgangs punkt, og så det "virkede" så arbejder vidre der fra.. kan godt se det ikke er godt i forhold til dit.:-)
nu har jeg så valgt at bruge dit, men er løbet ind i et andet problem så.
jeg får fejlen [DCC Error] Unit3.pas(73): E2033 Types of actual and formal var parameters must be identical
procedure TForm3.Button1Click(Sender: TObject); var MinValue: double; NorValue: double; MaxValue: double; // Af en eller anden grund var denne blevet en integer
... og så kan man ikke kalde en procedure der forventer en double.
Mit anti-goto indlæg bør tages med lidt humor, selvom det ord fremkalder isninger på ryggen af de smalskuldrede programmører; Pascal-typen i særdeleshed. Man skal starte et sted, jeg synes bare ikke du kunne starte værre. Kan huske da jeg gik til programmering i folkeskolen (foregik i Comal-80 på Regnecentralens maskiner). Allerede dengang kommenterede jeg lærerens beregningseksempel som indeholdt goto'er - og blev smidt af holdet.
Man kan i øvrigt godt lave ovenstående beregning i en batch-fil idet fortolkeren kan behandle simple udtryk. Prøv bare fra en prompt at skrive: set /a 200 + 12 - 13. Den returnerer 199
OK. Lige lidt forklaring. Jeg introducerede dig lige for modulariseringen idet jeg pakkede koden ind i en procedure som jeg kaldte med de to input-parametre. Ordet "var" foran aMinValue, aNorVal ... betyder at man laver en "call by reference" (sender pointeren afsted i stedet for den værdi der ligger på stedet hvor pointeren peger). Det betyder at, retter du inde i proceduren, bliver det også returneret til stedet hvor proceduren blev kaldt.
Ordet "const" i en procedures parametersektion betyder at du får fejl hvis du retter aDiameter inde i proceduren. Desuden, i gamle dage, har det bevirket at den oversatte koden blev effektiviseret. Dette skulle ikke længere være tilfældet, jvf. M. Cantu.
Et sidste ord om parametre. En de facto standard er at sætte et "a" foran parametre. Det er lettere at læse koden når man øjeblikkelig kan bestemme hvorfra variablen stammer. En anden de facto regel er at variable i den private sektion af en klasse foranstilles med et "f" - men det kommer du til senere.
Skriv endelig hvis du vil have noget uopfordret kritik på din kode.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.