Whatsup - לינוקס, תוכנה חופשית וקוד פתוח בעברית

תיכנות בלינוקס - מערך דו - מימדי ב־C++‎

elcuco - 31/10/2018 - 22:09
נושא ההודעה: מערך דו - מימדי ב־C++‎
אני מנסה לחדד את ה־C++‎ המודרני שלי אז אני שואל כא. בגדול יש לי פונקציה שנראית ככה:

קוד:

#define SIZE_X 40
#define SIZE_Y 25

void init_matrix(char matrix[][SIZE_X]);


אבל זה לא ממש C++‎. איך אתם ממליצים לי להמיר את זה למשהו יותר מודרני. אין צורך ללכת אל תכנות מונחה עצמים.

תודה Smile
Anonymous - 31/10/2018 - 22:38
נושא ההודעה: Re: מערך דו - מימדי ב־C++‎
elcuco :
אני מנסה לחדד את ה־C++‎ המודרני שלי אז אני שואל כא. בגדול יש לי פונקציה שנראית ככה:

קוד:

#define SIZE_X 40
#define SIZE_Y 25

void init_matrix(char matrix[][SIZE_X]);


אבל זה לא ממש C++‎. איך אתם ממליצים לי להמיר את זה למשהו יותר מודרני. אין צורך ללכת אל תכנות מונחה עצמים.

תודה Smile


מהו הצורך שלך במערך? כלומר מה יהיה השימוש?
לפי זה נראה לי שהתשובה תהיה יותר קולעת. אתה צריך משהו ניתן להרחבה? (למשל עם פקודת new או ידידתנו malloc מ-C)?
borsood - 01/11/2018 - 07:03
נושא ההודעה:
איו קשר לתכנות מונחה עצמים. ++C היא הרבה מעבר לשפה מונחית עצמים.

ולשאלתך:
קוד:

constexpr size_t size_x = 40;
constexpr size_t size_y = 25;

using TwoDArray = std::array<std::array<char, size_x>, size_y> ;

void init_matrix (TwoDArray& matrix);

תשקול להחליף את הפונקציה שלך ב
קוד:

TwoDArray make_matrix();

Anonymous - 01/11/2018 - 08:39
נושא ההודעה: Re: מערך דו - מימדי ב־C++‎
elcuco :
אני מנסה לחדד את ה־C++‎ המודרני שלי אז אני שואל כא. בגדול יש לי פונקציה שנראית ככה:

קוד:

#define SIZE_X 40
#define SIZE_Y 25

void init_matrix(char matrix[][SIZE_X]);


אבל זה לא ממש C++‎. איך אתם ממליצים לי להמיר את זה למשהו יותר מודרני. אין צורך ללכת אל תכנות מונחה עצמים.

תודה Smile


למה הגעת לדבר הזה מלתכילה ?
אתה צריך תאימות לקימפול ב C ? זה מגיע מסיפרייה בשפה אחרת ? JNI ?


אתה לא יכול להשתמש ב std::array אם יש שימוש ב JNI או הגעה מC למשל אבל אתה כן יכול להשתמש אם זה פשוט callback (ואז בפנים להשתמש ב reinterpret_cast ולהעביר VOID * למעלה).
elcuco - 02/11/2018 - 09:26
נושא ההודעה:
borsood :
איו קשר לתכנות מונחה עצמים. ++C היא הרבה מעבר לשפה מונחית עצמים.

ולשאלתך:
קוד:

constexpr size_t size_x = 40;
constexpr size_t size_y = 25;

using TwoDArray = std::array<std::array<char, size_x>, size_y> ;

void init_matrix (TwoDArray& matrix);

תשקול להחליף את הפונקציה שלך ב
קוד:

TwoDArray make_matrix();


קודם כל תודה על התשובה.

זה לא ממש עוזר לי - זאת לא מרטיצה, אלא מערך של מערכים. על שורה יכולה להיות בעלת מספר שונה של עמודות. למשל שינוי של מספר העמודות הוא לא טריויאלי.

