עבור לתוכן

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

Featured Replies

פורסם

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

והאם אפשר להשתמש בהשמה נאיבית של מחרוזת נתונה לתוך תא במערך הזה בעזרת הסימן = או בעזרת 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)

 

 

 

פורסם
  • מחבר
ציטוט של borsood

 

 

 

תודה רבה חבר אבל התבלבלתי והכוונה הייתה לפקודות בשפת C

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

פורסם
ציטוט של 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.

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

 

ארכיון

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

דיונים חדשים