Delphi - Odpowiedni typ danych


(Stanny Tomasz) #1

Chcę zrobić banalny program ale napotkałem na spore błędy.

var a,b,c:comp;

begin

 a:=StrToInt(Edit1.text);

 b:=StrToInt(edit2.text);

 c:=b+((b*5)/100);

 label5.caption:=FloatToStr(c);

Cały mój program, znajduje się to pod przyciskiem, a teraz przejdźmy do konkretów, chodzi mi o to że program nie chce pracować na liczbach wyrażanych od miliona w górę. Na jaki typ danych zmienić aby to wszystko działało? Wcześniej pracując na znacznie mniejszych liczbach zawsze mi działało.


([alex]) #2

zamiast comp - int64 (maksymalna wartość: 2^63-1)

zamiast StrToInt() - StrToInt64()

zamiast c:=b+((b*5)/100); - c:=1.05*b;

Albo od razu wszystko trzymaj w Extended;


(Stanny Tomasz) #3

Nadal mi nie działa, a program twierdzi że int64 nie zna :confused:

A to wpisałem

begin

 a:=StrToInt64(Edit1.text);

 b:=StrToInt64(edit2.text);

 c:=1.05*b;

 label5.caption:=int64ToStr(c);

end;

([alex]) #4

Int64 czy int64ToStr ?

int64ToStr - niema czegoś takiego.


(Stanny Tomasz) #5

To co wpisać wreszcie ? Bo troszkę się teraz zakręciłem


(M@ster) #6

Nie możesz stosować Int64ToStr po przemnożeniu przez liczbę rzeczywistą gdyż to już nie będzie integer w ogóle, abstrachując już od tego czy taka funkcja istnieje.

var

a,b: cardinal;

c: double;

begin

a:=StrToInt(Edit1.text);

b:=StrToInt(edit2.text);

c:=b+((b*5)/100);

label5.caption:=FloatToStr(c);

([alex]) #7

M@ster , cardinal ma zakres 0 .. 2^32-1

a:=StrToInt(Edit1.text); - gdzie a typu cardinal może doprowadzić do nieprawidłowości - wpisujesz liczbę ujemną, dostajesz nie wiadomo co.

var a,b:Int64;begin:=StrToInt64Def(Edit1.text,0);b:=StrToInt64Def(edit2.text,0);label5.caption:=FloatToStr(1.05*b);end; [/code]

(M@ster) #8

Prawdopodobnie dostaniesz errora :wink: ja o tym doskonale wiem.


([alex]) #9

Jeżeli mówisz o tym moim kodzie to się mylisz, przejrzyj się uważnie użyte funkcje to: StrToInt64 Def (), które nie generują wyjątku jeżeli w podanym argumencie nie jest liczba.


(Stanny Tomasz) #10
var a,b:Int64;

Nadal przy tym wyrzuca mi błąd :confused:


([alex]) #11

Jakie masz Delphi ?


(Stanny Tomasz) #12

2.0, Sprawdzając na u kumpla na 7 wszystko działało. Zapewne to wina programu, a wie ktoś może skąd można pobrać 7.0 ?


([alex]) #13

Int64 w Delphi jest obsługiwane od wersji 4.

StrToInt() oraz StrToIntDef() pracują na integer'ach które działa w przedziałach -(2^31) .. +(2^31)-1

Możesz spróbować przejść całkiem na Double:

var a,b,c:Double;

begin

try

  a:=StrToFloat(Edit1.text);

  b:=StrToFloat(edit2.text);

except

  a:=0;

  b:=0;

end;

label5.caption:=FloatToStr(1.05*b);

(Stanny Tomasz) #14

niestety nie działa :confused: Chodzi mi w tym sensie przy podaniu liczby powyżej 1 MLD :confused:

A można skądś ściągnać wersję powyżej tak jak mówiłeś 4.0 ?


([alex]) #15

O czym ty gadasz ? Zakres double jest: (5.0 x 10^-324 .. 1.7 x 10^308)

Czyli sporo większy niż 1 mld.


(Stanny Tomasz) #16

Czyż to moja wina że po skopiowaniu wyrzuca błąd ?

(w Wersji 2.0)

W wersji 7.0 już wszystko działa :slight_smile:

Dzięki za twoje zaangażowanie i pomoc której mi udzieliłeś :slight_smile:


(M@ster) #17

Mówię o swoim kodzie który podałem.