ווטסאפ - לינוקס, BSD, קוד פתוח ותוכנה חופשית בעברית. Whatsup - Linux, BSD, open source and free software in Hebrew

 
 
  כניסת חברים · רישום · שכחתי סיסמה  
tux the penguin
תגובה לנושא
צפיה בנושא הבא Printable version התחבר כדי לבדוק הודעות פרטיות צפיה בנושא הקודם
elcucoלא בפורום כעת ת.הצטרפות: 14/10/2003 · הודעות: 6255 ·
 

הודעה פורסם: 31/10/2018 - 22:09
נושא ההודעה: מערך דו - מימדי ב־C++‎

אני מנסה לחדד את ה־C++‎ המודרני שלי אז אני שואל כא. בגדול יש לי פונקציה שנראית ככה:

קוד:

#define SIZE_X 40
#define SIZE_Y 25

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


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

תודה Smile
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית  
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
אורח · ·
 

הודעה פורסם: 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לא בפורום כעת ת.הצטרפות: 05/01/2007 · הודעות: 306 ·
 

הודעה פורסם: 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();
 
 צפיה בפרופיל המשתמש שלח הודעה פרטית ביקור באתר המפרסם  
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
אורח · ·
 

הודעה פורסם: 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לא בפורום כעת ת.הצטרפות: 14/10/2003 · הודעות: 6255 ·
 

הודעה פורסם: 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();


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

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

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

הודעה פורסם: 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);


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

שאלו אותך מדוע הגעת לטיפוס הזה מלתחילה ולא ענית
 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
אורח · ·
 

הודעה פורסם: 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לא בפורום כעת ת.הצטרפות: 05/01/2007 · הודעות: 306 ·
 

הודעה פורסם: 04/11/2018 - 07:18
נושא ההודעה:

elcuco :

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

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

הודעה פורסם: 05/11/2018 - 10:11
נושא ההודעה:

סליחה על התגובה המאוחרת...

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

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

הודעה פורסם: 05/11/2018 - 14:56
נושא ההודעה:

elcuco :
סליחה על התגובה המאוחרת...

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

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


מטריצה מוגדרת רק כ N על M לא חלקית. אתה יכול להשתמש ב vector של סטרינגים בשביל לחסוך הקצאת זיכרון של שורות (reserve). אתה יכול אפילו להשתמש ב std::array שמקבל ערך בזמן ריצה בשביל לעשות מופע (ע"י שימוש בהורשה).
 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
borsoodלא בפורום כעת ת.הצטרפות: 05/01/2007 · הודעות: 306 ·
 

הודעה פורסם: 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 שעות
תגובה לנושא
צפיה בנושא הבא Printable version התחבר כדי לבדוק הודעות פרטיות צפיה בנושא הקודם
PNphpBB2 © 2003-2004 

תוכן הדיון

  1. elcuco
  2. אורח
  3. borsood
  4. אורח
  5. elcuco
  6. אורח
  7. אורח
  8. borsood
  9. elcuco
  10. אורח
  11. borsood