שלום

inflatable

New member
שלום

אני צריך קצת עזרה בשעורי הבית שלי בתכנות (C++), ואני מקווה שזה הפורום הנכון לשאול בו. השאלה שניתנה היא בניית תוכנית שתדפיס את המספרים הראשוניים בין 2 למס' שמתקבל כקלט מהמשתמש, אבל זאת לא הבעייה שלי. בניתי את התוכנית הדרושה, והיא אכן מבצעת את הדרוש, אך ממש לפני שהיא מסיימת לרוץ הוא מוציאה לי הודעת שגיאה (מהסוג שאפשר לשלוח למיקרוסופט) וכאשר אני מבטל את ההודעה התוכנית מסתיימת (היא אמורה להסתיים כי דבר זה קורה אחרי שהיא מדפיסה את הפלט שלה). זאת התוכנית: /* ..... * Full Name: Gilad Schwartz * Id No: 021628466 * Group No: 12 * Assignment No: 2, question 4 * ..... * * This program gets a number, num, and prints all of the prime numbers that are smaller or equal * to this number using "Eratosthenes' sieve" */ #include <stdio.h> #define size 1000 void main() { int is_valid[size]; int i,j,num; for (i=1;i<=size;i++) is_valid=1; printf ("Please enter the number you want to check \n"); scanf ("%d", &num); for (i=2;i<num;i++) { if (is_valid) printf ("%5d", i); if (i<(num/2)) for (j=i;j<num;j+=i) is_valid[j]=0; else is_valid=0; } printf ("\n"); }
מישהו אולי מצליח להבין מה הבעייה? תודה מראש​
 
הבעיה היא...

אחרי ששברתי את הראש מצאתי את הבעיה. הגדרת מערך בהקצאה סטטית וזה בסדר אולם מערך מתחיל מ-0 ואתה איתחלת אותו מ1 עד ל 1000 ואז האיתחול גלש מעבר להקצאת הזיכרון. אני מניח כי כשהתוכנית מסתיימת הזכרון משתחרר ואז לא היתה אפשרות לשחרר את המקום ה-1001 כיון שהוא לא מוגדר...ותקנו אותי החכמים אם אני טועה...
 

inflatable

New member
תודה, אבל זה עדיין לא עובד

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

inflatable

New member
אכן עכשיו זה עובד

פשוט לא הורדתי את סימן השווה. ושוב תודה רבה!
 

אלדד28

New member
אגב, למען הדיוק, (העשרה)

הבעיה שלך נובעת מכך שבריצה במצב דיבאג, VISUAL STUDIO מקיף את המערך במשהו שנקרא guard bytes (הערך שלהם הוא FD FD FD FD). כשהתוכנית יוצאת, היא בודקת אותם בעזרת קריאה ל-assert, שזו פונקציה (או מקרו) שבודקת אם נתון מסוים הוא תקין, ואם לא - אז היא מוציאה הודעה שדומה להודעת קריסה.
 

mikledet

New member
בלי קשר (ואולי עם?)

יש/יכולה להווצר בעיה, עם המשתמש בוחר מס מעל 1000 - או ערך של size. משום שאז בתוכנית תנסה לגשת מחוץ למסגרת של s_valid. על מנת לתקן - תוסיף ל-FOR השניה :
for(i=2;i<num && i<size;i++)​
ובבקשה - תשתמש בתגיות הקוד - קשה לקרא את הקוד ככה...
 

inflatable

New member
אין לי צורך לבדוק תקינות קלט

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

eyalbd

New member
לו אני המורה....

הייתי מתחיל ב vector ולא נוגע בכלל ב array מובנה של השפה. הייתי מחייב בהתחלה שימוש ב - ()at ולא באופרטור [], והייתי מחייב לעטוף את התוכנית ב try-catch. התוכנית שלך היתה נראית כך. עכשיו תעשה את הטעות עם ה '=' ותראה מה קורה.
#include <vector> #include <stdio.h> int main() { // prompt and get upper limit // int num; printf ("Please enter the number you want to check: "); scanf ("%d", &num); try { // initialize the array to num+1 elements with value 1 // We use index to set true or false and we // discard the 0 index therefore the num+1 in contruction. // std::vector<int> is_prime(num+1, 1); // start marking non primes according to erasthotenes // and display all primes on the way. // for (int i = 2; i < is_prime.size(); ++i) { if (is_prime.at(i)) printf ("%5d", i); if (i < (num/2) ) { for (int j = i + i; j < is_prime.size(); j += i) is_prime.at(j)= 0; } else is_prime.at(i) = 0; } printf ("\n"); } catch (std::exception& error) { printf("\n*** Fatal Error: \"%s\" Exiting!\n", error.what()); } }​
 

אלדד28

New member
אתה מתכוון, לו אתה משרד החינוך,

כי למורה אין שום יכולת לקבוע מה ילמדו התלמידים...
 

זהיר

New member
אבל מי אחראי לתכנית C שנקראת ++C

אם תשים לב לקוד במכתב המקורי, אין שם שום דבר ששייך ל ++C - אפילו לא IO. אבל הוא קרא לזה ++C. מי האחראי?
 

אלדד28

New member
בעצם עכשיו כשאני מסתכל על זה,

זה בכלל לא תלמיד בית ספר - הכותרת נראית כמו מטלה בתואר. אצלי בתואר היה קורס אחד (מבוא) ב-Better C, עוד אחד ב-Pure C ועוד אחד ב-++C. ולגבי שאלתך - המרצה, ודאי.
 

voguemaster

New member
באמת נו

לפעמים אתם מגזימים. ישר אתה מפתח תלות ב-STL ?? כאילו, תחשוב על מישהו שלומד C או BETTER C בצורה הזו ופתאום אח"כ הוא מגיע למצב שהוא צריך לכתוב קוד ואין לו STL כמו שהוא מכיר. מה הוא יעשה ? אין לו std::vector אז הוא לא ישתמש במערכים ?? זה צולע במקרה הטוב... אם אתה מלמד את השפה, תלמד את השפה, לא את הספריות שלה במקום. ואם כבר אתה מלמד את השפה, אז תלמד את השפה כולה!
 

eyalbd

New member
הוא לומד ++C ??

אז יש לו STL - אין כאן תלות. זה חלק מהשפה. אומנם ספרייה אבל זו הסטנדרטית. אפשר להניח שקיימים vector ו-string ממש כשם שקיים printf. יהיה לזה תוצא צדדי טוב - יהיו חייבים ללמד עם כלים מודרניים ולא עם BC++ 3.1 שהיה אומנם אגדי בזמנו אבל לא מתאים היום.
 

voguemaster

New member
לא על זה אני מדבר

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

Zack DA

New member
מה פתאום..... !!

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

eyalbd

New member
כן פתאום

תראה, אני לא מתכוון שילמדו generic programming לפני הדברים הפשוטים יותר. תראה הסבר בתשובה אחרת שכתבתי בשירשור הזה.
 

Zack DA

New member
ההסבר לא היה משכנע.

מתכנת צריך ללמוד להשתמש ב- char* לפני שהוא עובד עם string, למשל.
 
למעלה