ABA


"מבקש עזרה ב - C"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15484 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15484
פלזמה 
חבר מתאריך 22.1.08
1044 הודעות, דרג אמינות חבר זה
   13:35   02.10.09   
אל הפורום  
  מבקש עזרה ב - C  
 
   ערכתי לאחרונה בתאריך 02.10.09 בשעה 14:08 בברכה, פלזמה
 

#include<stdio.h>
#include<conio.h>
void main ()
{
clrscr();

int a,b,c,*f;
f++ ;
*f=10;
printf("%d",f);
c++ ;
*c=20;
printf("%d",c);

}

מה אני צריך ליכתוב כדי לעבור לאיבר הבא במערך C/F ולהציב ערך

בנוסף איך בתוך קוד התוכנית אני יכול לאפשר את הסוגריים המרובעים כי הדף ברוטר משמיט אותם, ומשמיט גם את ה ++ (שהוספתי אותם בהמשך).


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

  האשכול     מחבר     תאריך כתיבה     מספר  
  דבר ראשון VeNom  02.10.09 13:57 1
     תגובה פלזמה  02.10.09 14:11 2
         מכתב hm10 02.10.09 14:41 3
         הבעיה הקודמת תוקנה אבל השניה עדין תקפה פלזמה  02.10.09 16:47 5
         כתבו לך תוכנית VeNom  02.10.09 17:19 6
  תראה. Deuce  02.10.09 16:09 4
     :} נראה לי ערבבת קצת Java חח ldan192  02.10.09 19:24 7
         חח איזה טעות - תיקנתי :P Deuce  02.10.09 22:18 9
  קודם כל, בהתחלה שכחת לאתחל עם malloc ldan192  02.10.09 19:27 8
  בדיקת סוגריים מרובעים פלזמה  03.10.09 22:18 10

       
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק, 2 נקודות
   13:57   02.10.09   
אל הפורום  
  1. דבר ראשון  
בתגובה להודעה מספר 0
 
   בשורה של האתחול של f הוא כרגע פוינטר שלא מצביע לשום מקום(מצביע לזבל).
שאתה עושה f++ אתה בעצם מקדם זבל.
שאתה עושה *f=10 אתה נכנס למקום זבלי בזכרון והתוכנית שלך תתקרש.
לא הבנתי מה אתה רוצה לעשות כאן בתוכנית..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
פלזמה 
חבר מתאריך 22.1.08
1044 הודעות, דרג אמינות חבר זה
   14:11   02.10.09   
אל הפורום  
  2. תגובה  
בתגובה להודעה מספר 1
 
   תוכל לירשום דוגמת תוכנית קצרה שבה יש מעבר לאיבר הבא במערך והצבת ערך בו.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
hm10
חבר מתאריך 24.9.09
322 הודעות, דרג אמינות חבר זה
   14:41   02.10.09   
אל הפורום  
  3. מכתב  
בתגובה להודעה מספר 2
 
   int *f = NULL;
f = (int*)malloc(sizeof(int) * x)

x = מספר האיברים שיהיו במערך ש-f יצביע

f(x) = n
(כמובן שסוגריים מרובעות ולא עגולות)


x = המיקום במערך (מתחיל ב-0)
n = ערך כלשהו


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
פלזמה 
חבר מתאריך 22.1.08
1044 הודעות, דרג אמינות חבר זה
   16:47   02.10.09   
אל הפורום  
  5. הבעיה הקודמת תוקנה אבל השניה עדין תקפה  
בתגובה להודעה מספר 2
 
   איך בתוך קוד התוכנית אני יכול לאפשר את הסוגריים המרובעים כי הדף ברוטר משמיט אותם, ומשמיט גם את ה ++ (שהוספתי אותם בהמשך).


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק, 2 נקודות
   17:19   02.10.09   
אל הפורום  
  6. כתבו לך תוכנית  
בתגובה להודעה מספר 2
 
  

אבל באמת רואים שלא הבנת את הנושא.
שיש לך מצביע

int* f

לדוגמא מסוג int*
הדבר אומר שיש לך משתנה מסוג מצביע שיכול להצביע לטיפוס מסוג int.
כלומר נניח שיש לך את התוכנית הבאה:

int a = 4;
int*f;
f=&a;
printf("%d\n%d\n",a,*f) //will print 4 4
printf("%d\n",f)//will print f's memory address
*f = 5;
printf("%d\n%d\n",a,*f) //will print 5 5
a=7;
printf("%d\n%d\n",a,*f) //will print 7 7


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

int a=8;
int *f=&a;
f++;

בהתחלה f מקבל את הכתובת של a ולכן *f ו a הם בעצם אותו "תיבה" בזכרון ושניהם יש אותו ערך ואותו כתובת.
כאשר אתה עושה f++ אתה מקדם את f באחד,אבל f הוא כתובת בזכרון מסוג int ששוקל 4 בתים..כלומר אתה מקדם את f ב 4 בתים בזכרון..דבר רע מאוד לעשות וטעות נפוצה אצל מתחילים.
כרגע עם הפעולה הזאת f לא מצביע ל a והוא מצביע למקום מסויים בזכרון שכנראה מכיל זבל ויגרום לתוכנית שלך לבעיות אם תשתמש במשתנה.


int a=8;
int* f=&a;
(*f)++;

כאן בהתחלה שניהם מצביעים ל 8..אבל כאן אתה מקדם את *f שמצביע לאותה תיבה של a ולכן a=9 וf עדיין מצביע ל a.

