PDA

View Full Version : [Q] Pascal FAQ



Junior IT
20-01-2003, 11:55
Trong Pascal có nhiều thứ có sẵn (procedure và function), sử dụng hoài nhưng mình ko hiểu cơ cấu hoạt động của nó thế nào , xin mọi người giúp đỡ
1. procedure Move
2. procedure Fillchar
3. function Sizeof
4. Trong Turbo Pascal có thể nào tạo proc hay func có số tham biến vô hạn ko
Vi' dụ : procedure Write (có sẵn) có số tham biến ko giới hạn
Cách tạo nũưng proc và func như vậy??
Thanks a lot
:D

btkiet
20-01-2003, 14:43
Các proc và func này có nhiều khả năng được thiết kế bằng hợp ngữ nên không biết được chính xác là dùng cách nào để gán dữ liệu. Cơ cấu hoạt động thì bình thường thôi.
proc fillchar bạn có thể thực hiện được bằng cách for đến hết mảng, gán các phần tử của mảng bằng một giá trị định trước.
func sizeof thì phải truy xuất vào vùng nhớ mới biết được kích thước, nhưng mình cũng có thể tính được nếu biết được cấu trúc của biến đó.
Trong Pascal không thể thiết kế được các proc và func có số tham biến vô hạn như write hay read được đâu.

Junior IT
20-01-2003, 16:18
Vậy còn proc Move ???
Trong Turbo đúng là ko thể tạo được proc và func có tham số vô hạn nhưng trong Free Pascal thì sao?
Proc Fillchar, nếu muốn gán cho mạng đó toàn bộ có giá trị -1 thì phải khai báo thế nào? Và nguyên tắc khai báo của nó là gì?

attilathehun
21-01-2003, 15:27
Bạn phải biết rằng các hàm pascal được viết theo cơ cấu nào ít ai biết được, nhất là các hàm đồ họa. Nhưng nhiều hàm họ viết hoàn toàn chưa tối ưu, vì thế hiện nay đã có rất nhiều người tìm cách viết lại các hàm để đạt được tốc độ xử lý nhanh hơn. Tui cũng quan tâm đến vấn đề này lắm, bạn nào có hàm viết lại nào hay post lên cho bà con xem với.

CrazyBabe
21-01-2003, 15:28
Move(Source,Dest,Size) : Di chuyển (chép - copy) size bytes từ source đến dest. Nếu muốn fillchar toàn bộ các phần tử bẳng -1 thì quái wá, fillchar tức là tô kiểu char (?) chứ đâu phải kiểu int ? Bạn có thể fillchar một mảng kiểu shortint = -1 thì được fill với giá trị byte(-1) ý. Lệnh kiểu read hay write là internal function nên có tham số vô hạn được. Nếu bạn dùng free pascal thì có thể khai báo lệnh kiểu là A(B : Array of const), truy nhập các tham số của B từ Low(B) đến High(B), rùi case typeof(B) tuỳ kiểu mà xử lý. Các kiểu trả về của hàm typeof có thể tham khảo trong mã nguồn của thư viện system (do tui kô nhớ rõ) hình như là TInteger, TByte, TChar.... thì phải. Cách khai báo này có thể coi như là tham số vô tận được, tương tự với khai báo array of typedef (some type are definity)

Junior IT
23-01-2003, 08:52
Proc Move:
var
k : integer;
a : array[1..4] of char;
BEGIN
a[2] := 'a';
move(a, k, sizeof(k));
END.
Tại sao k có gía trị là 24832??

Trong Pas, có bạn nào thường sử dụng những định hướng trình biên dịch ko?
VD: {$A+,B-, M+, R-..}
{$M 65520, 0, 655360}
Mình ko hiểu tác dụng của những cái đó là gì và cách sử dụng nó ??

:D

CrazyBabe
23-01-2003, 09:31
Hì hì, tại zì K có kích thước 2 byte, >> K=A[2]*256+A[1]
Các $Something là chỉ thị dành cho chương trình dịch, bạn nên vào help để tìm hiểu rõ hơn (lâu wá không dùng tui wên hết trơn rùi). Còn $M là chỉ thị để cấp heap cho chương trình thì phải, cú pháp là {$M StackSize, MinHeap, MaxHeap}, không bít có chính xác không nữa...

Junior IT
23-01-2003, 10:26
Vậy nếu K có kích thước 1 byte thì sao?
Mình đang tìm bài tập về xử lý bit, nếu bạn nào có thì cho mình xin nhé :D

lytamhoana6cntt
23-01-2003, 11:52
Theo toi các hàm& thủ tục mà bạn nêu ra không đầy đủ lắm
VD hàm Fillchar
thực chất đây là hàm gán mảng =0
A:array[1..n] of integer;
i,n:integer;
begin
for i:=1 to n do
A[i]:=0;
end;
nhưng thay vì cần vào for bạn có thể
sử dụng:
begin
fillchar(A,SizeOf(A),0);
end;
còn các hàm khác bạn có thể tra trong Help(Bôi đen->Ấn Ctrl+F1)
Nếu không hiểu lắm hãy mail cho tui
(Lytamhoan6cntt@rock.com)

CrazyBabe
23-01-2003, 16:10
Hic, fillchar mà là gán mảng = 0 ?
To Junior: Cái hàm move đó chỉ thực hiện move dữ liệu thui, ví dụ A là mảng kiểu byte, B là mảng kiểu int mà nó move thì cứ fill dữ liệu từ A sang B. Kết quả thế nào chỉ là do cách đánh vị trí byte dữ liệu thui mừ, 1 int = 2 byte = high byte / low byte.

Junior IT
23-01-2003, 17:19
Cám ơn CrazyBabe nhiều nha.
Bạn có thể liên lạc mail với mình để trao đổi thêm : junior_it@movemail.com

Junior IT
26-01-2003, 10:18
Có bạn nào thường hay sử dụng cái khai báo Label và hàm Goto trong Pas ko vẫy?
Mình có 1 đoạn source thế này
proc....
Label Run;
var
...
begin
.....
if i = Top then
goto Run;

j := Top;
......

Run :
begin
data[i] := a;
inc(Top);
end;
end;

Nếu ko sử dụng Label
proc.....
var
.....
begin
...
if i = Top then
begin
data[i] := a;
inc(Top);
end;

j := Top;
.....
end;

Tại sao kết quả của 2 chường trình lại hoàn toàn khác nhau, mình ko hiểu hiện tượng này. Mong mọi người giải thích giúp . Thanks

btkiet
11-02-2003, 12:50
Dĩ nhiên là cho kết quả khác rồi.
ở đoạn dùng label thì nếu thoả điều kiện i=top thì sẽ không thực hiện các lệnh từ lệnh goto đến nhãn Run do đó không thực hiện lệnh gán j:=top
còn ở đoạn không dùng label thì sau khi thực hiện xong lệnh if, chương trình sẽ chạy tiếp và thực hiện luôn lệnh gán j:=top.
Hiện nay người ta không khuyến khích sử dụng label và lệnh nhảy goto vì nó làm mất tính cấu trúc trong chương trình, người khác đọc vào rất khó hiểu.
nếu bạn muốn đoạn chương trình sau giống đoạn chương trình trước thì chỉ cần thêm lệnh else là được.

proc.....
var
.....
begin
...
if i = Top then
begin
data[i] := a;
inc(Top);
end
else begin
j := Top;
.....
end;
end;