Avatar billede the_cyrez Nybegynder
27. februar 2003 - 00:29 Der er 6 kommentarer

Brug af f.eks. Int64 samt konvertering af talsystemer

Jeg har i Delphi 7 at gøre med en string, som bliver begrænset af Integer-typen. Hvordan bruger man en større Int-type (f.eks. Int64, jeg har læst om det i den tilhørende Delphi manual, men fatter intet)?
Jeg vil også gerne vide hvordan man nemmest konverterer tal imellem det binære, decimale og det hexadecimale talsystem.
Avatar billede hermandsen Juniormester
27. februar 2003 - 00:39 #1
Du kan bruge en Int64, stort set ligesom en Integer... Typen er godt nok ikke en ordinal, så du kan f.eks. ikke bruge den i et for-loop.
Faktisk mener jeg at Int64'en er lavet på samme måde som de reelle typer i Delphi, Real, Extended osv.

Omkring IntToBin og IntToHex er der et par ekspemler på Eksperten, så prøv at søge lidt... Ellers er jeg tilbage i morgen!
Nu vil jeg nemlig i seng! :)

//hermandsen
Avatar billede abpdk Nybegynder
27. februar 2003 - 00:40 #2
Det er nok mig der er træt, men hvad mener du med at den bliver begrænset af integer-typen?
Avatar billede the_cyrez Nybegynder
27. februar 2003 - 00:53 #3
Den bliver begrænset af integer-typen:
Integer-variabler kan maximalt indeholde cifferet 268435455 og jeg kunne godt tænke mig at arbejde med noget større numre.

Hvad angår Int64:
Hmm... ok, men hvordan klarer jeg så at kværne variablen igennem et for-loop (for det skal den)?
Avatar billede dkn Nybegynder
27. februar 2003 - 01:11 #4
uden at læse foregående indlæg...

floattostr()
strtofloat()
Avatar billede hermandsen Juniormester
27. februar 2003 - 08:16 #5
>>the_cyrez
Det bliver godt nok noget af et forloop så!!!
Hvis du bare skal starte fra 0, hvad så med at bruge en Cardinal!?

Så kan du bruge

for I := 0 to 4294967295 do
  ShowMessage(IntToStr(I));

Det bliver et meeeeeget stort loop!!!

Hvis du endelig skal bruge en kæmpe loop, hvad så med bare at bruge while-do, eller repeat-until!?

var
  I: Int64;
begin
  I := -9223372036854775808; //Minimum for en Int64
  while I < 9223372036854775807 do //Maximum for en Int64
  begin
    ShowMessage(IntToStr(I));
    I := I + 1;
  end;

  repeat
    ShowMessage(IntToStr(I));
    I := I - 1;
  until I <= -9223372036854775808;
end;

Sorry to say it, men selv hvis du bare kører loopet uden ShowMessage, så kommer det til at tage rimelig lang tid... Hvorfor har du brug for sådan et kæmpeloop!?

//hermandsen
Avatar billede the_cyrez Nybegynder
27. februar 2003 - 17:58 #6
Here's the deal:

Jeg har et program med tre input/output-tekstfelter (binære, decimale og hexadecimale tal). Når man skriver et tal i et af felterne skal de to andre taltyper dukke frem i deres respektive felter (svarende til samme talværdi)

Til at konvertere mellem BinToInt, DecToInt, HexToInt, IntTobin, IntToStr, IntToHex er der funktioner af samme navn længere oppe i filen som får variablen ind som Str og ud som Int og derefter ind som Int og ud som pågældende talsystem (f.eks. ved hjælp af for-loops). Problemet består for mig i at Int begrænser talvariablen, hvilket jeg derfor gerne vil have ændret til f.eks. Int64 eller noget bedre (?), men jeg ved ikke hvordan.

Her er koden til funktionen bin -> dec & hex (ved godt det kan skrives kortere, men ikke helt hvordan):

procedure TFormMain.ButtonExe_BinDecHexClick(Sender: TObject);
var
Input,test,len,c: Integer;
s:TCaption;
ch:char;
check_01,check_len:boolean;
str,Input_2:string;
begin
If button_bin.checked = True then
  begin
  str := text_bin.Text;
  check_01 := True;
  check_len := True;
  len := length(str);
  if (len > 28) then
    begin
    check_len := False
    end;
  for c := len downto 1 do
    begin
    ch := str[c];
    if (ch = '0') or (ch = '1') then
    else
      check_01 := False
    end;
  if ((check_01 = True) and (check_len = True)) then
    begin
    Input := BinToInt(str);
    text_dec.Text := IntToStr(Input);
    text_hex.Text := IntToHex(Input);
    end
  else
    begin
    text_dec.Text := '';
    text_hex.Text := '';
    end;
  end;
If button_dec.checked = True then
  begin
  s := text_dec.Text;
  if tryStrToInt(s,test) = True then
    begin
    //Input := StrToInt(s);
    text_bin.Text := IntToBin(test);
    text_hex.Text := IntToHex(test);
    end
  else
    begin
    text_bin.Text := '';
    text_hex.Text := '';
    end;
  end;
If button_hex.checked = True then
  begin
  s := text_hex.Text;
  Input_2 := IntToStr(hexToInt(s));
  if tryStrToInt(Input_2,test) = True then
    begin
    text_bin.Text := IntToBin(StrToInt(Input_2));
    text_dec.Text := IntToStr(StrToInt(Input_2));
    end
  else
    begin
    text_bin.Text := '';
    text_dec.Text := '';
    end;
  end;
end;

!OBS!
Hvis jeg får løst dette (set for mig) indviklede problem, er jeg villig til at forhandle om en pæn sjat ekstra point!!!
!OBS!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester