PDA

Xem phiên bản đầy đủ : Độ dài tối đa của xâu kí tự trong Pascal


zidanend
10-04-2009, 22:23
Mong các thầy, cô giải thích giúp, theo định nghĩa xâu kí tự: "Xâu là dãy kí tự trong bộ mã ASCII..." tại sao độ dài tối đa của xâu kí tự trong Pascal lại chỉ là 255 kí tự.(trong khi đó bộ mã ASCII lại mã hoá được 256 kí tự

huycom9999
11-04-2009, 17:17
256 ký tự là được tính từ ký tự thứ 0 đến ký tự thứ 255 đó bạn (255 - 0 + 1 = 256)

dtd00
11-04-2009, 19:09
Ủa, hình như là chỉ 255 kí tự thui, còn một chỗ để chứa độ dài của xâu mà.

BANH
13-04-2009, 03:53
Ủa, hình như là chỉ 255 kí tự thui, còn một chỗ để chứa độ dài của xâu mà.
Đúng vậy, khi khai báo 1 biến có kiểu xâu ví dụ: Var St: String; thì Pascal ngầm hiểu độ dài tối đa của xâu là 255 kí tự. tức là từ 1.. 255 còn ô đầu tiên là ô có vị trí bằng 0 sẽ chứa độ dài của xâu thực khi nhập vào.

nguyenhung
26-07-2009, 12:44
Trong Pascal dung 1 bit da mã hoa xau ki tu.
Do vay do dai lon nhat mã hoá được sẽ là 255

Xin loi. 1 Byte chu khong phai 1 bit

------------------------------------------------------------
Bạn nhớ gõ dấu tiếng Việt nhé :) - thangntmk

admin
27-07-2009, 07:49
Độ dài của xâu và số ký tự được mã hóa là 2 khái niệm độc lập nhau. Bảng mã ASCII mã hóa được 256 ký tự, nghĩa là ta có thể dùng 1 byte để thể hiện tất cả ký tự của bảng ASCII. Xâu có thể dài bao nhiêu ký tự là tùy cách quản lý xâu của trình biên dịch.

Trong Pascal, 1 mảng gồm tối đa 256 byte được dùng để chứa một xâu. Nhưng vì byte đầu tiên (vị trí 0) của xâu được dùng để chứa chiều dài của xâu nên xâu trong Pascal dài tối đa 255 ký tự. Bạn có thể lấy chiều dài của một xâu bằng 2 cách: Length(s) hoặc Byte(s[0]).

Tương tự trong C (for DOS), một mảng tối đa 256 byte cũng được dùng chứa xâu. Nhưng C không dùng byte đầu để chứa chiều dài xâu mà dấu hiệu kết thúc xâu là byte có giá trị NULL (hay bằng 0). Vì vậy, xâu trong C cũng dài tối đa 255 ký tự.

Chúng ta có thể tự xử lý xâu dài hơn 255 ký tự bằng 1 mảng các byte. Khi đó ta không tận dùng được các hàm xử lý xâu có sẵn của ngôn ngữ lập trình.

thaygiaolang
27-07-2009, 08:21
... Vì vậy, xâu trong C cũng dài tối đa 255 ký tự.


Mình nhớ là xâu trong C có thể dài tới 65535 ký tự lận (nằm trọn trong 1 segment bộ nhớ)

admin
27-07-2009, 09:25
Mình nhớ là xâu trong C có thể dài tới 65535 ký tự lận (nằm trọn trong 1 segment bộ nhớ)Cảm ơn thaygiaolang. Đúng là do cách quản lý xâu của C kết thúc bởi NULL và được xem như là mảng của các ký tự nên nó cho phép độ dài xâu tốt hơn.

Nhất Điểm Tuyết
27-07-2009, 21:45
Cám ơn các thầy đã chỉ ra sự khác biệt cơ bản giữa C string và Pascal string. Theo em thì trong C, length(s) trả về kiểu int nên đối với hệ 16 bit thì maxlength = 2^16 (như thaygiaolang đã chỉ ra). Có thể suy rộng ra như sau hay không: đối với hệ 32 bit (int chiếm 4 bytes) thì maxlength = 2^32, hệ 64 bit thì int chiếm 8 bytes(??) và khi đó maxlength(s) = 2^64 ??

Nhân tiện em hỏi thêm 1 câu: trong Pascal , khi ta khai báo 1 string thì Pascal cấp cho ta 256 bytes cho string đó, bất chấp ta có dùng hết hay không, hay là ta cần dùng bao nhiêu (trong giới hạn 256) thì Pascal sẽ cấp bấy nhiêu?

