Avatar billede jaqalou Nybegynder
14. maj 2008 - 23:46 Der er 10 kommentarer og
1 løsning

integer, double fejl :P

hej

jeg sidder her om "fusker" lidt med noget program for første gang, og ville lige lavet et simpelt program.
der regner diameter ud. med

Men jeg får fejl når jeg prøver at køre det.

jeg ved godt det ser meget rodet og sjusket ud, men håber i bære over med mig, og kan se sammen hængen.

det er en "first time", så håber det bliver bedre engang.




unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm3 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
var
  d:Double;

  Min:Double;
  Nor:Double;
  Max:Integer;

  temp : Double;
  Diameter : Double ;
  Stigning: Double;

  label
  gotoend;

  label
  gotoa;
  label
  gotob;



begin


Stigning := StrToFloat (Edit2.Text);


  if Stigning = 0.45 then
    goto gotoa
    else
    if stigning =0.5 then
    goto gotob
    else
    if stigning =0.5 then
    goto gotob;




  begin
  Diameter := StrToFloat (Edit1.text);

  gotoa:

  temp:= 0.189;
  if (Diameter >= 1.4) and (Diameter<=2.8) then
  Max:= ((Diameter+temp)-(0.032));
  Nor:= ((Diameter+temp)-(0.055));
  min := ((Diameter+temp)-(0.091));
  showmessage ('Måletråd 0,290');
  showmessage(Diameter);
  showmessage (Diameter);
  showmessage (Min);

  goto gotoend;


  gotob:
  showmessage ('nemlig');

  goto gotoend;

  end ;








gotoend :

end;

end.
Avatar billede erikjacobsen Ekspert
14. maj 2008 - 23:57 #1
Du skal nok bare ændre
  Max:Integer;
til
  Max:Double;
Avatar billede jaqalou Nybegynder
15. maj 2008 - 07:05 #2
hej
dette er desværre ikke løsningen. :(

det ser ud til at der  hvor den fejler er i Diameter.

hcor jeg får fejlen ikke string eller double,
jeg har også prøvet med integer og får så samme fejl bare på integer.

det jeg tænker er at det er noget
Diameter := StrToFloat (Edit1.text);

der fejler, men er ikke sikker..
Avatar billede js_delphi Nybegynder
15. maj 2008 - 08:15 #3
Hvilken fejl faar du?
Avatar billede hrc Mester
15. maj 2008 - 08:18 #4
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).

procedure BeregnTraad(const aDiameter, aStigning: double; var aMinValue, aNorValue, aMaxValue: double);
const
  GenerelFaktor = 0.189;

  MinDiameter = 1.4;
  MaxDiameter = 2.8;

  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;
Avatar billede jaqalou Nybegynder
15. maj 2008 - 19:22 #5
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


også var jeg sat af...
Avatar billede hrc Mester
15. maj 2008 - 23:14 #6
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
Avatar billede hrc Mester
15. maj 2008 - 23:15 #7
(ordet der fremkalder isninger er "goto", ikke "humor")
Avatar billede jaqalou Nybegynder
15. maj 2008 - 23:29 #8
jeg regnede som også med der var lidt humor gemt der et sted :-)
vælger at tage det som konstruktiv kritik.

håber at bliver bedre med tiden. :D

smider du ikke et svar, så får du lige point.
så vil jeg lige se om jeg kan finde ud af din kode. :)
Avatar billede hrc Mester
16. maj 2008 - 08:13 #9
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.
Avatar billede jaqalou Nybegynder
16. maj 2008 - 16:18 #10
Det virker meget logisk lige ved første øjekast, nu er det så lige det, om jeg kan kan få det vendt korrekt i hovedet. :-)

kan være jeg skriver til dig, når jeg kommer vidre med det.

men du skal have mange tak for nu.
Avatar billede hrc Mester
17. maj 2008 - 20:41 #11
Skal nok prøve at hjælpe.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester