PDA

View Full Version : Giúp tui sửa lỗi DirectDraw với ...



Riddle
11-03-2004, 02:16
Câu 1: Tại sao không sử dụng được các chế độ màn hình cao bằng của máy mình trong Direct Draw khi kiểm tra bằng phương thức lpDD4 -> EnumDisplayModes ( ..

máy tui lên tận 1280x1024x32 mà thử trong DirectDraw thì chỉ đến 1024x768x32 là hết vẹo

Câu 2:

gọi hàm lpDD4 -> SetDisplayMode(800,600,32) (hoặc các số khác) có 1 điều lạ là trong ebook mà tui đọc thì nó bảo hàm SetDisplayMode có 5 đối, còn VC++ complier thì bảo nó có có 3 đối (như tui code ở trên)

khi chạy thì báo lỗi runtime như sau:



Debug Error!

Program: ... \Debug\DirectDrawMain.exe
Module:
File: i386\chkesp.c
Line: 42

The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

(Press Retry to debug the application)
Abort Retry Ignore



ngồi cả buổi dịch mà không trôi, hình như bác Bill không chữa được con bọ này nên cho 1 câu khó hiểu hết chỗ nói để thiên hạ thi nhau đoán mò ... ??

thử dịnh như sau, không hiểu nổi :buck:
Giá trị của ESP đã không được lưu lại đúng cách trong khi hàm được gọi. Điều này thường là kết quả của việc gọi 1 hảm công khai với một quy ước gọi hàm với con trỏ hàm công khai với một quy ước gọi hàm khác. :bawling:

InstCode
11-03-2004, 05:23
- Chức năng IntelliSense của VC++6.0 IDE chỉ hỗ trợ DirectDraw SDK có 5.0, bi chừ DirectDraw đã lên tới 7.0 (và nghẻo tại đây luôn rồi !...), cho nên auto comlete của nó sẽ sai lệch. Một cách giải quyết đó là mang cái file ddraw.h add vào project để cho nó chức năng này reparse+display lại cho đúng.

- Về việc gây ra lỗi (cả hai lỗi), theo tui nghĩ là do bác xài bộ thư viện DDraw SDK là 4.0 (tại tui biến DDraw-Interface của bác là lpDD4), trong khi runtime library của hệ thống chỉ có version bự hơn (ví dụ bộ DX của WinXP SP1 đã là 9.0)... Tui chỉ xài DDraw 7.0 thui à, dzô trang download của M$ down về bộ SDK mới xài cho nó sướng, tội gì phải cà khổ với thằng tổ sư nhà nó.

- Còn cái tài liệu bác đọc là cho thằng DDraw khác rồi (có thể là 7.0, tui chỉ xài 7.0 nên cũng không tìm hiểu rõ mỗi ver sau nó khác thằng trước cái gì ...), lúc này SetDisplayMode có 5 đối số, trong đó 2 đối số cuối thường mặc định là 0. Tui cũng nói thêm là ở đối số Refresh Rate, tuỳ theo loại monitor mà bác nên cho nó nhỏ nhỏ thui (cỡ 70Hz là vừa), màn hình sẽ hơi rung (flick), nếu không bác sẽ không thể chuyển lên độ phân giải cao hơn được. Mà hình như video-card của bác cũng hơi xoàng :-) ?? Hì hì, mới tới có 1280x1024x32 mà đã nghẻo rồi ! Máy của tui card 4MB bèo nhèo mà còn lên được 1600x1200x32 ... Đang chờ tài trợ kiếm cái GeForce cho oách ... hé hé !

InstCode
11-03-2004, 05:50
- Hí hí... đọc lại bài bác, thấy ông Bill tội wé, nghe nói hồi xưa ba mẹ ông ta quen nhau trước cái cổng chùa, trên tay mỗi người là một cái hoá đơn tính tiền => sinh ra ổng đặt là Bill-Gate lun !... Hé hé hé hé ...
- Hì hì, ở đây cái chữ "declare" hổng phải dịch là "công khai", thuật ngữ lập trình là "khai báo" do đó theo ý tui, dịch cái đống văn :

"The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention."

Thành ra là :

