בעיה ב Direct3D9...

ilankt

New member
בעיה ב Direct3D9...

כן כן, אני שוב בא להפריע לכם... טוב, יש לי בעיה, אני רוצה ליצור טקסטורה, ואז לשנות אותה. הבעיה היא כשאני יוצר את הטקטורה, היא מין ReadOnly, ואז אני מקבל access violation... אני כנראה מעביר פרמטרים לא נכונים לפונקציה... הנה הקוד:
D3DLOCKED_RECT *LR=NULL; if (FAILED(Graphics->D3DDevice->CreateTexture(Tw,Th,1,0,D3DFMT_R5G6B5,D3DPOOL_MANAGED,&Texture,NULL))) return FALSE; Texture->LockRect(0,LR,NULL,D3DLOCK_NOSYSLOCK ); for (int y=0;y<Th;y++) { for (int x=0;x<Tw;x++) { ((unsigned long*)LR->pBits)[x + ((y*LR->Pitch)>>2)]=D3DCOLOR_XRGB(255,0,0); } } Texture->UnlockRect(0);​
עקרונית הוא אמור לצבוע לי את הטקסטורה באדום... אבל לא עובד :( בתודה מראש.
 

voguemaster

New member
תבדוק את האריתמתיקה שלך

אם קיבלת מצביע תקף תבדוק את החישוב שלך. תמיד אפשר לסמוך על MS שישנו משמעות של דברים. עד DX7 ה-stride וה-pitch הוגדרו בצורה אחרת
זונות... בכל אופן, כדאי שתבדוק עם ה-DEBUGGER מה קורה כדי למצוא בדיוק איפה הבעיה שלך...
 

gil03

New member
שאלה:

טוב אז קודם כל אני גיל חבר של אילן שאנחנו ביחד עושים משחק. עכשיו לא כל כך הבנתי למה אתה מתכוון אם תוכל לפרט... ודבר שני אי אפשר לבדוק ב-DEBUGGER כי הוא תוקע את המחשב ככה... תודה
 

MotiAd

New member
יש לך בעייה אחרת נדמה לי...

לפחות עד היום לפי הבנתי המצביע שהגדרת הוא NULL כלומר לא מצביע לאף מקום. ואחר כך אתה מנסה לגשת לאיזור ע"י LockRect והיסט מכתובת 0 שאני לא מבין איך אתה בדיוק מחשב אותו. איך אתה מאתחל בכלל את המצביע? הבעייה נדמה לי נעוצה כאן. תבדוק בכלל אם המצביע מאותחל. שלך, מוטי.
 

MotiAd

New member
או קיי...

אז אם ככה הבנתי בעיקרון מה קורה פה. השורה התחתונה אתה עדיין אמור לבדוק אם המצביע LR מאותחל בכלל. תעשה מעקב אחרי הפונקציה הקודמת. הדבר המצחיק הוא שיש הרבה פונקציות שמתבצעות כהלכה ולא מחזירות שום קוד שגיאה אבל לא עושות כלום בעצם. קרה לי. בדוק את הפרמטרים לפונקציה ההיא. שוב שלך, מוטי.
 

gil03

New member
קודם כל תודה רבה...

אז גם אני חושב שזאת הבעיה... אבל אני פשוט לא יודע איך להתחל את המשתנה LR וחוץ מזה המשחק לא עובד גם בלי ה-NULL שמהתחל את המשתנה LR. אם מישהו יודע איך מהתחלים את המשתנה שבבקשה יכתוב אני יודה לו מאוד.
 

voguemaster

New member
זה לא זה

ואם זה העניין אני אהיה מופתע מאוד. הפונקציה שהוא קורא לה מצליחה (אחרת בכלל לא מגיעים אל הלולאות) והיא זו שאמורה למלא את המבנה (לדעתי היא מקצה אותו). לדעתי זה מדריש דיבוג ברמה יותר טובה. ברמת האסמבלי אפשר בקלות לגלות איפה ה-page fault שגורם לתוכנית לקרוס. הנה אחת הבעיות של הדיבגר של VC...
 

גיל14

New member
וואי וואי וואי איזה קוד מבולגן

אני הישראלי היחיד ששומר על סדר? תפרק את הקוד שורה של הFAILED() לאיזה ארבע שורות ותוסיף קומנט לכל פונקציה שאתה קורא לה...
 

גיל14

New member
הערות! אין הערה אחת בקוד הזה

מה אתה לעזאזל עושה שם? מה פירוש Th? (זאת שאלה עקרונית, לא ספציפית)
 

gil03

New member
תגובה:

קודם כל מה זה קשור לשאלה??? דבר שני זה ה-height של הריבוע.
 

אלדד28

New member
מה לא בסדר?

הקוד סביר, ומי שמכיר DX לא יתקשה להבין מה קורה שם. ולגבי הערות - נו, זו שאלה בפורום, ואפילו אם לא, בקוד הזה ממש לא צריך הערות. אני רואה איך הקוד שלך בטח נראה, כולו ירוק. הרבה הערות זה סימן לסירחון בקוד (מתוך "REFACTORING"). כל המוסיף גורע. גם הערות צריך לדעת לכתוב.
 

גיל14

New member
סליחה שדיברתי.

אם יש לי פונקציה שיש לה הרבה ארגומנטים, אני משתדל להסביר מה כל אחד ואחד מהם, בשתי מילים. לא בהגזמה פראית, לא לכל שורה צריך הערה (אלא אם כן אני באסמבלי). ואני לא משתמש בשמות חסרי-תוכן כמו Th. TableHight יקח לך רק שניה לכתוב, ויחסוך שעה להבין עוד חצי שנה...
 

אלדד28

New member
אתה צודק בהחלט לגבי TableHeight,

אבל לא לגבי כל השאר. גם ל-strncpy אתה מסביר על כל פרמטר ופרמטר? לא. למה? כי זו פונקציה ידועה. מי שמכיר DirectX יודע את הארגומנטים, ואם לא אז יש HELP. העמסה של הערות על הקוד היא מיותרת ומזיקה. ודבר אחרון, אתה לא צריך להתנצל על הדיבור, זה לגיטימי לחשוב אחרת אתה יודע...
 

גיל14

New member
עכשיו כשאני חושב על זה...

עם TableHeight אני מסתכל על כל הפונקציה אחרת...הגזמתי, ואתה צודק.
 
למעלה