ABA


"זקוק לעזרה קטנה בC"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #14533 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 14533
iceman23

   00:49   12.01.08   
אל הפורום  
  זקוק לעזרה קטנה בC  
 
   עבר עריכה לאחרונה בתאריך 12.01.08 בשעה 01:02 על-ידי Nesher (מנהל הפורום)
 

#include <stdio.h>
#include <stdlib.h>

void func(int grd[], int *pgrd)
{
puts("enter grade no.3");
scanf("%d",&grd[2]);
pgrd = grd;
printf("%d,%d\n",grd,pgrd);
}

int main()
{
int grades[5], *pgrd;
func(grades, pgrd);

printf("%d,%d\n",grades,pgrd);
}


פלט:
enter grade no.3
123
-1077566652,-1077566652
-1077566652,-1208042048

למה הפוינטר pgrd לא שומר על הכתובת שנתתי לו בתוך הפונקציה?
הוא אמור להכיל אותה כותבת כמו grades לא?

תודה מראש..


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

  האשכול     מחבר     תאריך כתיבה     מספר  
  די בטוח שאתה צריך לשלוח reference ולא מצביע Nesher  12.01.08 01:06 1
  כי אתה מעביר את הנתונים מהצורה של מערך מספרי idan192 12.01.08 10:37 2
  אתה לא הראשון שנפל במלכודת הזו.... TTAsnn 13.01.08 00:07 3

       
Nesher  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 2.7.02
2 הודעות, 24 פידבק
   01:06   12.01.08   
אל הפורום  
  1. די בטוח שאתה צריך לשלוח reference ולא מצביע  
בתגובה להודעה מספר 0
 
בשביל שזה יכיל את אותה כתובת
אתה יכול ליצור 10 מצביעים לאותו מקום בזיכרון
אבל לכל אחד יהיה כתובת שונה

וואי איך שכחתי כבר להתעסק בכל נושא המצביעים חח ^_^
מקווה שלא טעיתי :P


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

   10:37   12.01.08   
אל הפורום  
  2. כי אתה מעביר את הנתונים מהצורה של מערך מספרי  
בתגובה להודעה מספר 0
 
   ערכתי לאחרונה בתאריך 12.01.08 בשעה 18:19 בברכה, idan192
 
חד מימדי שזה פויינטר לזכרון הקבועים לעוד פויינטר.
הפויינטר לא יודע איך להתייחס להפרדה בין המספרים.
בשבילו זו שרשרת ארוכה עם נתונים שמצביעה לזכרון.
שכחת גם לאפס את המערך. {int grd = {0,
ועדיף גם את הפויינטר לאפס ( =NULL, אבל רוב הקומפיילרים מסתדרים עם זה לבד).
ומה שגם, אחרי זה אתה מדפיס את הפויינטר עצמו (grd) ולא את התוכן שלו grd[1], למשל.
בשביל להדפיס את כל התוכן תצטרך ליצור אינדקס i שירוץ מ-0 עד 5 וכל פעם ידפיס grd[i].


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

   00:07   13.01.08   
אל הפורום  
  3. אתה לא הראשון שנפל במלכודת הזו....  
בתגובה להודעה מספר 0
 
   ערכתי לאחרונה בתאריך 13.01.08 בשעה 00:08 בברכה, TTAsnn
 
אתה צריך לשנות את ההגדרה של הפונקצייה ל:

void func(int grd[], int **pgrd)

ואת הקריאה לה ל:

func(grades, &pgrd);

ובתוך הפונקצייה את :


pgrd = grd;

ל


*pgrd = grd;

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


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

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

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



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