עזרה בהבנת נקודה מסויימת בקוד בשפת c

ronib25

New member
עזרה בהבנת נקודה מסויימת בקוד בשפת c

היי. יש 2 נקודות שאני לא מבין בקוד המצורף, ואשמח אם מישהו יוכל להסביר לי אותן.
1. אני לא מבין את העניין בmain של ה P*.
m[0] m[1] m[2] m[3]z מה הרעיון של זה ? למה m[0 מצביע על 6 ? אשמח להבין את הרעיון של m ]0] ואולי אבין את שאר הm -ים...
2. בפונ׳ השלישית יש את הערך הטרינארי הזה : *p -= (--k? *(p+1) : a); z
עכשיו לפי מה שאני יודע, אם החלק השמאלי נכון אז מוחזר מה שמימין לסימן שאלה, ואם לא נכון אז החלק שמימין לנקודותיים. אבל מה בדיוק נכון או לא נכון ב k-- ? (האם זה במידה ו k-- שונה מ 0 ?)
תודה למסבירים...:)
קוד:
#include <stdio.h>
#include <string.h>

void func1(char *s);

int func2(int **p, int n, int m);
void func3 (int *p, int k);
int main()
{
   int m[4][4] = {{1,2,3,4},{5,6,7,8},{10,20,30,40},{50,60,70,80}};
   int *p[] = {m[0], m[1], m[2], m[3]};
   int arr[] = {6, 2, 7, 3, 10, 2};

	func1("SABABA");
	printf("%d\n", func2 (p,4,0));
	func3 (arr,6);
	
    return 0;
}
void func1(char *s)
{
    int a,b,c;
	if(!s || !*s)
	{
	    printf("\n");
	    return;
	}
	b=strlen(s);
	while(b>2)
	{
       	    a=0;
	    if(s[a]==s[b-1])
 	    {
	        for(c=b-1; c>=a && s[a]==s[c]; a++,c--) ;
		if(c<a)
		{
		   int i;
		   for(i=0; i<b; i++)
			printf("%c",s[i]);
		   printf(" ");
		}
	     }
		b--;
	}
	func1(s+1);
}
int func2 (int **p, int n, int m)
{
	if(m<n)
		return *(p[m]+m) + func2 (p, n,m+1);
	return 0;
}
void func3 (int *p, int k)
{
    int a = *p;
    while(k)
	{
    	*p -= (--k? *(p+1) : a);
             printf("%d ",*p);
            p++;
            }
     printf("\n");
}
 

BravoMan

Active member
למה החלטת ש-[0]m מצביע על 6?

האם אתה מבין מה הוא למעשה m?
ממה הוא מורכב?

2. אין ערך טרינרי, יש רק אופרטור טרינרי. פשוט דרך אחרת לכתוב if.
בשפת C אין true ו-false, ולכן בכל תנאי 0 הנו שקר, וכל דבר שאינו 0 הוא אמת.

* למהדרין שבנינו, נוסף טיפוס בוליאני ו-true ו-false לסטנדרט 99 של שפת C.
 

ronib25

New member
מה שאני חושב...

אני חושב ש m זה המטריצה ,(מורכבת משורות ועמודות). עכשיו מה שאני חושב זה שלמשל m[0] זה 1
m[1] זה 5 , m[2] זה 10 ו m[3] זה 80... האם אני צודק ?

לגבי 2. כשיש לי באופרטור הטרינארי מספר בלבד, אז כל עוד הוא שונה מ 0 יש להתייחס כמו ביטוי בוליאני ?
 

BravoMan

Active member
נתחיל מהסוף:

האופרטור הטרינרי הוא כמו משפט if else.

החלק הראשון, לפני סימן שאלה, הוא כמו תנאי בסוגריים של if.

החלק השני, בין סימן שאלה לנקודתיים, הוא החלק שיתבצע אם התנאי בסוגריים של if הוא "אמת", כלומר, הערך המתמטי שלו שונה מ-0.

והחלק האחרון, אחרי הנקודתיים, הוא סעיף ה-else, שיתבצע אם התנאי לא מתקיים, כלומר הביטוי בסוגריים שווה 0.

אפשר היה לכתוב את זה כך:
קוד:
if (--k) {
  p -= *(p + 1);
} else {
  p -= a;
}
זה לא משנה אם מה שנמצא בסוגריים של if הוא מספר בודד או משוואה, או תנאי בוליאני, או חישוב.

מה שמשנה זה התוצאה הסופית של מה שבסוגריים, או המקבילה של הסוגריים באופרטור הטרינרי.

לגבי אחד, אתה צודק ש-m הוא מטריצה שמורכבת משורות ועמודות, אבל אתה טועה כשאתה מניח ששורה ותא זה אותו הדבר .
 

ronib25

New member
האם הבנתי?

ה m0 m1 m2m3 זה בעצם סידור כמו של מערך אחד ארוך ואז m0 זה בעצם מה שבמקום 0, שזה 1. ו m2 זה 2. m3 זה 3 ו m4 זה 4 ?
מצד שני יש גם רישום כזה למטריצה : m[0]+0 שזה אומר שורה 0 ועמודה 0, האם ניתן לרשום m[0]+0 גם כך m[0] ?
 

BravoMan

Active member
אז זהו, שלא:

m[0] הוא מצביע לתא הראשון בשורה הראשונה, הוא מכיל את כתובת התא ולא את הערך שבתא.
&nbsp
כדי להגיע לערך תצטרך לבצע dereference (כוכבית) או לעשות cast ל-m.
&nbsp
אותו כנ"ל ל-m[1] הוא מכיל מצביע לתחילת השורה השנייה.
 

ronib25

New member
כן, אני מבין שזה מכיל את הכתובת כי לפני ה m יש p*=..

סתם שאלה להבין את זה באופן מושלם, אם הייתי רוצה את הכתובות של העמודה השנייה.
כלומר 2,6,20,60 איך הייתי צריך לרשום את זה ?
רק ע״י m ו 2 סוגריים שמציינים את מיקום השורה והעמודה, או שיש גם איזה אפשרות לסוגיים בודדים כמו שהסברת לי...?
 

BravoMan

Active member
לעמודה אין כתובת.

2, 6, 20, ו-60 לא מאוחסנים ברצף.
&nbsp
שורה היא רצף, והכתובת היא כתובת ההתחלה שלה.
אבל איזו כתובת יכולה להיות לאוסף תאים שאינם רצופים?
&nbsp
אתה יכול לתמיד לקבל כתובת של תא ספציפי, למשל [1][0]m& ייתן לך את הכתובת בה יושב 2.
 
למעלה