Giá trị của thanh ghi ESP (extended stack pointer) đã không được lưu lại đúng đắn qua việc gọi hàm này. Điều này thường là do kết quả của việc gọi một hàm mà có khai báo các đối số ngầm định (cái này bác lập trình C/C++ chắc đã hiểu rõ) thông qua một con trỏ hàm (cũng của C/C++, dùng con trỏ trỏ đến địa chỉ của hàm, để gọi hàm thì chỉ việc lấy nội dung con trỏ) nhưng đối số ngầm định để gọi lại sai khác (sai khác nhau về thứ tự hay ý nghĩa của các tham số gì đó ...)

Riddle
11-03-2004, 19:18
- Chức năng IntelliSense của VC++6.0 IDE chỉ hỗ trợ DirectDraw SDK có 5.0, bi chừ DirectDraw đã lên tới 7.0 (và nghẻo tại đây luôn rồi !...), cho nên auto comlete của nó sẽ sai lệch. Một cách giải quyết đó là mang cái file ddraw.h add vào project để cho nó chức năng này reparse+display lại cho đúng.

- Về việc gây ra lỗi (cả hai lỗi), theo tui nghĩ là do bác xài bộ thư viện DDraw SDK là 4.0 (tại tui biến DDraw-Interface của bác là lpDD4), trong khi runtime library của hệ thống chỉ có version bự hơn (ví dụ bộ DX của WinXP SP1 đã là 9.0)... Tui chỉ xài DDraw 7.0 thui à, dzô trang download của M$ down về bộ SDK mới xài cho nó sướng, tội gì phải cà khổ với thằng tổ sư nhà nó.

- Còn cái tài liệu bác đọc là cho thằng DDraw khác rồi (có thể là 7.0, tui chỉ xài 7.0 nên cũng không tìm hiểu rõ mỗi ver sau nó khác thằng trước cái gì ...), lúc này SetDisplayMode có 5 đối số, trong đó 2 đối số cuối thường mặc định là 0. Tui cũng nói thêm là ở đối số Refresh Rate, tuỳ theo loại monitor mà bác nên cho nó nhỏ nhỏ thui (cỡ 70Hz là vừa), màn hình sẽ hơi rung (flick), nếu không bác sẽ không thể chuyển lên độ phân giải cao hơn được. Mà hình như video-card của bác cũng hơi xoàng :-) ?? Hì hì, mới tới có 1280x1024x32 mà đã nghẻo rồi ! Máy của tui card 4MB bèo nhèo mà còn lên được 1600x1200x32 ... Đang chờ tài trợ kiếm cái GeForce cho oách ... hé hé !

Tui dùng XP , DirectX runtime 9.0, DirectX SDK 9.0, VC++6.0, tài liệu huớng dẫn chắc là DirectX 7.0,
Nhưng ở đó người ta chỉ nói lpDD4 chứ làm gì có lpDD7 or lpDD9 gì cả ...
Card màn hình GeForce4 Mx (hic! học mới biết cái dòng MX kém kỏi thật :bawling: ) 64MB, chơi game Sillent Hill 2 vẫn ngon lành, thế nhưng chế độ phân giải chỉ lên tới 1280x1024x32 là hết vẹo, tại vì cũng chẳng dùng chế độ nặng hơn nên cũng chẳng để tâm, nhưng bác nói thế thì hỏi luôn, tại sao lại thế tại vì sao lại thế ... ???

Riddle
11-03-2004, 19:20
ESP là thanh ghi mở rộng ở Intel mới hả, tui mới chỉ học vi sử lí đời cổ thôi .....

ke_tui_nha
11-03-2004, 20:38
Bạn dùng VC++ 6.0 bản Enterprise phải không?? Nếu đúng vậy thì dùng bản professional đi :D

Riddle
11-03-2004, 23:28
mọi thứ bình thường rôi . Phù ...
thể bản Professional có gì hơn không, tui dùng cái Ent vẫn ngon mà ????

InstCode
12-03-2004, 03:21
Vậy à ? GeForce MX mà yếu vậy ta ... vậy thì sau này chơi thằng Radeon cho rồi ...
Còn tại sao á ??... Hic, hông biết nhiều về phần cứng lém ... Cao thủ khác đê !...