ABA


"שאלה לגבי qsort ב-C ופויינטרים לפונקציות"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #20208 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 20208
כובען  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 2.3.10
24350 הודעות, 21 פידבק
   19:47   21.09.13   
אל הפורום  
  שאלה לגבי qsort ב-C ופויינטרים לפונקציות  
 
qsort ב-C מהספרייה stdlib.h צריכה לקבל בקריאה שלה פויינטר לפונקציה שעושה compare מהסוג int *(cmp)(void*, void*) zz

אני אמור פשוט לכתוב פונקציה שמקבלת שני פרמטרים מטיפוס void שעושה השוואה בין האובייקטים שאני רוצה לסדר ומחזירה int לפי התיעוד ש-qsort מבקשת?

או שאני צריך לשלוח פוינטר לפונקציה הזו?


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  תשובה, last_test 21.09.13 19:53 1
     התגובה שלך הרבה יותר יעילה מהלינק, השאלה היתה לגבי הפוינטר לא לגבי qsort כובען  22.09.13 00:34 3
  אתה צריך לכתוב פונקציה וגם לשלוח פוינטר לפונקציה כשאתה קורא ל qsort ohadeytan 21.09.13 20:08 2
     מכתב כובען  22.09.13 00:39 4
         אתה יכול לשלוח גם את הכתובת של הפונקציה עצמה (כלומר את השם של הפונקציה) IDAN_500  22.09.13 01:22 5
  תחשוב VeNom  22.09.13 08:29 6
     תודה רבה! כובען  22.09.13 09:53 7
  מכתב NoBuddy 22.09.13 19:02 8

       
last_test
חבר מתאריך 20.8.13
328 הודעות
   19:53   21.09.13   
אל הפורום  
  1. תשובה,  
בתגובה להודעה מספר 0
 
   אתה מייצר את הפונקציה בעצמך, היא מקבלת 2 פרמטרים כביכול const void * שעוברים casting בפנים והיא עצמה מחזירה מספר כמובן.

חיפוש קליל בגוגל

http://www.tutorialspoint.com/c_standard_library/c_function_qsort.htm


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
כובען  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 2.3.10
24350 הודעות, 21 פידבק
   00:34   22.09.13   
אל הפורום  
  3. התגובה שלך הרבה יותר יעילה מהלינק, השאלה היתה לגבי הפוינטר לא לגבי qsort  
בתגובה להודעה מספר 1
 


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ohadeytan לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.8.06
617 הודעות, 3 פידבק
   20:08   21.09.13   
אל הפורום  
  2. אתה צריך לכתוב פונקציה וגם לשלוח פוינטר לפונקציה כשאתה קורא ל qsort  
בתגובה להודעה מספר 0
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
כובען  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 2.3.10
24350 הודעות, 21 פידבק
   00:39   22.09.13   
אל הפורום  
  4. מכתב  
בתגובה להודעה מספר 2
 
כלומר שתהיה לי פונקצית השוואה, נניח שקוראים לה foo
ופויינטר שמצביע ל-foo?

int fooPtr(void*, void*);
fooPtr = foo;

ואז שולח לפונקציה את fooPtr?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
IDAN_500 
חבר מתאריך 11.12.03
2321 הודעות
   01:22   22.09.13   
אל הפורום  
  5. אתה יכול לשלוח גם את הכתובת של הפונקציה עצמה (כלומר את השם של הפונקציה)  
בתגובה להודעה מספר 4
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   08:29   22.09.13   
אל הפורום  
  6. תחשוב  
בתגובה להודעה מספר 0
 
   ערכתי לאחרונה בתאריך 22.09.13 בשעה 08:39 בברכה, VeNom
 
שמי שבנה את האלגוריתם הזה למיון טען שאפשר לעשות אותו ג'נרי לגמרי.
זה אומר שאם יום אחד תרצה למיין מספרים אתה תוכל.
יום אחר תרצה למיין מחרוזות? גם תוכל.
יום אחד תרצה למיין סטודנטים לפי קריטריון מסוים גם תוכל.

איך הוא עשה את זה? הוא בנה שלד שידע לקבל פונקציה פשוטה שמשווה בין 2 ערכים ולהריץ אותה במקום לשאול אם A גדול מ B(בעצם מה זה A גדול מ B? אם A הוא סטודנט איך נדע לפי מה נרצה למיין אותו?)

עכשיו נניח ואתה רוצה להשתמש ב QS לטובת מיון מספרים שלמים. אתה תממש פונקציה כזו..



int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}


אם תרצה למיין משהו אחר, תממש משהו אחר ותשלח ל QS פוינטר לפונקציה..
אגב, אני לא ממש זוכר C ברמה הזו אבל נראה לי שאתה יכול לממש פונקציה עם PROTOTYPE רלוונטי(כלומר שהפרמטרים לא יהיו VOID* אלא INT*)..משהו כזה:


int compare (const int* a, const int* b)
{
return a-b;
}


אתה מעביר לפונקציה את הCOMPARER פשוט כמשתנה למניין(אם קראת לפונקציה compare אז אתה מעביר אותה כפרמטר בשם compare):
משהו כזה:


qs(arr, 50, sizeof(int), compare);


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
כובען  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 2.3.10
24350 הודעות, 21 פידבק
   09:53   22.09.13   
אל הפורום  
  7. תודה רבה!  
בתגובה להודעה מספר 6
 


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
NoBuddy
חבר מתאריך 2.7.02
14473 הודעות
   19:02   22.09.13   
אל הפורום  
  8. מכתב  
בתגובה להודעה מספר 0
 
   ערכתי לאחרונה בתאריך 22.09.13 בשעה 19:18 בברכה, NoBuddy
 
זה ה prototype של הפונקציה


void qsort(void *a_ptr, size_t n_els, size_t e1_size, int compare(const void *, canst void *));


בפונקציה compare עצמה אתה פשוט עושה casting ל (*int) ואז dereference ומשווה בין הפוינטרים
הפונקציה תחזיר ערך קטן מ-0 אם הארגומנט הראשון קטן מהשני
תחזיר 0 אם שניהם שווים
גדול מ-0 אם הארגומנט הראשון גדול מהשני


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net