2 שאלות במערכים C++ - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

2 שאלות במערכים C++


Zaltzman

Recommended Posts

מה הפקודה להקצאת מערך דו מימדי דינמי של מחרוזות

והאם אפשר להשתמש בהשמה נאיבית של מחרוזת נתונה לתוך תא במערך הזה בעזרת הסימן = או בעזרת strcpy

 

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

 

למשל אם נתון המערך 5,4,3,6,7

ואני רוצה למחוק את הרשומה האחרונה - 7 כך שלא תופיע יותר במערך

או את הרשומה הלפני אחרונה 6...

 

תודה לעוזרים

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

ציטוט של Zaltzman

מה הפקודה להקצאת מערך דו מימדי דינמי של מחרוזות


auto a = std::vector<std::vector<std::string>>{}

והאם אפשר להשתמש בהשמה נאיבית של מחרוזת נתונה לתוך תא במערך הזה בעזרת הסימן = או בעזרת strcpy

בעזרת = אפשר (ההשמה אינה "נאיבית" אלא מפעילה את אופרטור ההשמה של מחלקת המחרוזות).

strcpy היא פונקציה של C ולכן לא תעבוד.

 

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

 

למשל אם נתון המערך 5,4,3,6,7

ואני רוצה למחוק את הרשומה האחרונה - 7 כך שלא תופיע יותר במערך

 

או את הרשומה הלפני אחרונה 6...


a.erase(a.begin()+6)

 

 

 

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

ציטוט של Zaltzman

מה הפקודה להקצאת מערך דו מימדי דינמי של מחרוזות

- אני מניח שהכוונה שלך בדינאמי היא הקצאות על הheap בעזרת malloc, 

בC, המחרוזות מיוצגות ע"י מערכים של תווים, מחרוזת בודדת היא מטיפוס char*, את ההקצאה אתה צריך לעשות בעזרת malloc.

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

 

והאם אפשר להשתמש בהשמה נאיבית של מחרוזת נתונה לתוך תא במערך הזה בעזרת הסימן = או בעזרת strcpy

-בגלל שאתה עובד עם מצביעים, השמה לתא במערך בעצם תדרוס את הכתובת שכתובה בו, שים לב שכיוון שהקצאת בעזרת malloc, דריסה שכזו עשויה להוביל

למצב בו יש לך שהקצאת ואתה לא משחרר - אלא אם אתה מחזיק את המצביע הזה במקום אחר ומשחרר אותו.

 

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

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

 

ציטוט של Zaltzman

למשל אם נתון המערך 5,4,3,6,7

ואני רוצה למחוק את הרשומה האחרונה - 7 כך שלא תופיע יותר במערך

או את הרשומה הלפני אחרונה 6...

-שים לב שכדי לקבל את המערך הזה, היית צריך לבצע הקצאה בגודל מסוים, שיכול להיות שהוא גדול מ-5 int-ים, מה שאומר שמה שאתה כותב כמערך שמכיל כך וכך מספרים הוא לא בהכרח מה שהקצאת.

'מחיקת רשומה' מתבצעת ע"י דריסה של הערך במקום המתאים, והזזה של כל שאר הערכים שאחריה תא אחד אחורה.

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

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

 

 

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

אי אפשר למחוק תא במערך - למערך יש גודל קבוע. הדרך היחידה לשנות את הגודל של מערך היא באמצעות realloc (אם המערך הוקצה ע"י malloc) או באמצעות הקצאת מערך חדש באמצעות new, העתקת ואז מחיקת הקודם.

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

ציטוט של שניצל

אי אפשר למחוק תא במערך - למערך יש גודל קבוע. הדרך היחידה לשנות את הגודל של מערך היא באמצעות realloc (אם המערך הוקצה ע"י malloc) או באמצעות הקצאת מערך חדש באמצעות new, העתקת ואז מחיקת הקודם.

 

בוודאי התכוונת ל malloc או ל calloc שהרי new שייכת ל c++ ופה מדובר על c. ;)

 

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

ניהול הזכרון במודל הזה הוא לא פשוט.

 

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

ארכיון

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

×
  • צור חדש...