ABA


"מחפש הסבר על STRUCT בשפת C"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #5174 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 5174
Shlomi TC

   13:18   22.02.03   
אל הפורום  
  מחפש הסבר על STRUCT בשפת C  
 
   אני אמור לבנות כתרגיל להגשה משחק צוללות המשתמש בפונקציות, משתנים מסוגים שונים, לולאות ו STRUCT (כדי להגדיר גודל של צוללת).

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

תודה רבה.


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

  האשכול     מחבר     תאריך כתיבה     מספר  
  אז ככה: Dudenland 22.02.03 15:37 1
     תודה אבל לא כל כך הבנתי Shlomi TC 22.02.03 15:40 2
         טוב, אני רואה שאתה שואל לגבי הסיביות, אז ככה: Dudenland 22.02.03 18:23 3

       
Dudenland

   15:37   22.02.03   
אל הפורום  
  1. אז ככה:  
בתגובה להודעה מספר 0
 
   Struct הוא כשמו - מבנה.

מה זאת אומרת מבנה ?
זאת אומרת שזה טיפוס חדש (Type, כמו שיש לך מחרוזות, ממשיים, שלמים וכו').

מה מיוחד בטיפוס הזה ?
זה טיפוס שמכיל בתוכו טיפוסים אחרים.

אם מבנה הזיכרון של משתנה מסוג char יתפוס בית אחד (byte), אז מבנה זיכרון של מבנה (struct) שמכיל בתוכו שני charים, יתפוס כ-2 בתים.

למה זה צריך את זה ?
אם למשל, אתה רוצה משתנה שיכיל ווקטור דו-מימדי, אז אתה צריך גם את ערך ה-X, וגם את ערך ה-Y. בדרך הרגילה, היית צריך להשתמש או במערך, או בשני משתנים. אבל זה גם לא נוח, וגם, כשאתה רוצה למשל לעשות מערך של המשתנה הזה (ווקטור), אז תיווצר לך בעייה, ושוב פעם, זה לא נוח.

דוגמה למימוש ב-C:


typedef struct
{
float X;
float Y;
} vector;

int main()
{
vector vec1, vec2;

vec1.X = 0.75;
vec1.Y = 0.86;
vec2 = vec1;

return 0;
}

דוגמה נוספת, ללא הגדרת הטיפוס:


int main()
{
struct vector
{
float X;
float Y;
} vec1, vec2;

vec1.X = 0.5
vec2.X = vec1.Y = (vec1.X * 0.86);

return 0;
}

Dudenland


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

   15:40   22.02.03   
אל הפורום  
  2. תודה אבל לא כל כך הבנתי  
בתגובה להודעה מספר 1
 
   נגיד לדוגמה יש לי משתנה כלשהו ואני רוצה ליצור מבנה של 8 ביטים, אני יכול כאילו "למזג אותם" כמבנה ובכל פעם שאני מכניס משהו למבנה הזה הוא ייכנס לאחד מן התאים?

תנסה להסביר לי בדרך של ה"צוללות".


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

   18:23   22.02.03   
אל הפורום  
  3. טוב, אני רואה שאתה שואל לגבי הסיביות, אז ככה:  
בתגובה להודעה מספר 2
 
   עבר עריכה לאחרונה בתאריך 22.02.03 בשעה 18:42
 
כדי לייצג סיבית, אתה יכול לענקוט במספר דרכים:

1. לקבוע תחום ערכים, שבתוכו תת-תחום (TRUE, FALSE) בשם bit


typedef enum bit {FALSE = 0, TRUE = 1}

2. להשתמש בתכונות הזזה של סיביות אוטומטית:


typedef struct
{
volatile unsigned int value:1;
} bit;

int main()
{
bit sivit1, sivit2;

sivit1.value = 3 // אוטומטית יהיה שווה ל-1

return 0;
}

3. בגלל שאתה מדבר על 8 סיביות, זה בדיוק מתאים לבית אחד, שזה char, ולכן, אתה יכול להשתמש בפונקציות להכנסת/הוצאת סיביות ל"מבנה של 8 סיביות" שזה char:


#include <stdio.h>

unsigned char byte(int a, int b, int c, int d, int e, int f, int g, int h)
{
unsigned char result;

result = (a * 1) + (b * 2) + (c * 4) + (d * 8) + (e * 16) + (f * 32) + (g * 64) + (h * 128);

return result;
}

void print(unsigned char zolelet)
{
int i;

for(i = 0; i < 8; i++)
{
printf("%d", (zolelet % 2));
zolelet = (int)(zolelet / 2);
}
}

int main()
{
unsigned char mivne;

mivne = byte(1, 0, 1, 0, 1, 0, 1, 0);
print(mivne);

return 0;
}

Dudenland


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

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

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



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