ABA


"שאלה על שימוש בפויינטרים, לא ברור לי צורת השימוש"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #10368 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 10368
TYSON 
חבר מתאריך 17.9.08
8384 הודעות
   19:20   27.04.11   
אל הפורום  
  שאלה על שימוש בפויינטרים, לא ברור לי צורת השימוש  
 
   (אני לא יכול לערוך את האשכול הקודם)
אני רק לומד את זה
בניתי פונקציה שמקבל, 3 מערכים
buf - תרגיל שהשמתש מזין, נקלט כ char. למשל 12+34
expr1 - החלק הראשון של התרגיל (12)
expr2 - החלק השני של התרגיל (34)
הפונקציה אמורה להחזר את התו שהוא הפעולה החשבונית

היא כתובה בסדר? עובד\לא עובד זה כבר אני אטפל...
הבעיה שהתוכנה שלי בכלל לא רצה כי כנראה אני עושה משהו שגוי
זה עובר קומפילציה אבל נתקע בהרצה
המימוש שלה נראה ככה
(זה סתם מימוש לבדוק אם זה עובד)
נראה לי שפה הבעיה... אני לא יודע איך להעביר את המימוש או משהו כזה

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


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

  האשכול     מחבר     תאריך כתיבה     מספר  
  אתה חייב להשתמש כאן ברקורסיה? VeNom  27.04.11 19:54 1
     זאת עבודת הגשה אני בלימודים TYSON  27.04.11 20:13 2
         שמע אם התוכנית נתקעת VeNom  27.04.11 20:35 3
  יש פה כמה בעיות Net_Boy  27.04.11 23:14 4
     הנה קוד יותר מסודר וקריא Net_Boy  27.04.11 23:26 5
         תודה רבה! הבנתי עוד כמה דברים שלא ידעתי TYSON  28.04.11 13:07 6
             תשובה עידן_הכלי 28.04.11 14:32 7
                 תודה רבה TYSON  28.04.11 15:28 8
  אין כזה דבר ב C, פונקציה שמקבלת מערך. ShocKi  29.04.11 00:12 9

       
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   19:54   27.04.11   
אל הפורום  
  1. אתה חייב להשתמש כאן ברקורסיה?  
בתגובה להודעה מספר 0
 
   כי איך שאני רואה את זה יותר קל לעבור תו תו ולבדוק האם הוא ספרה\רווח\אנטר\סימן ולהחזיר בהתאמה עם SWITCH פשוט..
ושהתוכנית נתקעת אחרי שהיא עוברת קומפילציה כנראה שאתה נכנס כאן ללולאה אינסופית ברקורסיה..אז עצה שלי היא שתשים כל מיני הדפסות בין הקטעים ותדע איפה אתה נתקע..ונראה שאתה מבין איך לעבוד עם הפוינטרים..
רק שתדע כשאתה עושה משהו כזה:

*buf
זה במקרה הזה שקול לפעולה של
buf[0]
[\code]


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
TYSON 
חבר מתאריך 17.9.08
8384 הודעות
   20:13   27.04.11   
אל הפורום  
  2. זאת עבודת הגשה אני בלימודים  
בתגובה להודעה מספר 1
 
   על העבודה רק רקורסיה אסור לולאות... זה רק סעיף אחד

והיא נתקעת בשניה שהיא נכנסת... משהו בקריאה לפונקציה לא טוב לא משהו בפנים (לפחות כרגע)


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   20:35   27.04.11   
אל הפורום  
  3. שמע אם התוכנית נתקעת  
בתגובה להודעה מספר 2
 
   ועוברת קומפילציה אז לא נראה לי שהבעיה היא בקריאה..
תדפיס את הערך של *buf שאתה נכנס לפונקציה ותבדוק אם שם הבעיה..לדעתי אתה נכנס ללולאה אינסופית ברקורסיה(בטח טעות קטנה)..אחרת לא שמתי לב למשהו שהוא לא תקין..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   23:14   27.04.11   
אל הפורום  
  4. יש פה כמה בעיות  
