לא מבין משהו במערך CHARים, בC - עמוד 4 - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

לא מבין משהו במערך CHARים, בC


SweeT_EviL

Recommended Posts

לא יודע, עדין משנים את המערך. עזבו..

נחזור רגע לשאלה הראשונה שלי, אם אני מקבל מערך אז כאילו יש לו הגבלה.

השאלה אם אני מקבל מערך בלי גודלו, האם אני יכול לדעת את סוף המערך..? הכוונה כאן היא לכל הסוגי המערכים כאחד.

קישור לתוכן
שתף באתרים אחרים

  • תגובות 50
  • נוצר
  • תגובה אחרונה

ב-C99 יש תוספות מסויימות ו-VLA אולי כדאי שתבדוק את זה.

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


SomeType array[] =
{
1, 3, 5, 0x555, -4,
/* ... */
4, 42
};

enum
{
NUM_VALUES_IN_ARRAY = sizeof(array) / sizeof(array[0])
};

אני רוצה להדגיש שהטריק הזה שביר, הוא קרוב ל-hack, ובאופן כללי עדיף שלא תשתמשו בו.

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

קישור לתוכן
שתף באתרים אחרים

שיניתי קצת את הפונקיה(בלי טאבים - השינוי). לא בדקתי את זה אבל אני חושב שזה יעבוד.

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

קישור לתוכן
שתף באתרים אחרים

במקרה הראשון אני הייתי משתמש ב fgets בגלל שאפשר להגביל אותה למספר התווים שהיא קוראת. משהו כזה:

include <stdio.h> 
#include <string.h>

#define LEN (2 + 2) /* One byte for the null char and one byte for the newline char ('\n') */

main()
{
char string[LEN];


fgets(string, LEN , stdin);
string[strlen(string)-1] = '\0'; /* Remove the newline char */

puts(string);



fflush (stdin);
getchar();



}

לגבי פונטרים VS מערכים, יש עוד הבדל אחד חשוב בינהם וזה הדרך שבה sizeof עובד:

int array[5];
int *ptr = array; /* Pointer to the array */

printf ("%i \n", sizeof array ); /* Will print 20 */
printf ("%i \n", sizeof ptr); /* Will print 4 (on a 32 bit machine) */

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

אני רוצה להדגיש שהטריק הזה שביר, הוא קרוב ל-hack, ובאופן כללי עדיף שלא תשתמשו בו.

הוא לא שביר כל עוד זה לא pointer למערך, אני אישית משתמש בזה די הרבה אפילו בניתי macro :

#define ARRAY_LEN(array)	( sizeof array / sizeof array[0] )

קישור לתוכן
שתף באתרים אחרים

הוא לא שביר כל עוד זה לא pointer למערך, אני אישית משתמש בזה די הרבה אפילו בניתי macro :

#define ARRAY_LEN(array)	( sizeof array / sizeof array[0] )

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

טריק שביר פירושו שהוא מקשה על תחזוקת הקוד. זה שזה עובד ואתה משתמש בו הרבה, ואפילו בנית מקרו עדיין לא עושה את זה רעיון טוב.

אולי זה נשמע לך מיותר, אבל אחת מהתכונות של קוד איכותי היא כמה הוא מקל על תחזוקה. זו בדיוק הסיבה שאפילו אם אתה יודע שזה מערך של int, אתה עדיין מחלק ב-sizeof(array[0]) ולא ב-sizeof(int).

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.


×
  • צור חדש...