[PASCAL] - Błędy w typach danych

Witam, chciałem zrobić konwerter dwójkowo-dziesiętny i już niemalże go skończyłem ale mam dość błahy błąd, mianowicie:

konwerter.pas(19,15) Error: Incompatible types: got “Extended” expected “ShortInt”

Wiem co ów błąd oznacza ale testowałem już na setki sposobów, dawałem różne typy danych i zawsze mam pokrewne błędy.

uses crt,math;

var

   lDwojkowa : string;


function BinToDec (a: string):integer;

var

   x,y,z : integer;

begin

 BinToDec:=0;

 for x:= length(a) downto 0 do

   begin

     y:= length(a) + 1 - x;

     if a[y] = '1' then

        begin

           z:=ldexp(2,x);

           BinToDec:=BinToDec + z;

        end;

   end;

 BinToDec:=z;

end;


begin

clrscr;

write('DWOJKOWO : ');

read(lDwojkowa);

writeln();

writeln('DZIESIETNIE: ', BinToDec(lDwojkowa));

readln;

end.

z - integer; ldexp - zwraca Double

Ale tego się tak nie robi! Po co obliczać kolejne potęgi dwójki, jak można sobie z tym poradzić poprzez zwykłe mnożenie.

Algorytm pracuje tak:

  • ustawiasz wartość początkową (wynikowej) liczby na 0 (zero);

  • bierzesz kolejno cyfry od lewej do prawej (od bardziej znaczących do mniej znaczących - tu decydujesz o kierunku pętli, w zależności od tego, jak trzymasz liczbę binarną);

  • mnożysz wynikową liczbę przez 2 i dodajesz wartość bieżącej cyfry (0 lub 1);

  • po przejściu całej pętli masz w wynikowej liczbie obliczoną wartość.

Bez potęgowania i dużo prościej!

Ok Pablo, dzięki za algorytm, muszę go sobie napisać i porównać z tym moim ale jak już go zacząłem to i chciałbym skończyć więc mam jeszcze jedno pytanie odnośnie do funkcji ldexp i tego co napisał Alex.

Zrobiłem sobie nowy program do testowania ów funkcji(w programie, który podałem w pierwszym poście jest błąd bo powinno być ldexp(1,x) nie (2,x) ale to moje niedopatrzenie, pierwszy raz używam tej funkcji.

Uses crt,math;

var x,y:integer;


begin

clrscr;

read(x);

writeln(ldexp(1,x):0:2);

//y:=ldexp(1,x);

readln;

end.

Chodzi mianowicie o dwa wiersze, ten writeln oraz ten zakomentowany pod spodem. Gdy kompiluje program jest ok, funkcja ldexp działa poprawnie i potęguje dwójkę do pobranej ze zmiennej x potęgi. Niestety gdy odkomentuję linijkę gdzie przypisuję zmiennej y wynik to pojawiają mi się już wymienione przeze mnie w pierwszym poście błędy.

Najprawdopodobniej wynika to z mojej niewiedzy na temat tego zwracanego typu danych, o którym mówił Alex, próbowałem ustawiać typ double dla zmiennych x oraz y ale to nie działa.

Przecież napisałem ci: z - integer; ldexp - zwraca Double

y:Double;

lub:

y:=Trunc(ldexp(1,x));

Błąd brzmiał

got "Extended" expected "ShortInt"

zatem zadeklaruj zmienną y jako Extended (lub Double?).

Poza tym masz podnosić liczbę 2 do potęgi, więc powinieneś jednak użyć wywołania ldexp(2,x).

Pablo_Wawa, zanim zaczniesz dawać rady zajrzyj może do dokumentacji,

[alex] - masz rację - źle przeczytałem opis funkcji. Przepraszam za zamieszanie. :frowning:

Ok, już ogarnąłem co i jak. Dzięki za pomoc Wam obydwu.