להבין מחרוזות

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

בבתי הספר ואוניברסיטאות לרוב מלמדים על 2 טיפוסי משתנים של תווים. האחד נקרא char והוא מסוגל להכיל בית בודד אשר הוא בעצם מתורגם לערך הASCII שלו. עוד טיפוס הוא מחרוזת אשר נקרא ShortString, הוא מסוגל לקבל מתו בודד ועד 255 תווים (כלומר אורך של בית בודד שכל ערך הוא בית אחד).. השם של המחרוזת הוא כאמור ShortString. ב FPC, המחרוזת היא ברירת מחדל אלא אם ציינו הוראת מהדר {+H$}. יותר מאוחר אסביר מה זה מספק לנו.

באותו הזמן שפסקל הביאה את המחרוזת הקצרה (לא תמיד היו מחרוזות בשפה), אז נוסף עוד משהו:

כמו בC, גם בפסקל אני יכול להתייחס למצביע כאל מערך (באג מתחילת שנות ה80 שהפך להיות פיטצ'ר). ברגע שמתכנתים גילו את זה, הם יצרו מצביע לתו (Char)  מה שקיבלנו זהה לחלוטין לגישה של שפת C למחרוזות וזה מצביע לתו שאני מקצה לו כמות זיכרון מסויימת. אבל זה לא כל הדמיון. גם הוא סוג של Null Terminated String. למעשה ב ABI  הוא תואם לחלוטין את שפת C ! סוג המחרוזת הזו נקראת PChar (כאשר P בפסקל לרוב הוא מקדם אשר אומר שמשהו הוא מצביע -> P for pointer).

עוד סוג של מחרוזת אשר נכנסה לשפה בתחילת שנות ה90 נקראת AnsiString. זוכרים את הוראת המהדר ממקודם ? ובכן היא אומרת שברירת המחדל כאשר כותבים את המילה String הוא שנהפוך את המחרוזת ל AnsiString. בתחילת המימוש של AnsiString המחרוזת היתה מוגבלת "רק" ל64K. כיום המימושים שלו אומרים שכל עוד יש זיכרון, הוא ימשיך לקחת עוד במידת הצורך. אבל זה לא הכל. AnsiString מכיל תווים המתאימים לסביבת הריצה שלנו. כלומר אם בלינוקס הגדרנו הגדרות שפה בlocale כאלו לפרוסס הרץ:

LANG=he_IL.cp1255 ./ourprogram

אז המחרוזת תהיה בקידוד של cp1255. במידה והגדרנו UTF-8 אז זה יהיה הקידוד, ואם מגדירים UTF-32 אז כמובן שזה יהיה הקידוד עבור אותו טיפוס משתנה.

עוד 2 טיפוסים הם WideChar ו WideString  הם מאפשרים לנו לעבוד עם קידוד unicode (בד"כ מתכוונים ל UTF-16). גם WideString לא מוגבל באורך.

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

יש טיפוס נתונים בשם UTF8String, אבל הוא בעצם מימוש מיוחד של AnsiString המאפשר לנו לעבוד בקידוד של UTF-8.

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

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

9 מחשבות על “להבין מחרוזות

    1. ik_5 מאת

      ב ShortString לא, ב AnsiString זה מעט בעייתי כי הוא לא מערך אמיתי אלא מצביע (שמתחיל מתא 1).
      לגבי PChar ובכן אין לזה שימוש מן הסתם והוא מתחיל מ0 …

  1. ארתיום

    שתי שאלות:

    – האם ה"תו" ב-WideString הוא בגודל 2 בתים או בגודל שמתאים ל-wchar_t באותה סביבה?
    – מה הטיפוס של 'some string'?

    הערה, לא קיים לוקל עם קידוד utf-32 באף מערכת הפעלה

    1. ik_5 מאת

      wchar_t הוא בגודל 4 בתים, וWideChar הוא בגודל 2 בתים.
      הטיפוס של 'some string' תלוי במספר גורמים, אני לא יכול לענות לך רק מהמחרוזת עצמה, אלא מכל הקוד עצמו.

      ולגבי UTF-32 – אתה אדם מאוד קטנוני, מקודם סביבות גרפיות לא נוחות לך, עכשיו אין UTF-32. מה נסגר ?🙂

      1. ארתיום

        לא בדיוק. sizeof(wchar_t)=4 בלינוקס וברוב מערכות ההפעלה, אבל sizeof(wchar_t)=2 בחלונות. בגלל זה אני שואל, כי מהשם הייתי מצפה שזה תואם את המחרוזות wchar_t של C ושל C++‎.

        יש UTF-32, פשוט הקידוד של לוקל הוא תמיד קידוד של 8-ביט.

  2. עידו גנדל

    מישהו אשכרה התלונן על הגודל של מחרוזות בפסקל? המגבלה הזאת לא קיימת כבר כמה, 15 שנה?

    מצד שני, האינפלציה של סוגי המחרוזות וההבדלים בין דלפי ל-FPC באמת קצת מוגזמים, והרבה משימות שהיו טריוויאליות בעבר (חילוץ התו ה-n במחרוזת, למשל) מצריכות עכשיו שינון של כל מיני פונקציות לא אינטואיטיביות.

    1. ik_5 מאת

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

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

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

  3. פינגבק: כמה זה 2 מגה מתוך 4 גיגה ? | לראות שונה

כתיבת תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s