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

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
    289
    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
    Senior Member Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    2,085
    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

  8. #23
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Wok, die zit sinds D6 erin als IFTHEN() voor numerieke types in unit math, en voor strings in strutils. (die laatste sinds D2006 geloof ik)

    FPC heeft ze natuurlijk ook.

  9. #24
    Senior Member Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    2,085
    Quote Originally Posted by marcov View Post
    Wok, die zit sinds D6
    Tja ooit gemaakt in Delphi3 en al die jaren blijven gebruiken en niet verder gekeken.
    Tijd om mijn code weer een stukje op te schonen :-)
    Peter
    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
  •