Page 5 of 5 FirstFirst ... 3 4 5
Results 61 to 74 of 74

Thread: Integer Overflow bij sommige getallen

  1. #61
    Quote Originally Posted by Bart B View Post
    Mooi.
    Blijft (voor mij) dit stukje code in KaartTel:
    Delphi Code:
    1. if MC>MaxW then MC:=MC mod MaxW;
    2.   //OPM BB: Onderstaande regel doet helemaal niets !!!
    3.   if (MC>0) and (MC<MaxW) then MC:=MC;   // RESTWaarde kan natuurlijk 0 zijn!
    Wat wil je precies bereiken hier?
    Dat is veranderd in:
    if (MC>0) and (MC<MaxW) then MC:=MC else MC:=MaxW;
    Omdat de uitkomst misschien 0 kan zijn? En dat mag niet.

    Quote Originally Posted by Bart B View Post
    En dit (direct eronder):
    Delphi Code:
    1. if (MaxW=36)and (MC>0) and (MC<37) then
    2.     lbMagCard.Caption:=kaartxt[MC]
    3.   else
    4.     lbMagCard.Caption:='Nr. '+inttostr(MC);
    Dat is omdat de tekst die bij deze 36 kaarten hoort anders is dan bijv. Tarot die 78 kaarten telt en die heb ik er nog niet bij.

    Quote Originally Posted by Bart B View Post
    De waarde van MaxW maakt hier niet uit, het gaat erom dat MC in de range 0..36 zit: de range van je Kaartxt array.
    Ik zou de conditie daarom veranderen in:
    Delphi Code:
    1. if MC in [Low(Kaartxt)..High(Kaartxt)] then
    Zo is ook direct duidelijk waar die grenzen vandaan komen.
    Bart
    Het is niet de bedoeling dat MC 0 is maar in Kaartcode mag het wel.
    Dus er zit wel een [0] index in de Kaartxt ja...
    Last edited by Marieke; 30-Sep-21 at 19:34.

  2. #62
    Quote Originally Posted by Marieke View Post
    Dat is veranderd in:
    if (MC>0) and (MC<MaxW) then MC:=MC else MC:=MaxW;
    Omdat de uitkomst misschien 0 kan zijn? En dat mag niet.
    De code "MC:=MC" is natuurlijk nog steeds een beetje zinloos (gelukkig is de compiler waarschijnlijk slim genoeg om hem te verwijderen).

    Op dit punt in de code kan MC nooit >= MaxW zijn, aangezien in de regel erboven dit staat:
    Delphi Code:
    1. if MC>MaxW then
    2.     MC:=MC mod MaxW;

    Dus je hoeft alleen te checken of MC nul is.
    Als dat zo is, dient hij kennelijk MaxW te worden.
    Daar had ik een functie voor gemaakt (NotZero), dus dan kan het zo worden:

    Delphi Code:
    1. if MC>MaxW then
    2.     MC:=MC mod MaxW;
    3.   MC := NotZero(MC, MaxW);


    Quote Originally Posted by Marieke View Post
    Dat is omdat de tekst die bij deze 36 kaarten hoort anders is dan bijv. Tarot die 78 kaarten telt en die heb ik er nog niet bij.
    Maar zoals het er nu staat klopt het niet.
    Tenzij je als MaxW niet 36 is van plan bent om een andere tekst array te gaan gebruiken?
    Zoals het er nu staat wordt de kaartxt array NIET gebruikt als MaxW<>36.

    Quote Originally Posted by Marieke View Post
    Het is niet de bedoeling dat MC 0 is maar in Kaartcode mag het wel.
    Dus er zit wel een [0] index in de Kaartxt ja...
    In dat geval wordt het
    Delphi Code:
    1. if MC in [Low(Kaartxt)..High(Kaartxt)] then

    Uiteindelijk wordt het dan zoiets als dit:
    Delphi Code:
    1. ...
    2.   if MC>MaxW then
    3.     MC:=MC mod MaxW;
    4.   MC := NotZero(MC, MaxW);
    5.   if MC in [1..High(Kaartxt)] then   //0 is geen valide kaart en heeft geen kaart text
    6.     lbMagCard.Caption:=kaartxt[MC]
    7.   else
    8.     lbMagCard.Caption:='Nr. '+inttostr(MC);

    Overigens zou ik ook MC een wat duidelijkere naam geven (MagicCardNr of zoiets).

    Bart
    Last edited by Bart B; 30-Sep-21 at 23:28. Reason: typo

  3. #63
    @ Bart,
    Maar zoals het er nu staat klopt het niet.
    Tenzij je als MaxW niet 36 is van plan bent om een andere tekst array te gaan gebruiken?
    Zoals het er nu staat wordt de kaartxt array NIET gebruikt als MaxW<>36.
    En dat is ook de bedoeling.... Want er komen andere tekst Array's bij.

    Bedankt voor de Tips - Ik ga ze doornemen.
    Maar het gaat er ook om dat ik zelf begrijp wat er staat. Als ik variabelen een naam geef doe ik dat op mijn manier en als
    daar wat aan veranderd moet worden dan doe ik dat in verloop van tijd. Dit is maar een basis idee wat nog ontwikkeld moet worden.
    Ik schrijf de syntax niet altijd even precies en ik weet in de meeste gevallen wel dat dat beter zou moeten en vaak verander ik dat later als ik dat kan.
    Qua logische redeneringen schort er nog wel eens wat aan en ik weet gewoon niet genoeg, maar dat is niet erg.
    Ik ben al tevreden als het gewoon doet wat de bedoeling is en als het er in mijn ogen netjes uitziet.

  4. #64
    Quote Originally Posted by Marieke View Post
    @ Bart,
    En dat is ook de bedoeling.... Want er komen andere tekst Array's bij.

    Bedankt voor de Tips - Ik ga ze doornemen.
    Prima.

    Have fun!

    Bart

  5. #65
    Quote Originally Posted by Bart B View Post
    Prima.
    Have fun!
    Bart
    Ik heb niet zoveel fun Bart.
    Als ik een String Constante [0..44] wil toevoegen in de Data Unit dan wordt die niet herkend: 'Undeclared identifier'.
    Er staat al 1 String Constante [0..36] en die wordt wel herkend waarom dan geen 2e?
    Als ik de String Constante [0..44] in de Hoofd Unit plaats dan gaat het wel goed maar dat heb ik liever niet want komen er nog meer bij.

  6. #66
    Laat even de code zien van de complete Data unit dan.
    Ik gok dat je er gewoon overheen kijkt.

    Bart

  7. #67
    Quote Originally Posted by Bart B View Post
    Laat even de code zien van de complete Data unit dan.
    Ik gok dat je er gewoon overheen kijkt.Bart
    Het is (nog) een heel eenvoudige Unit.
    Dit is alles wat erin staat:
    unit Data;

    interface

    Code:
    Const kaartxt: array[0..36] of string =
    (' ','1) Ruiter','2) Klaverblad','3) Schip','4) Huis','5) Boom','6) Wolken','7) Slang','8) Lijkkist',
    '9) Ruiker','10) Zeisen','11) Roede','12) Vogels','13) Kindje','14) Vosje','15) Beer','16) Ster','17) Ooievaar',
    '18) Hond','19) Toren','20) Tuin','21) Berg','22) Wegen','23) Muizen','24) Hart','25) Ring','26) Boek','27) Brief',
    '28) Heer','29) Vrouw','30) Lelie','31) Zonne','32) Maantje','33) Sleutel','34) Vissen','35) Anker','36) Kruis');
    
    Const reveritxt: array[0..44] of string =
    (' ','1) Ruiter','2) Klaverblad','3) Schip','4) Huis','5) Boom','6) Wolken','7) Slang','8) Lijkkist',
    '9) Ruiker','10) Zeisen','11) Roede','12) Vogels','13) Kindje','14) Vosje','15) Beer','16) Ster','17) Ooievaar',
    '18) Hond','19) Toren','20) Tuin','21) Berg','22) Wegen','23) Muizen','24) Hart','25) Ring','26) Boek','27) Brief',
    '28) Heer','29) Vrouw','30) Lelie','31) Zonne','32) Maantje','33) Sleutel','34) Vissen','35) Anker','36) Kruis',
    '37) Tijd','38) Brug','39) Dobbelsteen','40) Masker','41) Bron','42) Kompas','43) Doolhof','44) Loep');
    
    implementation
    
    end.

  8. #68
    Wat gaat er fout dan?
    Compiler error, run-time error (graag exacte tekst van de foutmelding)?

    Dat (die twee arrays in Data.pas) compileert hier prima.

    Bart

  9. #69
    Sorry dat dit ondertussen ergens anders over gaat dan het topic...

    Quote Originally Posted by Bart B View Post
    Wat gaat er fout dan?
    Compiler error, run-time error (graag exacte tekst van de foutmelding)?
    Dat (die twee arrays in Data.pas) compileert hier prima.Bart
    Dat had ik vermeld - '' 'Undeclared identifier'. - MAAR IK BEN ERUIT !!

    Ik heb 2 versies van het project 1 een voortzetting van het origineel en een 2e versie met
    voornamelijk jouw suggesties erin. Die doet het dus wel met de extra Constante in de Data Unit.
    Toen heb ik alle declaraties in project 1 in dezelfde volgorde gezet als in jouw versie en dat ging goed.
    Maar begrijpen doe ik het niet.
    Als ik een nieuwe procedure e/o variabele maak kan ik die niet onder de andere in Private declareren.
    Zie regel 92+96:
    Code:
    001   unit Kaartje;
    002   
    003   interface
    004   
    005     uses
    006       Windows, Messages,(...);
    007   
    008     const
    009       ColCount = 12;
    010       RowCount = 12;
    011       NrEdits = 144;    // = ColCount x RowCount
    012   
    013     type
    014       THokjes = array[0..NrEdits-1] of TEdit;
    015       THokjesValues = array[0..NrEdits-1] of Integer;
    016       TRowLabels = array[0..RowCount] of TLabel;
    017       TColLabels = array[0..ColCount] of TLabel;
    018   
    019     {TMyForm}
    020       TMyForm = class(TForm)
    021       btAantalKrt: TSpeedButton;
    022       procedure btAantalKrtClick(Sender: TObject);
    023   
    024     private
    025    {Private declarations}
    026       Hokjes: THokjes;
    027       MC, MaxW: Integer;
    028       KaartCode:string;
    029       RowLabels: TRowLabels;
    030       ColLabels: TColLabels;
    031   
    032       procedure CreateRowColLabels;
    033       procedure CreateEditBoxes;
    034       procedure OnEditBoxesKeyPress(Sender: TObject; var Key: Char);
    035       procedure OnEditBoxesKeydown (Sender: TObject; var Key: Word; Shift: TShiftState);
    036       procedure OnEditBoxesChange(Sender: TObject);
    037       procedure RowColToIndex(const ARow, ACol: Integer; out AIndex: Integer);
    038       procedure IndexToRowCol(const AIndex: Integer; out ARow, ACol: Integer);
    039   
    040       function GetHokjesValue(ARow, ACol: Integer): Integer; overload;
    041       function GetHokjesValue(AIndex: Integer): Integer; overload;
    042   
    043       procedure Kaarttel;
    044       procedure Klembord;
    045       procedure RijenTel;
    046       procedure RijenLeeg;
    047       procedure KolommenTel;
    048       procedure KolommenLeeg;
    049       procedure Wissen;
    050   
    051     published
    052       btCopyCode: TButton;
    053       Shape1: TShape;
    054       btWissen: TButton;
    055       MAXDeck: TEdit;
    056       lblCol1: TLabel;
    057       (...)
    058       TelRijenCB: TCheckBox;
    059       TelKolommenCB: TCheckBox;
    060       TelAllesCB: TCheckBox;
    061       btUittellen: TButton;
    062       PopupMenu1: TPopupMenu;
    063       N29kaarten1: TMenuItem;
    064       N310kaarten1: TMenuItem;
    065       N3201: TMenuItem;
    066       btHelp: TButton;
    067       lbMagCard: TLabel;
    068       N515kaarten1: TMenuItem;
    069       Label1: TLabel;
    070       lbHorizon: TLabel;
    071       lbVertial: TLabel;
    072       URLlabel: TLabel;
    073       Label2: TLabel;
    074       meKlembord: TMemo;
    075       procedure btCopyCodeClick(Sender: TObject);
    076       procedure FormCreate(Sender: TObject);
    077       procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    078       procedure btWissenClick(Sender: TObject);
    079       procedure FormShow(Sender: TObject);
    080       procedure TelRijenCBClick(Sender: TObject);
    081       procedure TelKolommenCBClick(Sender: TObject);
    082       procedure TelAllesCBClick(Sender: TObject);
    083       procedure btUittellenClick(Sender: TObject);
    084       (...)
    085       
    086     Public
    087       {Public declarations}
    088       property HokjesValues[ARow, ACol: Integer]:Integer read GetHokjesValue;
    089   
    090   end;
    091   
    092      Procedure WisselDek;
    093   
    094   var
    095      MyForm: TMyForm;
    096      Deknr:Integer;
    097   
    098   implementation
    099   
    100   uses
    101      Data;
    102   
    103   {$R *.dfm}
    104

  10. #70
    Ik heb geen idee of Delphi zoiets heeft als code completion.
    In Lazarus zou ik "procedure Wisseldek" declareren in TMyForm (dat mag private, protected of public zijn) en dan Ctrl+Shift+C en dan krijg ik in de implementatie de juiste definitie van "procedure TMyForm.DekWissel".

    Ik zie geen enkele reden waarom je geen nieuwe methode aan je TMyForm zou mogen toevoegen.

    Wat gebeurt er als je "procedure DekWissel" toevoegt aan de definitie van TMyForm (en die weghaalt uit de globale sectie van je unit) en een lege implementatie maakt van "procedure TMyForm.DekWissel" (en een evntuele oude implementatie van "procedure DekWissel" weghaalt) en dan de boel probeert te compileren?

    Dit zou zonder enig probleem moeten kunnen werken.

    Bart

  11. #71
    Ik ben heel wat aan het schuiven geweest maar het zat hem in de Procedurenaam.
    Door die de juiste naam te geven werd het wat logischer.
    Goed = Procedure TMyForm.DeckWissel.
    Fout = Procedure Deckwissel.


    Code:
    01    (...)
    02    { TMyForm }
    03        TMyForm = class(TForm)
    04        btAantalKrt: TButton;
    05        procedure btAantalKrtClick(Sender: TObject);
    06        Procedure DeckWissel;                      // Lukt met naam: Procedure TMyForm.DeckWissel
    07                                                               // Dus niet met: Procedure Deckwissel
    08      private
    09    { Private declarations }
    10        FHokjes: THokjes;
    11        MC, MaxW, Deknr: Integer;               // Ook een nieuwe variabele (Deknr)  kan ik nu hier zetten
    12        KaartCode:string;
    13        RowLabels: TRowLabels;
    14        ColLabels: TColLabels;
    15        FSuppressEditBoxesOnChange: Boolean;
    16        procedure CreateEditBoxes;
    17        procedure CreateRowColLabels;
    18        (...)
    19     end;
    20        var
    21          MyForm: TMyForm;
    22   
    23        implementation
    24     
    25        uses
    26          Data;
    27     
    28         {$R *.dfm}  
    29         
    30     Procedure TMyForm.DeckWissel;    
    31     // Zo moest het....

  12. #72
    Ctrl+Shift+C, class completion, werkt ook in Delphi. Maar alleen op classes, niet op losse procs/functions.

    Het is wel handig om `Procedure DeckWissel` ergens onder `private`, `protected` of `public`. Alles wat bovenaan staat, boven deze secties, wordt in principe door Delphi zelf beheerd terwijl je in de form designer zit. Dit is waar de componenten en event-handlers van je form worden toegevoegd.
    1+1=b

  13. #73
    Quote Originally Posted by GolezTrol View Post
    (...) Het is wel handig om `Procedure DeckWissel` ergens onder `private`, `protected` of `public`. Alles wat bovenaan staat, boven deze secties, wordt in principe door Delphi zelf beheerd terwijl je in de form designer zit. Dit is waar de componenten en event-handlers van je form worden toegevoegd.
    Ik heb het verplaatst en dat ging goed. Ik heb al heel wat heen en weer geschoven en kreeg steeds foutmeldingen.
    Bart heeft alles netjes op zijn plek gezet maar voor die tijd zette ik alle componenten en procedures / Functies onder Type en variabelen onder Var.
    Een enkele keer heb ik dat anders gedaan. Ik weet dat het niet zo hoort maar vond het wel overzichtelijk zo...
    Ik ga de 'Delphi Programming 4 Beginners' er eens op naslaan!

  14. #74
    Quote Originally Posted by GolezTrol View Post
    Ctrl+Shift+C, class completion, werkt ook in Delphi. Maar alleen op classes, niet op losse procs/functions.
    Ha, ha: staan we voor

    Bart

Page 5 of 5 FirstFirst ... 3 4 5

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •