Page 1 of 5 1 2 3 ... LastLast
Results 1 to 15 of 74

Thread: Integer Overflow bij sommige getallen

  1. #1

    Integer Overflow bij sommige getallen

    Hoe moeilijk kan het zijn??
    Ik heb 12x12 edit boxjes gecreate genaamd Hokje[x].
    Er hoeven alleen maar rijtjes en kolommen + totaal = MC opgeteld te worden.
    De getallen in de vakjes mogen niet hoger dan de opgegeven waarde zijn.
    Wat wil het geval?
    Als ik een totaalwaarde hoger dan 36 opgeef bijvoorbeeld 50 dan krijg ik een
    Integer Overflow als ik ergens het getal 44 of 37 invul!
    (Het kan zijn dat er meer foute getallen zijn maar nog niet gevonden)
    De regel die de foutmelding veroorzaakt is gewoon een optelsommetje!
    Code:
      for y := 0 to High(hokje) do      // is van hokje 1 t/m 144
      begin
       if hokje[y].Text <> '' then          
       begin
         if StrToInt(hokje[y].text) > 0 then    
         begin
            Z:=strtoint(hokje[y].Text);
            MC:=MC+Z;                    // < HIER GAAT HET FOUT Bij Getal 37 of 44
         end;
       end;
      end;
    Voor de duidelijkheid heb ik wat overbodige regeltjes weggelaten.
    Het kostte me gister een dag en kom er maar niet achter.

    Click image for larger version. 

Name:	Uittellen.jpg 
Views:	48 
Size:	33.8 KB 
ID:	8189

  2. #2
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    De cruciale details, de types van MC en Z zitten er niet in.

  3. #3
    Voor de overzichtelijkheid had ik Z erbij gezet i.p.v.:
    Inc(MC,strtoint(hokje[y].Text));
    MC en Z zijn als integer
    variabelen wel gedeclareerd.
    In het voorbeeldje zitten ze niet maar dat maakt niet uit.
    Als ik eerst een paar andere getallen doe en dan 44 of 37
    dan gaat het vaak wel goed maar is niet te voorspellen.

    Click image for larger version. 

