PDA

View Full Version : Thực hiện ép kiểu trong Pascal



nhanh
24-12-2002, 23:56
Làm thế nào để thực hiện phép gán khác kiểu trong Pascal.
VD : a:real; b:single;
a :=b; (Trình dịch báo lỗi, mặc dù đã thêm {N+} )

Mach2
25-12-2002, 17:02
{$N+}
Bạn chỉ thiếu chút tiền thui...

Huynh Phong
15-12-2003, 13:07
Dau can dich co dk {N+ }, ban them mot chut xiu nua thui:
a := b/1;
Dzay la OK chu ? A :Real mà.

CrazyBabe
16-12-2003, 01:43
Đó đâu có phải là ép kiểu mô ? Real với Single ở TP kích thước khác nhau thì phải. Đó chỉ là một value coversion thui.

Huynh Phong
16-12-2003, 10:36
Trong cac loai ngon ngu lap trinh, thi TurboPascal là loai có cấu trúc mạnh mẽ nhất, ngay cả nguời anh em của nó là Turbo C++ cũng phải chấp tay chào thua, vì vậy, nếu ta thực hiện ép kiểu như Junior Nhanh thì hoàn toàn không thể thực hiện được(trong TurboPascal). Dùng mẫu số 1 (trong a:=b/1) trong biểu thức trên thực ra chỉ là cái "mẹo" đánh lừa, bởi bản thân (b) là Single (kiểu số nguyên nhỏ 0..125), giá trị (b/1) không làm thay đổi giá trị (b) nhưng làm thay đổi kiểu. (b/1) là kiểu số thực(real), đồng kiểu dzới (a). Dzậy, đối với phép gán (a:=b),Turbo Pascal không chấp nhận nhưng lại chấp nhận cách gán (a:=b/1). Âu đó cũng là một điểm mạnh của Turbo Pascal dzậy !!!!

CrazyBabe
17-12-2003, 00:42
...................Ô Mai Gót ! ...................

jiSh@n
17-12-2003, 11:13
Single (kiểu số nguyên nhỏ 0..125)
Mới biết đấy????

Huynh Phong
17-12-2003, 14:39
Khờ khờ....Thật tội, thật tội, tui nhầm...

tanson
30-12-2003, 00:12
Ép kiểu trong pascal đúng là hơi khó nhưng đôi khi vẫn thực hiện được. Cú pháp của lệnh ép kiểu là:
TênKiểuMới(Biến)
Ví dụ: a:real; b:single;
a := real(b);
(bạn thử xem có được không chứ tui dùng Delphi nên không có Pascal để thử. Trong Delphi thì gán a:=b nó không kêu gì cả)

lee_huynh306
14-07-2004, 08:44
Humh,cho mình tham gia chút xíu nhá
Nếu như mình không nhầm thì trình biên dịch sẽ thông báo như sau :
must be in 8087 mode to compile this
mặc dù bạn đã thêm {$N+},
tại sao ư?vì {$N+} thôi thì chưa đủ vì như thế chỉ báo hiệu cho trình biên dịch biết là dùng bộ đồng xử lý toán học (8087/80287) mà những loại này thì hầu như không còn tồn tại trong cái thế giới của máy vi tính hiện nay,mặc dù nó thật sự tốt hơn và chính xác hơn cả một siêu máy tính trong việcc tính toán.
Nói túm lại bạn chỉ cần thêm dòng này vào :
{$N+,E+}
điều đó có nghĩa là bảo trình biên dịch hãy dùng trình giả lập bộ đồng xử lý toán học
To HuynhPhong
single không phải là kiểu số nguyên nhỏ mà là kiểu số thực với độ chính xác đơn
Muốn ép kiểu có khá nhiều cách,cách dễ dàng nhất là dùng chính kỹ thuật typecasting mà các bạn đã nói,còn cấp cao hơn có thể sử dụng một thuật toán nào đó,việc này mình xin bái.Còn việc mình thường làm nhất trong vụ typecasting là dùng assembly hoặc các mã inline nhanh ,gọn,và khá tiện lợi.
Ví dụ một chút nhá
function wordtoint(a:word):integer;inline($58 {pop ax});
vậy là đã có được một biến integer từ một biến word thật gọn phải không nào?

lee_huynh306
14-07-2004, 09:04
Trong cac loai ngon ngu lap trinh, thi TurboPascal là loai có cấu trúc mạnh mẽ nhất, ngay cả nguời anh em của nó là Turbo C++ cũng phải chấp tay chào thua, vì vậy, nếu ta thực hiện ép kiểu như Junior Nhanh thì hoàn toàn không thể thực hiện được(trong TurboPascal). Dùng mẫu số 1 (trong a:=b/1) trong biểu thức trên thực ra chỉ là cái "mẹo" đánh lừa, bởi bản thân (b) là Single (kiểu số nguyên nhỏ 0..125), giá trị (b/1) không làm thay đổi giá trị (b) nhưng làm thay đổi kiểu. (b/1) là kiểu số thực(real), đồng kiểu dzới (a). Dzậy, đối với phép gán (a:=b),Turbo Pascal không chấp nhận nhưng lại chấp nhận cách gán (a:=b/1). Âu đó cũng là một điểm mạnh của Turbo Pascal dzậy !!!!

Hay quá ha,làm kiểu đó được đó,bảo đảm dịch trong .... vài ngàn năm,tới khi compiler nó chán quá nó dịch luôn để khỏi dịch đi dịch lại nó mệt.
Về nguyên tắc,một biến a (kiểu single) hoàn toàn có thể được gán cho một biến b ( kiểu real ,longint,word,integer,byte,shortint) bằng lệnh a:=b; nhưng việc làm ngược lại thì không được chấp nhận
Còn một chút nữa nha,pascal thì trình dịch nào cũng như trình dịch đó,định kiểu rất mạnh mẽ,nhưng còn họ nhà C,tui chưa có nghe nói cái nào có vụ định kiểu như thế,mặc dù nó có định kiểu chứ không phải không.Nhưng rất mập mờ,cả TC++ cũng vậy,điển hình là bạn hoàn toàn có thể in ra màn hình một ký tự ứng với một biến kiểu số nguyên (0..255 / -128..127) chỉ cần báo cho thủ tục in ấn của nó
thật phiền toái