Page 2 of 2 FirstFirst 1 2
Results 16 to 22 of 22

Thread: print loopje

  1. #16
    Je komt nu al een stuk verder.
    Let er op dat je Counter 0 (nul) maakt, maar direct (!) daarna weer met 1 ophoogt (Inc). Dat betekent dat deze dus de waarde 1 krijgt, bij het volgende karakter 2 en zo ben je weer bij MaxChar. Een 'else' zal hier wonderen doen.
    (Met de debugger had je dit kunnen zien)

    Bedenk dat je programma niet voor jou kan denken. Jij moet zelf bedenken wat het programma mogelijk kan doen.
    Een computer is sneller dan wij zijn, maar ook sneller in het maken van fouten ;-)

    Succes!

  2. #17
    Quote Originally Posted by Herby View Post

    Code:
    ...
        while MS.Position <= MS.Size do
          begin//while
    [snip] 
            if MS.Position = MS.Size then
              break;
          end;//while
    Dat doet een beetje pijn aan mijn ogen.
    Ik denk dat iest logischer zou zijn
    Delphi Code:
    1. while MS.Position < MS.Size do
    2.       begin//while
    3. [snip]
    4.       end;//while

    Maar misschien zit ik er naast hoor.

    Bart

  3. #18
    Vraagje: als MaxChars het aantal "characters" (bytes als hex notatie) is dat je per regel wil, waarom maak je MaxChar 2, terwijl je er kennelijk 3 op een regel wilt?

    Bart

  4. #19
    Versimpelde versie.
    Zoals je ziet heb je ook variabele "S" niet nodig.

    Delphi Code:
    1. program test;
    2. {$ifdef fpc}
    3. {$mode objfpc}
    4. {$h+}
    5. {$endif}
    6.  
    7. uses
    8.   classes, sysutils;
    9. const
    10.   FileIn  = 'testfile.txt';
    11.   FileOut = 'testfile.out';
    12.   MaxChars = 3;
    13.  
    14. var
    15.   MS      : TMemoryStream;
    16.   Counter : integer;
    17.   B       : Byte;
    18.  
    19. begin
    20.   MS := TMemoryStream.Create;
    21.   try
    22.     // Read file as binary
    23.     MS.LoadFromFile(FileIn);
    24.     MS.Position := 0;
    25.     Counter := 0;
    26.  
    27.     while MS.Position < MS.Size do
    28.     begin
    29.       MS.Read(B,1);
    30.       write('$',B.ToHexString,#32);
    31.       Inc(Counter);
    32.       if (Counter mod MaxChars = 0) then
    33.         writeln;
    34.     end;
    35.  
    36.   finally
    37.     MS.Free;
    38.   end;
    39.   writeln;
    40.   WriteLn ('Finished');
    41. end.

    Output:
    Code:
    C:\Users\Bart\LazarusProjecten\ConsoleProjecten>test
    $31 $32 $33
    $34 $35 $36
    $37 $38 $0D
    $0A
    Finished
    (Mijn testfile.txt eindigt met een CarriageReturn/LineFeed, ofwel een nieuwe regel, vandaar de $0D $0A als laatste twee bytes.)

    Bart
    Last edited by Bart B; 26-Nov-21 at 23:43. Reason: ifdef fpc code

  5. #20
    Win32.Trojan.Heur.Herby
    Join Date
    Dec 2003
    Location
    Nuenen of all places
    Posts
    238
    Quote Originally Posted by Bart B View Post
    Versimpelde versie.
    Zoals je ziet heb je ook variabele "S" niet nodig.

    Delphi Code:
    1. program test;
    2. {$ifdef fpc}
    3. {$mode objfpc}
    4. {$h+}
    5. {$endif}
    6.  
    7. uses
    8.   classes, sysutils;
    9. const
    10.   FileIn  = 'testfile.txt';
    11.   FileOut = 'testfile.out';
    12.   MaxChars = 3;
    13.  
    14. var
    15.   MS      : TMemoryStream;
    16.   Counter : integer;
    17.   B       : Byte;
    18.  
    19. begin
    20.   MS := TMemoryStream.Create;
    21.   try
    22.     // Read file as binary
    23.     MS.LoadFromFile(FileIn);
    24.     MS.Position := 0;
    25.     Counter := 0;
    26.  
    27.     while MS.Position < MS.Size do
    28.     begin
    29.       MS.Read(B,1);
    30.       write('$',B.ToHexString,#32);
    31.       Inc(Counter);
    32.       if (Counter mod MaxChars = 0) then
    33.         writeln;
    34.     end;
    35.  
    36.   finally
    37.     MS.Free;
    38.   end;
    39.   writeln;
    40.   WriteLn ('Finished');
    41. end.

    Output:
    Code:
    C:\Users\Bart\LazarusProjecten\ConsoleProjecten>test
    $31 $32 $33
    $34 $35 $36
    $37 $38 $0D
    $0A
    Finished
    (Mijn testfile.txt eindigt met een CarriageReturn/LineFeed, ofwel een nieuwe regel, vandaar de $0D $0A als laatste twee bytes.)

    Bart
    Dit is precies de output die ik verwacht, dit werkt prima.
    Zelfs met debuggen zag ik gewoon niet wat ik verkeerd deed (ben ook maar een hobby programeur).
    Dat mod viel ook al niet als kwartje

    Iedereen ontzettend bedankt voor het meekijken.

    Gr
    Herby

  6. #21
    Quote Originally Posted by Herby View Post
    Dit is precies de output die ik verwacht, dit werkt prima.
    Zelfs met debuggen zag ik gewoon niet wat ik verkeerd deed (ben ook maar een hobby programeur).
    Soms helpt het om wat je wilt eerst gewoon in taal uit te schrijven (d.w.z. beschrijf het algoritme in gewoon Nederlands).
    Dan vertaal je het "gewone Nederlands" naar pseudocode (je kunt dan als..dan en loopjes gebruiken zonder je zorgen te maken over de correcte syntax).
    Pas daarna vertaal je je pseudocode naar Pascal.
    Die laatste stap is meestal de makkelijkste.
    De eerste stap (wat is eigenlijk het algoritme) is vaak het moeilijkste.

    En er is natuurlijk altijd no de "poor mans's" debugger.
    Gebruik writeln() om de waardes van bijv. je loop variabelen naar console te schrijven, dan zie je gewoon wat er gebeurt, en dus wat er afwijkt van je verwachtingen.

    Quote Originally Posted by Herby View Post
    Dat mod viel ook al niet als kwartje
    Je wilt gewoon weten of je loop variabele deelbaar is door MaxChar (3 in dit geval).
    Je hoeft daar niet per se mod voor te gebruiken.
    Jouw oorspronkelijke idee: als de counter 3 is, dan een nieuwe regel en zet de counter terug, werkt ook prima.



    Bart

  7. #22
    Quote Originally Posted by Miep View Post
    Zelf vindt ik die spatie als start in s nooit echt "mooi" en gebruik ik een ifthen om het te regelen zoiets als ifthen(s='','$',' $')
    Code:
    Ik heb daar een eigen routine voorgemaakt, denkende aan de oude dbase iif.
    
    
    Interface
    
    Function IIF(Eval: Boolean; Str1, Str2: String): String; Overload;
    Function IIF(Eval: Boolean; Int1, Int2: Integer): Integer; Overload;
    
    
    Implementation
    //--------------------------------------------------------------------
    //if true then Str1 else Str2
    Function IIF(Eval: Boolean; Str1, Str2: String): String; Overload;
    Begin
         //iif functie van dBase
      If Eval Then
        Result := Str1 //if true
      Else
        Result := Str2; //else
    End;
    
    Function IIF(Eval: Boolean; Int1, Int2: Integer): Integer; Overload;
    Begin
      If Eval Then
        Result := Int1 //if true
      Else
        Result := Int2; //else
    End;
    
    //--------------------------------------------------------------------
    10.4.2, Delphi2010, of Lazarus 2.2.0

Page 2 of 2 FirstFirst 1 2

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
  •