Forum > General

Function doesn't work but program does

(1/1)

ducyk:
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.

Fibonacci:

--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---function big_to_ten(input: string): int64;var power, number, base, super_power: int64;  i, count, sub_count: integer;  symbol: char;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[i];    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;

Wesbat:
Your program works but has a compile error.

I changed line 17 from


--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---symbol:= input;
to


--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---symbol:= input[i];
Edit / correction - initialize base:


--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---base:=0;
My output:


--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---FF 256 -> 25501 01 01 01 2 -> -1345312141813925216 (without base:=0)01 01 01 01 2 -> 15 (with base:=0) 

ducyk:
Ohhh that's was it...
Thank you!
And sorry for bad formatting my 1st post  next time will use code brackets

Navigation

[0] Message Index

Go to full version