thaygiaolang
28-07-2009, 08:41
Theo như mình biết (không biết có đúng không) thì khi ta khai báo string thì Pascal cấp luôn 256 bytes. Còn nếu muốn tiết kiệm bộ nhớ thì ta khai báo string[x], Pascal sẽ chỉ cấp x+1 bytes cho xâu đó (dưới thời DOS bộ nhớ rất hạn chế nên mới phải hà tiện như vậy)

tttymhy
28-07-2010, 13:30
Các thầy cô cho hỏi. Tôi khai báo s:string; nhưng khi nhập giá trị cho S chỉ nhập được 127 kí tự. Theo lý thuyết S sẽ nhập được 255 kí tự. Tôi không biết tại sao, ai biết giải thích giúp tôi với. Tôi dùng Borland Pascal. Cảm ơn.

linhthaodn
28-07-2010, 15:07
Mong các thầy, cô giải thích giúp, theo định nghĩa xâu kí tự: "Xâu là dãy kí tự trong bộ mã ASCII..." tại sao độ dài tối đa của xâu kí tự trong Pascal lại chỉ là 255 kí tự.(trong khi đó bộ mã ASCII lại mã hoá được 256 kí tự

Khi khai báo 1 biến theo kiểu dữ liệu: String, trình Pascal dùng ký tự đầu để biểu diễn độ dài của xâu nên biến đó chứa tối đa là 255 kí tự

* Đơn vị biểu diễn thông tin trong Borland Pascal là 1 byte, 1 byte có 8Bit nên 1 byte biểu diễn được 256 trạng thái. Hệ đếm dùng trong máy tính là hệ cơ số 2.
2^8 = 256.


Các thầy cô cho hỏi. Tôi khai báo s:string; nhưng khi nhập giá trị cho S chỉ nhập được 127 kí tự. Theo lý thuyết S sẽ nhập được 255 kí tự. Tôi không biết tại sao, ai biết giải thích giúp tôi với. Tôi dùng Borland Pascal. Cảm ơn.

Vụ này nhờ các thầy cô khác, cái này mình mới biết khi bạn hỏi.

Nhất Điểm Tuyết
28-07-2010, 19:11
có thể do read()/readln() chỉ cho phép 127

tttymhy
05-08-2010, 08:42
Tôi đã dạy tin lớp 11 mấy năm nay rồi, sách giáo khoa cũng chỉ lý thuyết là khai báo S:String; thì s có thể chứa tối đa 255 kí tự, nhưng học sinh của tôi thử nhập và tôi cũng đã nhập giá trị cho S nhưng S chỉ chứa được 127 kí tự. Có ai biết giải thích giúp tôi. Cảm ơn nhiều.

thaygiaolang
05-08-2010, 15:55
Tôi đã dạy tin lớp 11 mấy năm nay rồi, sách giáo khoa cũng chỉ lý thuyết là khai báo S:String; thì s có thể chứa tối đa 255 kí tự, nhưng học sinh của tôi thử nhập và tôi cũng đã nhập giá trị cho S nhưng S chỉ chứa được 127 kí tự. Có ai biết giải thích giúp tôi. Cảm ơn nhiều.

Theo mình biết thì đây không phải là do trình biên dịch mà là do cách làm việc của DOS. DOS có cung cấp 1 dịch vụ để chương trình lấy dữ liệu nhập vào từ bàn phím. Khi sử dụng dịch vụ này, DOS sẽ tạo ra một vùng đệm để chứa các ký tự nhập vào. Cho tới khi người dùng gõ phím Enter thì toàn bộ chuỗi chứa trong vùng đệm này sẽ được chuyển cho chương trình. Vùng đệm do DOS tạo ra có kích thước mặc định là 128 bytes. Như vậy ta có thể nhập tối đa 127 ký tự (chừa 1 byte cho ký tự Enter). Ta có thể thay đổi kích thước của vùng đệm này để có thể nhập được nhiều ký tự hơn bằng cách lập trình can thiệp vào hệ thống hoặc dùng lệnh trong tập tin Config.sys (lệnh gì thì mình không nhớ rõ nữa)
Các hàm Readln và Read của Pascal (hoặc hàm scanf của C++ hay ngay cả dòng lệnh của DOS) sử dụng dịch vụ này (cho đơn giản và nhanh) nên bị giới hạn trên.

kimthangatm
13-08-2010, 01:50
Em có làm 1 chương trình mã hóa RSA và xử lý bằng xâu ký tự các phep div, mod, cộng, trừ, nhân. Nhưng lúc nhập em để ý rằng Pascal chỉ xử lý 123 ký tự thì phải. Tức là nhập 123 ký tự rồi max không nhập đc nữa. Em làm trên Turbol Pascal 7.0 và cũng chưa thử chạy chương trình với Free Pascal. Vì có dạo học lớp 11 em thử dùng và thấy Free Pascal chạy đc với Mảng (array) rất lớn mà Turbol Pascal 7.0 không làm đc.