Hỏi về kiểu bản ghi?

Liên hệ QC

xuanhoa7604

Thành viên hoạt động
Tham gia
9/6/08
Bài viết
169
Được thích
82
Nghề nghiệp
Giáo viên
Các bác cho mình hỏi là nếu mình khai báo một bản ghi như sau:
Mã:
Public Type DiemMonHKData
    DiemMieng(1 To 3) As Byte
    H1(1 To 6) As Byte
    H2(1 To 6) As Byte
    HK As Byte
    TBM As Byte
End Type
Khi mình dùng bản ghi này để ghi dữ liệu vào file có cấu trúc thì mình phải khai báo chiều dài trong phần Len thế nào?
Mình đọc thì thấy bảo khai báo là
Mã:
Dim HS As DiemMonHKDataOpen "HS.dat" For Random As #1 Len = Len(HS)
Khi mình dùng thế thì có lúc thì được, có lúc thì bị lỗi Bad record length. Mình tìm hiểu thêm (phần help trong thông báo lỗi) thì do toàn tiếng anh nên mình chỉ dịch được sơ sơ là nếu dùng mảng như trên thì chiều dài sẽ phải cộng thêm 8+2*Chiều dài gì đó. Mình chẳng hiểu thế nào cả. Bác nào biết thì giúp mình với. Mình xin đưa nguyên văn chỗ mình dịch nữa (trong phần help đó)

  • If the variable being read into is a dynamic array, Get reads a descriptor whose length equals 2 plus 8 times the number of dimensions, that is, 2 + 8 * NumberOfDimensions. The record length specified by the Len clause in the Open statement must be greater than or equal to the sum of all the bytes required to read the array data and the array descriptor. For example, the following array declaration requires 118 bytes when the array is written to disk.
    Dim MyArray(1 To 5,1 To 10) As IntegerThe 118 bytes are distributed as follows: 18 bytes for the descriptor (2 + 8 * 2), and 100 bytes for the data (5 * 10 * 2).


 
Theo nguyên bản tiếng Anh, NumberOfDimensions là số chiều của mảng.
Mảng khai báo 1 chiều sẽ cần cộng thêm 2+8 = 10, mảng 2 chiều sẽ cần cộng thêm 2 + 8*2 = 18
 
Upvote 0
Vậy thì với kiểu bản ghi
DiemMonHKData c
ủa mình thì mình cần để chiều dài là bao nhiêu (trong lệnh Open)? Hơn nữa mình không hiểu tại sao có lúc thì chạy tốt mà có lúc thì lại bị lỗi bad record length??? Mình dịch thì nó bảo là có lúc thì lệnh put sẽ thêm byte chú thích vào có lúc nó lại chỉ ghi nguyên dữ liệu nên mới có tình trạng như vậy. Mình đang lơ mơ cái này quá. Bạn có thể giải thích rõ hơn hộ mình không? Cảm ơn!
 
Upvote 0
Xin lỗi bạn vậy, tôi chỉ dịch tiếng Anh những chữ tôi biết, trong đó chỉ nói về khai báo mảng. Và thí dụ của nó là khi khai báo mảng 2 chiều:
Dim MyArray(1 To 5,1 To 10) As Integer

Mảng này 2 chiều và có 50 phần tử, mỗi phần tử Integer là 2 Bytes, thành 100. Cộng với 2 + 8 * 2 (2 chiều) thành 118 bytes

Byte = 1 Byte
Integer = 2 Bytes
Long = 4 Bytes
Single = 4 Bytes
Double=8 Bytes


còn về khai báo Type tôi chưa nghiên cứu đến.
 
Lần chỉnh sửa cuối:
Upvote 0
Các bác cho mình hỏi là nếu mình khai báo một bản ghi như sau:
Mã:
Public Type DiemMonHKData
    DiemMieng(1 To 3) As Byte
    H1(1 To 6) As Byte
    H2(1 To 6) As Byte
    HK As Byte
    TBM As Byte
