פורסם 2008 במרץ 1417 שנים אני משתמש בפונקציה SETTIMER באופן הבא:TimerId=SetTimer((UINT)23,(UINT)MySurface->GetTimeUnit(),NextTimeUnit);כאשר הפונקציה NextTimeUnit מוצהרת כך:void CALLBACK NextTimeUnit(HWND hwnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime);ע"פ כל מקור אינטרנטי שראיתי על הפונקציה, זה אמור לעבוד.אבל המהדר מוציא לי שגיאה כזאת:'SetTimer' : cannot convert parameter 3 from 'void (struct HWND__ *,unsigned int,unsigned long,unsigned long)' to 'void (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,unsigned long)'(מציג את הפקודה הראשונה שהבאתי)מה הבעיה, איך פותרים אותה?נ.ב. אני משתמש בVisual C++ 6
פורסם 2008 במרץ 1417 שנים חיפשתי טיפה בmsdn. הפונקציה SetTimer לא אמורה לקבל 4 פרמטרים?http://msdn2.microsoft.com/en-us/library/ms644906(VS.85).aspx
פורסם 2008 במרץ 1517 שנים מחבר אני מפעיל את הפונקציה מתוך אובייקט של חלון, במקרה הזה לא צריך להעביר את הפרמטר הראשון
פורסם 2008 במרץ 1517 שנים נראה לי שהבנתי מה הבעיה...במערכות של 32 ביט, UINT_PTR מוגדר להיות unsigned int. במערכות של 64 ביט, UINT_PTR הוא unsigned long.משום מה, זה גורם בעיה.נסה להחליף את הטיפוס של idEvent ל-UINT.
פורסם 2008 במרץ 1517 שנים מחבר אובייקט ? האם NextTimeUnit מוגדרת כפונקציה סטטית ?לא... זה משנה? חוץ מזה הפונקציה פונה לפרמטרים לא סטטיים של המחלקה, אז איך אוכל להגדיר אותה כסטטית?שניצל ניסיתי את זה כבר, הוא עדיין מוציא אותה שגיאה, אפילו שכל הפרמטרים מאותו טיפוס:'SetTimer' : cannot convert parameter 3 from 'void (struct HWND__ *,unsigned int,unsigned int,unsigned long)' to 'void (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,unsigned long)'מה זה ה _stdcall * שהוא מוסיף שם(אני לא מבין בזה).
פורסם 2008 במרץ 1517 שנים כן, זה משנה. היא חייבת להיות מתודה סטטית או פונקציה חופשית. הסיבה היא שמתודות לא-סטטיות נקראות בייחס לאובייקט ספציפי, ולכן ה-calling convention שלהם שונה מפונקציה רגילה או פונקציה סטטית. אחד המימושים הסטנדרטיים לזה הוא שהקומפיילר מעביר את המצביע לאובייקט (this) בפרמטר הראשון.אם אתה רוצה להגיע למשתני אובייקט, אתה צריך לדאוג של-callback יגיע משהו שאתה מספק מראש, לדוגמא מצביע לאובייקט.דרך מקובלת אחת היא משהו כזה:class X {public: //... void doCallback( int foo ); // Actual callback code, can use members, etc... //...};void CallbackBridge ( int current_foo, void* ptr ) // A Bridge from a callback to the member funcion{ X* the_object= (X*)ptr; if ( the_object != NULL ) the_object->doCallback( current_foo );}int main (){ // ... X the_object; RegisterCallback( CallbackBridge, (void*)&the_object ); // ...};כמובן ה-framework שאתה משתמש בו (במקרה שלך SetTimer) צריך לאפשר לך להביא מידע לפונקצית ה-callback, וסביר שאכן הוא עושה זאת.לפעמים לפני CallbackBridge תצטרך להוסיף:extern "C" void CallbackBridge ( int current_foo, void* ptr ) // ...
פורסם 2008 במרץ 1517 שנים זה קונבנציה של קריאה לפונקציה בחלונות.בכל מקרה, אני לא בטוח שאתה יכול להעביר פונקציה לא סטטית בתור פרמטר ל SetTimer.
פורסם 2008 במרץ 1517 שנים מחבר אז איך זה אמור להיראות... ככה?:הצהרות: static void CALLBACK NextTimeUnit(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime, void *ptr); void NextTimeUnit();אחר כך הרג'יסטר:RegisterCallback(NextTimeUnit,(void*)this);ואז פשוט קריאה לSETTIMER?הוא מציג לי את השגיאה הבאה:'RegisterCallback' : undeclared identifier(כפי שציינתי קודם אני בVC++6)
פורסם 2008 במרץ 1617 שנים ננעל עקב הקפצה אסורה (אין להקפיץ תוך פחות מ-24 שעות).tdknight, קיבלת אזהרה ראשונה. קרא בבקשה את חוקי הפורום.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.