בתגובה להודעה מספר 0
 
   1) המשתנה הסטטי של התו שלך לא מאותחל
2) אתה אמור לבדוק שהמחרוזות שלך מסתיימות ב-0 ולא ב\N
שמעבירים מחרוזות בלי גודל, התו המסיים שלהם הוא 0 (NULL) ולכן כנראה הרקורסיה שלך ממשיכה עד שאתה יוצא ממרחב הזכרון שלך או מגיע למקום שאסור לך לרשום\לקרוא.
3) הקוד עצמו לא יתן את הפלט המצופה



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   23:26   27.04.11   
אל הפורום  
  5. הנה קוד יותר מסודר וקריא  
בתגובה להודעה מספר 4
 
  

// Make sure expr1,expr2 is at least the size of buff !
char partition(char *buff, char *expr1, char* expr2)
{
// 0 is returned if the sign wasn't found
static char sign = 0;

// Always validate pointers before using them
if(buff == 0 || expr1 == 0 || expr2 == 0)
return sign;

char current = *buf;

// End of the null terminated buffer
if(current == 0)
return sign;

// We already found the sign, we can set the value in the 2nd expression
if(sign != 0)
{
*expr2 = current;
return partition(buff++, expr1, expr2++);
}
else
{
if(current ='+' || .... )// test all signs
{
sign = current;
return partition(buff++, expr1, expr2);
}


*expr1 = current;
return partition(buff++, expr1++, expr2);
}


}

אני אחרי 16 שעות עבודה
אז סביר להניח שיש לי פה כמה טעויות אבל תיעדתי לך את זה בצורה טובה, אז אתה אמור להבין מה עשיתי פה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
TYSON 
חבר מתאריך 17.9.08
8384 הודעות
   13:07   28.04.11   
אל הפורום  
  6. תודה רבה! הבנתי עוד כמה דברים שלא ידעתי  
בתגובה להודעה מספר 5
 
   ושאלה קטנה בקשר לשורה הזאת


// Always validate pointers before using them
if(buff == 0 || expr1 == 0 || expr2 == 0)
return sign;

מה הכוונה בלבדוק את הפוינטרים?

ברגע שקראתי לפונקציה, מה נמצא ב expr1 וexpr2? לא 0?
איך זה לא מחזיר לי sign ישר על ההתחלה? לא ברור לי הקטע הזה

שוב ממש תודה!


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

   14:32   28.04.11   
אל הפורום  
  7. תשובה  
בתגובה להודעה מספר 6
 
   כשאתה מגדיר פוינטר, הוא מצביע לכתובת מסויימת.
המטרה היא לוודא שהוא מצביע לכתובת תקינה ולא ל-0 (null).

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

בקשר לקריאה, זה תלוי איך קראת לפונקציה, אבל לא אמור להיות שם 0, אלא כתובת אקראית כלשהי בזיכרון לשם אתה תכתוב, לכן עליך לוודא שהכתובת אכן ניתנת לכתיבה, כדי שלא תדרוס זיכרון קיים.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
TYSON 
חבר מתאריך 17.9.08
8384 הודעות
   15:28   28.04.11   
אל הפורום  
  8. תודה רבה  
בתגובה להודעה מספר 7
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק
   00:12   29.04.11   
אל הפורום  
  9. אין כזה דבר ב C, פונקציה שמקבלת מערך.  
בתגובה להודעה מספר 0
 
   אתה לא יכול להעביר מערך כפרמטר לפונקציה.
אתה מעביר את הכתובת של המערך ומכאן הצורך בפוינטר, כי אם לא תמשתמש בפוינטר אז יוגדר מערך כמשתנה לוקאלי בתוך הפונקציה ואז היא לא תבצע שום שינוי במערך המקורי.

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

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


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


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

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

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



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