PDA

View Full Version : [Pascal] lỗi chuyển từ integer sang longint!



Thieu Phong
24-07-2009, 19:47
var m :integer;
p:longint;
begin
m:=32767;
p:=2*m;
writeln(p);
p:=m*m;
writeln(p);
end.

kết quả cho ra: -2 với 1
cái này bị lỗi gì vậy mấy anh chị. em thử những số nhỏ hơn 32767 đôi chút cũng bị tương tự.

lee_huynh306
24-07-2009, 20:16
Bro thử dùng biện pháp ép kiểu p:=longint(2*longint(m)); thử xem.

Thieu Phong
24-07-2009, 20:37
Bro thử dùng biện pháp ép kiểu p:=longint(2*longint(m)); thử xem.

tức là gán tường minh ấy à. Em làm được rồi. Thanks huynh. Em ko thấy nút thanks ^^.

Em cũng đã thử chuyển qua free pascal, ko cần gán tường minh nó cũng tính ok. Ra KQ chính xác.
Nhưng mỗi tội, khi bấm Ctrl + F9 nó chạy lâu quá, với lại còn chữ nghĩa tùm lum. Ai chỉ cách giải quyết cái đó trong FP đi.
Còn nữa nè. Trong Free Pascal, mình sửa đường dẫn Open với Save mặc định chỗ nào vậy.

quangtq
24-07-2009, 22:06
Chỗ Change dir trong file ý. TP cũng thế mà.
Ko phải lâu đâu. Nhanh hơn nhiều so với TP đấy. Chẳng qua compile chậm thôi.
Còn run thì vô đối.

Thieu Phong
25-07-2009, 10:53
Chỗ Change dir trong file ý. TP cũng thế mà.


Mình đã thử change dir. Trong lần sử dụng đó thì ok. Nhưng sau khi exit rồi bật chương trình lên lại thì đâu lại vào đấy. Cả TP lẫn FP đều thế.

quangtq
25-07-2009, 11:10
Options -> Environment - Prefences, bỏ tick mấy ô bên trái dưới đi (không nhớ tên). Rồi lại vào Options -> Save fp.ini
Exit , vào lại
Xong

Thieu Phong
25-07-2009, 16:25
Làm ko được bạn ơi!
Có thể hướng dẫn cụ thể, chính xác hơn ko?

quangtq
25-07-2009, 16:29
Lạ nhỉ. Mình làm được mà. Chỉ cần Change dir là xong.
Thôi re-install vào chỗ cần vậy

Thieu Phong
25-07-2009, 16:58
Lần nào có cũng dẫn tới chỗ này khi mình save hay open
FP [nguồn]\FPC\2.2.4\bin\i386-win32
TP [nguồn]\TP\BIN

Chán thật, change dir cả chục lần, save lại cả chục lần. Công cốc cả chục lần. hic

quangtq
25-07-2009, 17:06
Re-install 1 lần. Hết công cốc.

Thieu Phong
25-07-2009, 17:28
re-install 2 lần rồi! hic

quangtq
25-07-2009, 17:36
Ơ. Chỉnh folder lúc install chứ. Ko biết à

Thieu Phong
25-07-2009, 17:38
Lúc install chỉ duy nhất có 1 đường dẫn đến C:\FPC\2.2.4
Chình gì nữa nhỉ?

quangtq
25-07-2009, 17:43
Sặc. Thay vì chọn Full Installion thì chọn Custom.
Chán pác này quá.
Xem lại cách cài đặt các soft đi.
Pác chỉ biết ấn Next thôi à

troioidatoi
25-07-2009, 17:53
Tại sao chia ra m integer chi cho nó khổ thế nhỉ, theo mình bít thì có thể giải thích thế này. k:=m*2. Nó sẽ tính m*2 trước và lấy biến tốt nhất trong 2 biến này (trong trường hợp này là integer cả) nên ko lưu đc kq chính xác, rồi sau đó mới gán cái integer đó cho thằng longint là k nên sai. Nếu lấy m*n với m là integer và n là longint thì ko xảy ra lỗi như trên đâu

Thieu Phong
25-07-2009, 18:07
Sặc. Thay vì chọn Full Installion thì chọn Custom.
Chán pác này quá.
Xem lại cách cài đặt các soft đi.
Pác chỉ biết ấn Next thôi à

Cậu nóng tính quá! Thôi biết ơn cậu, mình tặng cậu bộ ảnh. Thix thì vào xem, ko thix thì thôi vậy. Mình ko hỏi nữa đâu ^^


http://c.uploadanh.com/upload/0/571/0.737359001248519760.jpg
http://c.uploadanh.com/upload/0/571/0.483984001248519763.jpg
http://c.uploadanh.com/upload/0/571/0.818193001248519764.jpg
http://c.uploadanh.com/upload/0/571/0.119525001248519768.jpg
http://c.uploadanh.com/upload/0/571/0.634497001248519770.jpg
http://c.uploadanh.com/upload/0/571/0.978818001248519771.jpg
http://c.uploadanh.com/upload/0/571/0.402377001248519774.jpg
http://c.uploadanh.com/upload/0/571/0.573319001248519777.jpg

quangtq
25-07-2009, 18:20
Xin lỗi. Hơi nóng. Nhưng đúng thế thật mà, ngay pic1 là cái chỗ chọn dir đấy thôi.
Lần sau có gì cứ hỏi. Sorry nha

lehang_gb1
25-07-2009, 21:56
Mình cũng không biết vì sao nữa chắc là do phần mềm Pascal yêu cầu như vậy. Nếu như m cùng kiểu longint với p thì đúng. Nhung 2*m sẽ là 1 số integer lại gán cho integer với m=32767 thì sai
với m là số bé ví dụ m=32 thì đúng nên hơi khó hiểu. Nhận thấy Khi tổng hay tích bên vế trái lớn hơn giới hạn kiểu Integer thì kết quả sẽ sai. Vậy thì chú ý cách khai báo thôi. Mình dùng TP cũng thế.

lee_huynh306
26-07-2009, 21:31
Khi khai báo m là integer thì phép tính 2*m mặc định được TP/BP dịch qua mã máy ở dạng như sau:



mov ax, 2
mov bx, m
mul bx
ret


Do m = maxint nên sẽ có lỗi tràn số, bro check flash sẽ phát hiện ngay việc này. Còn khi ép kiểu thì TP/BP đã biết là phải tính toán 32bit nên sẽ dịch sang mã máy khác đi.