Name:	Uittellen2.jpg 
Views:	45 
Size:	97.0 KB 
ID:	8190
    Last edited by Marieke; 26-Sep-21 at 15:05.

  4. #4
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Initializeer je MC op 0 voor de lus ?

  5. #5
    Quote Originally Posted by marcov View Post
    Initializeer je MC op 0 voor de lus ?
    Natuurlijk...

  6. #6
    Post nou alsjeblieft die code inclusief declaraties en initializaties, i.p.v. in tekst te omschrijven hoe het zit. Het is zo verschrikkelijk lastig om foutjes te spotten in code die je niet kan zien.
    1+1=b

  7. #7
    Ik weet niet of dat duidelijker is - Ik dacht het zo eenvoudig mogelijk te houden.
    Alles heb ik zo'n beetje aan en uitgeschakeld en toen bleef alleen die boosdoener
    over op regel 21. >> Inc(MC,strtoint(hokje[y].Text));
    Code:
    Procedure Kaarttel;
    var k, y ,z: integer;
        blVlag: bool;
    begin
      kaartcode:='';
      k:=0; MC:=0; z:=0;
      // WAARDE OPTELLINGEN:
      K1:=0;K2:=0;K3:=0;K4:=0;K5:=0;K6:=0;K7:=0;K8:=0;K9:=0;K10:=0;K11:=0;K12:=0;
      AA:=0;BB:=0;CC:=0;DD:=0;EE:=0;FF:=0;GG:=0;HH:=0;II:=0;JJ:=0;KK:=0;LL:=0;
      blVlag:=false;
    
      for y := 0 to High(hokje) do                    // is van hokje 1 t/m 144
      begin
       inc(k,1);                                       // Rijtjes van 12 maken
        //-----
        if hokje[y].Text <> '' then                    // Edithokje is standaard tekst
        begin
          blVlag:=true;
          if StrToInt(hokje[y].text) > 0 then 
          begin
           Inc(MC,strtoint(hokje[y].Text));           // << HIER GAAT HET FOUT
           if MaxW < 36 then
             kaartcode:=kaartcode+' - '+kaartxt[strtoint(hokje[y].Text)]
           else
             kaartcode:=kaartcode+' - '+(hokje[y].Text);
          end;
        end;
        //-----
        if k=12 then
        begin
         if blVlag=true then     // Knip de verschillende Tekststrings in stukjes van 12
         begin
          kaartcode:=kaartcode+Chr(10);
          kaartcode:=stringreplace(kaartcode,chr(10)+' -',chr(10),[]);
         end;
         k:=0;
         blVlag:=false;
        end;
        //-----
      end;
      Delete(kaartcode,1,2);  // De 1e 2 karakters uit de Tekststring strippen.
      //--------------------
      if MC>MaxW then MC:=MC mod MaxW;
      if (MC>0) and (MC<MaxW) then MC:=MC;   // Indien RESTWaarde is 0!
      if (MaxW=36)and (MC>0) and (MC<37) then MyForm.MagCard.Caption:=kaartxt[MC]
         else MyForm.MagCard.Caption:='Nr. '+inttostr(MC);
    end;

  8. #8
    for y := 0 to High(hokje) do // is van hokje 1 t/m 144
    Hokje is gedefinieerd als dynamische array of arra[0..143]?
    (Dus niet toevallig als array[1..144] of TSomeType?)
    Als je toch High() gebruikt, waarom niet ook dan Low()?

    En waarom BOOL i.p.v. Boolean (heeft hier verder niets mee te maken, maar ik begrijp de logica van deze keuze niet zo).

    Bart

  9. #9
    Waarom zet je niet gewoon een breakpoint en step je door je code heen? Waarschijnlijk zie je dan redelijk snel waar en waarom het verkeerd gaat .

  10. #10
    Senior Member Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    2,084
    Quote Originally Posted by Bart B View Post
    heeft hier verder niets mee te maken, maar ik begrijp de logica van deze keuze niet zo.
    Iedere programmeur heeft zo zijn trekjes, ieder heeft zo zijn voorkeur.
    Ik zou bijvoorbeeld nooit voor 144 editboxen gekozen hebben, ik denk dat een stringgrid van 12 x 12 prima kan voldoen.
    Maar goed, respecteer de keuze. Er zijn vele manieren die tot een oplossing leiden.
    10.4.2, Delphi2010, of Lazarus 2.2.0

  11. #11
    Eens met Luigi dat debuggen, (steppen, breakpoints) de handigste manier is. Het geposte deel is nog steeds niet eenvoudig te runnen en debuggen voor wie de rest van de code niet heeft.

    En in aanvulling op Luigi; je kan conditionele breakpoints zetten. Als je bijvoorbeeld de indruk hebt dat het fout gaat bij hokjes met een waarde van 44, kan je op die regel een breakpoint zetten met de conditie hokje[y].Text = '44'. Dat kan helpen om te runnen tot het juiste moment, zonder dat je een halfuur door je code moet steppen.

    Als de aanname klopt, dan zal je de exception zien zodra je op F8 drukt na deze breakpoint (gewoon om te toetsen of dat inderdaad het moment is).

    En als je nog een keer runt en stopt op die breakpoint, dan kan je bovendien de waarden van alle variabelen bekijken door erover te hoveren met de muis, of door 'watches' te maken op die expressies (ctrl+F5). Dat helpt waarschijnlijk de gedachten te ordenen en aannames te toetsen. Zijn y en k bijvoorbeeld wat je verwacht, wat is de waarde van MC voor de optelling.

    Mocht het toch lastig zijn het juiste moment te bepalen, dan kan het ook helpen om binnen de loop wat informatie weg te schrijven naar een memo of een tekstbestand. Bijvoorbeeld de waarden van y, k, MC en hokje[y].text om te beginnen.
    1+1=b

  12. #12
    Quote Originally Posted by Bart B View Post
    Hokje is gedefinieerd als dynamische array of arra[0..143]?
    (Dus niet toevallig als array[1..144] of TSomeType?)
    Als je toch High() gebruikt, waarom niet ook dan Low()?
    En waarom BOOL i.p.v. Boolean (heeft hier verder niets mee te maken, maar ik begrijp de logica van deze keuze niet zo).
    Bart
    Dat Bool kan ik wel veranderen is een stukje code uit 2013 wat ik voor diverse doelen gebruik.
    Code:
    hokje: array[0..143] of TEdit;

  13. #13
    Quote Originally Posted by luigi View Post
    Waarom zet je niet gewoon een breakpoint en step je door je code heen? Waarschijnlijk zie je dan redelijk snel waar en waarom het verkeerd gaat .
    Ik weet waar het verkeerd gaat bij die regel maar ik zal nog eens kijken met een breakpoint.

  14. #14
    Quote Originally Posted by Wok View Post
    Iedere programmeur heeft zo zijn trekjes, ieder heeft zo zijn voorkeur.
    Ik zou bijvoorbeeld nooit voor 144 editboxen gekozen hebben, ik denk dat een stringgrid van 12 x 12 prima kan voldoen.
    Maar goed, respecteer de keuze. Er zijn vele manieren die tot een oplossing leiden.
    Ik zat er ook net aan te denken om een stinggrid te proberen (heb ik nog niet eerder gebruikt als amateur),
    het is al een ouder stukje code en ondertussen kan ik weer eens wat bijleren.

  15. #15
    Upload gewoon het project hier of in ieder geval de complete source van deze unit, dan krijg je het snelst antwoord, het blijft nu een beetje glazen bol.

    Bart

Page 1 of 5 1 2 3 ... LastLast

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
  •