עכשיו לשימוש אחר של מצביעים..יצירת מערך דינאמי..
שאתה לומד מחשבים אז מלמדים אותך לעשות מערך רק שאתה יודע את הגודל שלו מראש. בצורה כזאת:

int arr;


מערך בגודל 10 לדוגמא.
מה קורה אם באמצע תוכנית ירצו שתארגן מערך בגודל שאתה לא יודע מראש?
אז הנה דוגמא:


int size=10;
int* arr;//not pointing anywhere!!!!
arr=(int*)malloc(10 * sizeof(int));


נניח שה size הזה הוא 10 ושקיבלנו אותו בזמן התוכנית מפעולה כלשהי.
אתה הכרזת על משתנה מסוג int* שנקרא arr
אתה רוצה עכשיו ליצור מערך ולכן עלייך לבצע את אחת מפעולות ההקצאה.
לקחתי את malloc שהיא הכי נפוצה.
מה שהיא עושה זה דבר כזה..
אתה שם את שם המשתנה של המערך שאתה רוצה ליצור משמאל..
ואז שם את האופרטור =
ואז יש לך סוגרים עם int* שזה כאילו משהו שנקרא קאסטינג-המרה לטיפוס..כי malloc היא פונקציה כללית ולכן אתה רוצה שהיא תקצה לך מידע למשתנה מסוג int* אז אתה צריך להודיע לה שאתה int*..
ואז את המילה malloc שהיא בעצם שם הפונקציה..ואחריה בסוגרים את הגודל של ההקצאה...
נבוג לשים את הגודל בצורה של
כמות האיברים למערך * גודל של כל משתנה ולכן מקובל לרשום


10 * sizeof(int))

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

arr = 6;

תשים לך במקום ה 0 של המערך 6..
ואתה יכול להשתמש בו גם אחרת

*(arr) <-> arr
*(arr + 1) <-> arr
*(arr + size) <-> arr

arr <-> &arr
(arr + 1) <-> &arr
(arr + size) <-> &arr


בחלק הראשון זה מה שאתה בד"כ מכיר..הרי ה arr הוא עדיין מצביע לכתובת(כתובת ההתחלה של ההקצאה) אבל עם שימוש ב * אפשר לשים בו ערך.
ובחלק התחתון הראתי לך גישה לזכרון של מקום(לא נרצה לשנות אותו סתם ככה).

ומעכשיו אתה יכול לעשות משחקים:


int* arr;
int size = 10;
arr=(int*)malloc(size * sizeof(int));
for(i = 0 ; i < size ; i++)
{
*(arr+i) = i;
}


זה שקול ל

for(i = 0 ; i < size ; i++)
{
arr = i;
}


ונשמיך בתוכנית-כרגע אני עם מערך בגודל 10 שמכיל את האיברים 0 עד 9..

*(arr) = 12 //putting 12 in the "0" index of arr
*(arr + 1) = 15//putting 15 in the "1" index of arr
arr = 27//putting 27 in the 2 index of arr


דבר אחרון שיש לי להגיד זה נגיד ואתה מבצע הקצאה באמצעות malloc לדוגמא..אז אתה זה שאחראי בסוף השימוש במערך לשחרר זכרון.
בסוף התוכנית תבצע שחרור ע"י

free(arr);

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



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות, דרג אמינות חבר זה
   16:09   02.10.09   
אל הפורום  
  4. תראה.  
בתגובה להודעה מספר 0
 
ערכתי לאחרונה בתאריך 02.10.09 בשעה 22:18 בברכה, Deuce
 
כשאתה מכריז על פויינטר, זה לא שכבר יש לך מערך אינסופי כזה או רשימה שאתה יכול לעשות מה שבא לך.

#include<stdio.h>

int main(void)
{
clrscr();
int a,b,c;
int f[10];
f[1] = 10;
printf("%d",f[1]);

return 0;
}


יש לך 2 אפשרויות בנוגע למערכים: או להכריז עליו כמערך כמו שאני עשיתי או להכריז עליו כפויינטר ולבצע הקצאה דינמית עם malloc,calloc וכו'.
בלי שום קשר, רואים שלא הבנת כל כך את נושא המצביעים אז תלמד.






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   19:24   02.10.09   
אל הפורום  
  7. :} נראה לי ערבבת קצת Java חח  
בתגובה להודעה מספר 4
 
int[] f (אי אפשר לרשום בכותרת |?


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות, דרג אמינות חבר זה
   22:18   02.10.09   
אל הפורום  
  9. חח איזה טעות - תיקנתי :P  
בתגובה להודעה מספר 7
 






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   19:27   02.10.09   
אל הפורום  
  8. קודם כל, בהתחלה שכחת לאתחל עם malloc  
בתגובה להודעה מספר 0
 
בשני אתה לא יכול לעשות c++ כי ה-c[] פה הוא ב-stack והוא מהווה symbol ולא משתנה.
2 טעויות


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
פלזמה 
חבר מתאריך 22.1.08
1044 הודעות, דרג אמינות חבר זה
   22:18   03.10.09   
אל הפורום  
  10. בדיקת סוגריים מרובעים  
בתגובה להודעה מספר 0
 
  


#include<stdio.h>
#include<conio.h>
void main ()
{
clrscr();
int n;
int c[5];
int *p;
p=c;
scanf("%d",&n);
p=p+n;
*p=20;


printf("%d",c[n]);


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

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

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



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