מניח שזה המקסימום שאפשר להוציא מהשפה. תודה.
Anonymous - 02/11/2018 - 10:10
נושא ההודעה:
אם אתה לא יודע כלום למה לא std::vector < std::vector < size_t > > ?
קוד:

typedef std::vector < std::vector < size_t > > matrix_t;
void init_matrix (matrix_t && matrix);


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

שאלו אותך מדוע הגעת לטיפוס הזה מלתחילה ולא ענית
Anonymous - 02/11/2018 - 10:12
נושא ההודעה:
Anonymous :
אם אתה לא יודע כלום למה לא std::vector < std::vector < size_t > > ?
קוד:

typedef std::vector < std::vector < size_t > > matrix_t;
void init_matrix (matrix_t && matrix);


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

שאלו אותך מדוע הגעת לטיפוס הזה מלתחילה ולא ענית


סליחה טעיתי מספיק בשבילך :

std::vector < std::string > בגלל שאתה צריך טיפוס בסיס של char ולא size_t.
borsood - 04/11/2018 - 07:18
נושא ההודעה:
elcuco :

מניח שזה המקסימום שאפשר להוציא מהשפה. תודה.

ההנחה שלך שגויה. (בדוגמה שנתת SIZE_Y היה נתון כמקרו בגודל 25)
אבל כדי שנוכל לעזור לך תצטרך להפסיק להתקמצן בפרטים.
איך נקבל אורך כל שורה? בזמן ריצה? בתה הוא תלוי?
elcuco - 05/11/2018 - 10:11
נושא ההודעה:
סליחה על התגובה המאוחרת...

בגדול, אלו שיעורי בית שנתנו לי (באמצע ראיונות עבודה). נשאלתי שאלה אודות מטריצות, והחלטתי לממש ב-C++ . בסוף מימשתי ב-C. לא מרוצה מהפתרון שלי... ואני מרגיש צורך לשפר.

נניח שהגודל של המריצה הוא ניתן לשינוי בזמן ריצה.
נניח שהאתול הוא דנאמי (תוכן המטריצה נקרא מתוך קובץ, או מחושב).
Anonymous - 05/11/2018 - 14:56
נושא ההודעה:
elcuco :
סליחה על התגובה המאוחרת...

בגדול, אלו שיעורי בית שנתנו לי (באמצע ראיונות עבודה). נשאלתי שאלה אודות מטריצות, והחלטתי לממש ב-C++ . בסוף מימשתי ב-C. לא מרוצה מהפתרון שלי... ואני מרגיש צורך לשפר.

נניח שהגודל של המריצה הוא ניתן לשינוי בזמן ריצה.
נניח שהאתול הוא דנאמי (תוכן המטריצה נקרא מתוך קובץ, או מחושב).


מטריצה מוגדרת רק כ N על M לא חלקית. אתה יכול להשתמש ב vector של סטרינגים בשביל לחסוך הקצאת זיכרון של שורות (reserve). אתה יכול אפילו להשתמש ב std::array שמקבל ערך בזמן ריצה בשביל לעשות מופע (ע"י שימוש בהורשה).
borsood - 06/11/2018 - 07:28
נושא ההודעה:
כללית: נניח שקוראים את מספר השורות ואחר כך את מספר האברים בכל שורה מ cin:
קוד:

using Row = std::vector<char> ;
using TwoDArray = std::vector<Row> ;

TwoDArray matrix init_matrix ()
  size_t columns;
  std::cin >> columns;
  TwoDArray ret;
  for (auto i = 0u; i < columns; ++i) {
    size_t rowSize;
    rowSize << std::cin;
    Row row(rowSize);
    // איתחול השורה בערכים אם צריך
    ret.emplace_back(row);
  }
  return ret;
}


כל הזמנים הם GMT + 2 שעות