Recent

Author Topic: Function doesn't work but program does  (Read 664 times)

ducyk

  • Newbie
  • Posts: 2
Function doesn't work but program does
« on: November 18, 2024, 12:17:51 pm »
Hello, while doing a task I've stumbled upon a problem: my function wouldn't work properly, I rewrote in into a program where is was working, rewrote it back into a function, it wouldn't work again.

The purpose of the function is to translate integers from any system from binary to 256th numerical syestem into decimal.
Input goes via string with such format: {A A A ... A base}, where A is a hexagonal number from 00 to FF and 'base' is the base from which number is being translated from.
Output - deciamal int64

Examples with expected result:
FF 256 -> 255 {FF from 256th}
01 01 01 01 2 -> 7 {1111 from binary}
02 01 16 -> 33 {21 from hex}

working program:


program dec_from_any;

var power, number, base, big_to_ten, super_power: int64;
    i, count, sub_count: integer;
    symbol: char; { current symbol }
    input: string; { input }
  begin
    number:= 0; { digit in 256 numberical sytem }
    power:= 1; { power for hex inside digit }
    count:= 1; { count of spaces }
    sub_count:= 0; { count of digit inside number }
    super_power:= 1; { power for digits in 256 system }
    big_to_ten:= 0; { result
    readln(input);
    for i:= length(input) downto 1 do { goes from the end of line to the start }
    begin
      symbol:= input{i}; { current symbol } <- i should be in [], but makes it cursive, sorry
      if symbol = ' ' then { changes when space }
      begin
        count:= count + 1; { important for distributing base from the whole }
        power:= 1; { its here instead of later so it can be used for base }
      end
      else if count = 1 then
        begin { base calculation }
          base:= base + (ord(symbol) - ord('0')) * power;
          power:= power * 10
        end { end of base calculation }
      else if count > 1 then begin { calculation of number }
             case symbol of
               'A': begin number:= number + 10 * power;
                 power:= power * 16 end;
               'B': begin number:= number + 11 * power;
                 power:= power * 16 end;
               'C': begin number:= number + 12 * power;
                 power:= power * 16 end;
               'D': begin number:= number + 13 * power;
                 power:= power * 16 end;
               'E': begin number:= number + 14 * power;
                 power:= power * 16 end;
               'F': begin number:= number + 15 * power;
                 power:= power * 16 end;
             else begin
               number:= number + (ord(symbol) - ord('0')) * power;
               power:= power * 16 end;
             end;
             sub_count:= sub_count + 1; { moving to 2nd digit of number }
             if (sub_count mod 2) = 0 then { after getting 2nd digit of number, adding it to the result in coresponding "super_power" }
               begin
                 big_to_ten:= big_to_ten + number * super_power;
                 super_power:= super_power * base;
                 sub_count:= 0;
                 number:= 0
               end;
            end;

             end;
    writeln(base);
    writeln(big_to_ten)
    end.


this does work for said examples



Hower, following function that i got by copying previous code and changing the following:
1. removed line №14:  readln(input); , removed line №57 writeln(base); , removed line №58: writeln(big_to_ten)
2. program name changed to: program chartrans;
3. big_to_ten, input removed from var
4. Added in between program chartrans; and  var following
var input: string;

function big_to_ten(input: string): int64;
5. added before end. the following :
    end;
begin
  readln(input);
  writeln(big_to_ten(input))


resulting function:


program chartrans;
var input: string;

function big_to_ten(input: string): int64;
var power, number, base, super_power: int64;
    i, count, sub_count: integer;
    symbol: char;
Last Edit: Today at 12:20:52 pm
+ Attachments and other options
shortcuts: hit alt+s to submit/post or alt+p to preview

 


  begin
    power:= 1;
    count:= 1;
    sub_count:= 0;
    super_power:= 1;
    number:= 0;
    big_to_ten:= 0;
    for i:= length(input) downto 1 do
    begin
      symbol:= input;
      if symbol = ' ' then
      begin
        count:= count + 1;
        power:= 1;
      end
      else if count = 1 then
        begin
          base:= base + (ord(symbol) - ord('0')) * power;
          power:= power * 10
        end
      else if count > 1 then begin
             case symbol of
               'A': begin number:= number + 10 * power;
                 power:= power * 16 end;
               'B': begin number:= number + 11 * power;
                 power:= power * 16 end;
               'C': begin number:= number + 12 * power;
                 power:= power * 16 end;
               'D': begin number:= number + 13 * power;
                 power:= power * 16 end;
               'E': begin number:= number + 14 * power;
                 power:= power * 16 end;
               'F': begin number:= number + 15 * power;
                 power:= power * 16 end;
             else begin
               number:= number + (ord(symbol) - ord('0')) * power;
               power:= power * 16 end;
             end;
             sub_count:= sub_count + 1;
             if (sub_count mod 2) = 0 then
               begin
                 big_to_ten:= big_to_ten + number * super_power;
                 super_power:= super_power * base;
                 sub_count:= 0;
                 number:= 0
               end;
            end;

             end;
    end;
begin
  readln(input);
  writeln(big_to_ten(input))

end.


And it doesn't work and I can't understand why, please help.
« Last Edit: November 18, 2024, 12:27:01 pm by ducyk »

Fibonacci

  • Hero Member
  • *****
  • Posts: 647
  • Internal Error Hunter
Re: Function doesn't work but program does
« Reply #1 on: November 18, 2024, 12:28:22 pm »
Code: Pascal  [Select][+][-]
  1. function big_to_ten(input: string): int64;
  2. var power, number, base, super_power: int64;
  3.   i, count, sub_count: integer;
  4.   symbol: char;
  5. begin
  6.   power := 1;
  7.   count := 1;
  8.   sub_count := 0;
  9.   super_power := 1;
  10.   number := 0;
  11.   big_to_ten := 0;
  12.   for i := length(input) downto 1 do begin
  13.     symbol := input[i];
  14.     if symbol = ' ' then begin
  15.       count := count + 1;
  16.       power := 1;
  17.     end else if count = 1 then begin
  18.       base := base + (ord(symbol) - ord('0')) * power;
  19.       power := power * 10;
  20.     end else if count > 1 then begin
  21.       case symbol of
  22.         'A': begin number := number + 10 * power;
  23.           power := power * 16; end;
  24.         'B': begin number := number + 11 * power;
  25.           power := power * 16; end;
  26.         'C': begin number := number + 12 * power;
  27.           power := power * 16; end;
  28.         'D': begin number := number + 13 * power;
  29.           power := power * 16; end;
  30.         'E': begin number := number + 14 * power;
  31.           power := power * 16; end;
  32.         'F': begin number := number + 15 * power;
  33.           power := power * 16; end;
  34.       else begin
  35.         number := number + (ord(symbol) - ord('0')) * power;
  36.         power := power * 16; end;
  37.       end;
  38.       sub_count := sub_count + 1;
  39.       if (sub_count mod 2) = 0 then begin
  40.         big_to_ten := big_to_ten + number * super_power;
  41.         super_power := super_power * base;
  42.         sub_count := 0;
  43.         number := 0;
  44.       end;
  45.     end;
  46.   end;
  47. end;

Wesbat

  • New Member
  • *
  • Posts: 37
    • engrams.dev
Re: Function doesn't work but program does
« Reply #2 on: November 18, 2024, 12:29:27 pm »
Your program works but has a compile error.

I changed line 17 from

Code: Pascal  [Select][+][-]
  1. symbol:= input;

to

Code: Pascal  [Select][+][-]
  1. symbol:= input[i];

Edit / correction - initialize base:

Code: Pascal  [Select][+][-]
  1. base:=0;

My output:

Code: Pascal  [Select][+][-]
  1. FF 256 -> 255
  2. 01 01 01 01 2 -> -1345312141813925216 (without base:=0)
  3. 01 01 01 01 2 -> 15 (with base:=0)
  4.  
« Last Edit: November 18, 2024, 12:37:35 pm by Wesbat »

ducyk

  • Newbie
  • Posts: 2
Re: Function doesn't work but program does
« Reply #3 on: November 18, 2024, 12:43:48 pm »
Ohhh that's was it...
Thank you!
And sorry for bad formatting my 1st post  next time will use code brackets

 

TinyPortal © 2005-2018