End Type
Khi mình dùng bản ghi này để ghi dữ liệu vào file có cấu trúc thì mình phải khai báo chiều dài trong phần Len thế nào?
Mình đọc thì thấy bảo khai báo là
Mã:
Dim HS As DiemMonHKDataOpen "HS.dat" For Random As #1 Len = Len(HS)
Khi mình dùng thế thì có lúc thì được, có lúc thì bị lỗi Bad record length. Mình tìm hiểu thêm (phần help trong thông báo lỗi) thì do toàn tiếng anh nên mình chỉ dịch được sơ sơ là nếu dùng mảng như trên thì chiều dài sẽ phải cộng thêm 8+2*Chiều dài gì đó. Mình chẳng hiểu thế nào cả. Bác nào biết thì giúp mình với. Mình xin đưa nguyên văn chỗ mình dịch nữa (trong phần help đó)

  • If the variable being read into is a dynamic array, Get reads a descriptor whose length equals 2 plus 8 times the number of dimensions, that is, 2 + 8 * NumberOfDimensions. The record length specified by the Len clause in the Open statement must be greater than or equal to the sum of all the bytes required to read the array data and the array descriptor. For example, the following array declaration requires 118 bytes when the array is written to disk.
    Dim MyArray(1 To 5,1 To 10) As IntegerThe 118 bytes are distributed as follows: 18 bytes for the descriptor (2 + 8 * 2), and 100 bytes for the data (5 * 10 * 2).

Không biết bạn định nghĩa kiểu DiemMonHKData thoả đáng chưa, tôi thì nghĩ không nên định nghĩa như vây?
còn trường hợp của bạn tôi nghĩ khi bạn định nghĩa DiemMonHKData các thuộc tính là mảng 1 chiều khi bạn open dữ liệu chắc chắn là tất cả đều có dữ liệu và lưu vào mảng đó không, nhiều khi không đủ dữ liệu đổ vào thì nó cũng báo lỗi đó
với lại dữ liệu điểm số của bạn có chắc là số thực không? và dữ liệu của bạn có nhiều lắm không
vì mỗi biến kiểu DiemMonHKData chiếm khoản 17byte mà nhiều biến thì chiếm rất nhiều bộ nhớ nên chạy chậm và báo lỗi
 
Upvote 0
Thế bạn thử tính cho mình kích thước của bản ghi DiemData được khai báo như sau nhé:
Mã:
Public Type DiemMonHKData
    DiemMieng(1 To 3) As Byte
    H1(1 To 6) As Byte
    H2(1 To 6) As Byte
    HK As Byte
    TBM As Byte
End Type 
Public Type DiemData
    DiemMon(1 To 15) As DiemMonHKData
    H1(1 To 6) As Byte
    H2(1 To 6) As Byte
    HK As Byte
End Type
 
Upvote 0
Không biết bạn định nghĩa kiểu DiemMonHKData thoả đáng chưa, tôi thì nghĩ không nên định nghĩa như vây?
còn trường hợp của bạn tôi nghĩ khi bạn định nghĩa DiemMonHKData các thuộc tính là mảng 1 chiều khi bạn open dữ liệu chắc chắn là tất cả đều có dữ liệu và lưu vào mảng đó không, nhiều khi không đủ dữ liệu đổ vào thì nó cũng báo lỗi đó
với lại dữ liệu điểm số của bạn có chắc là số thực không? và dữ liệu của bạn có nhiều lắm không
vì mỗi biến kiểu DiemMonHKData chiếm khoản 17byte mà nhiều biến thì chiếm rất nhiều bộ nhớ nên chạy chậm và báo lỗi
Không phải là như thế đâu bạn à. Chương trình khi chạy mình thấy cũng rất nhanh. Các dữ liệu đã lưu khi đọc vẫn đúng chỉ có điều là có lúc thì chạy ngon lành, có lúc thì bị lỗi bad record length???
 
Upvote 0
Thế bạn thử tính cho mình kích thước của bản ghi DiemData được khai báo như sau nhé:
Mã:
Public Type DiemMonHKData
    DiemMieng(1 To 3) As Byte
    H1(1 To 6) As Byte
    H2(1 To 6) As Byte
    HK As Byte
    TBM As Byte
End Type 
Public Type DiemData
    DiemMon(1 To 15) As DiemMonHKData
    H1(1 To 6) As Byte
    H2(1 To 6) As Byte
    HK As Byte
End Type

1 biến kiểu
DiemMonHKData chiếm 17 byte
suy ra một biến kiểu DiemData chiếm 267 byte
như vậy chỉ một biến kiểu DiemData lưu điểm thôi mà độ lớn tới 267byte đó bạn
mà 1000 học sinh thì thôi chắc chết vì 1 học sinh có 10 môn
suy ra có 1000*10*267 byte đó, bạn nên tính lại nha
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom