שאלה בפסקל

matliv

New member
שאלה בפסקל

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

Zack DA

New member
איזו שאלה !!

כיצד אנו אמורים לנתח את הבעיה בלי קוד מצורף של התוכנית?
 

matliv

New member
זה די ארוך...

ואי-אפשר(או לפחות אני לא יודע איך) להעתיק מפסקל החוצה בעזרת העתק והדבק.
 

matliv

New member
הרעיון הוא

שאם אני לוחץ על למעלה(על 8) אז y:=y-8 ואם על למטה אז y:=y+8 ואותו רעיון בציר ה-x ואם אני לוחץ על מקש אחר אז זה עובר לסוף. כל העסק בנוי על משפט if. לא השתמשתי בפרוצדורות, שמתי goto בסוף כל שינוי בערכי הצירים לתחילת משפט ה-if.
 

Ck3

New member
אולי אתה חורג מגבולות המשתנה?

זה מה שנקרא overflow. אני מניח שאתה משתמש ב integer, שהתחומים שלו הם 32767 עד -32768 אם אני לא טועה.. בקיצור, אם לדוגמא יש לך ערך 32760 ואתה תוסיף לו עוד 8, אז הערך ישתנה ל -32768 אם אני לא טועה.. אבל אלה מספרים ענקיים ואני לא חושב שזאת הבעיה אצלך במחשבה שניה.. אולי לא בדקת טוב מצב שה X או Y גדולים/קטנים מגבולות המסך? תנסה לעשות טבלת מעקב בראש של המשתנים (או בעזרת סביבת העבודה אם אתה יודע איך), ולראות מתי זה קורה.. ועוד משהו, שימוש ב goto בשפות פרוצדורליות כמו פסקל וסי הוא תכנות לא נכון (נקרא לפעמים קוד ספגטי, בגלל הבלגן של לעבור מקצה לקצה של הקוד), עדיף לך לא להתרגל להסתמך על השיטות האלה.. שימוש בפרצודורות ו/או פונקציות הוא הרבה יותר יעיל ונכון, ויתרום לך לנסיון בתכנות נכון.. ד"א, בשביל להעתיק קוד אתה יכול פשוט לצרף את הקובץ (לשנות את הסיומת שלו לTXT ולצרף) או לפתוח אותו בעזרת פנקס רשימות ולהדביק משם.. (מקסימום לא נראה עברית, לא נורא).. זהו, מקווה שזה עזר..
 

matliv

New member
הנה

צירפתי את הקובץ, אולי תבינו ותוכלו לעזור
 

liranshahar

New member
אולי...

אחרי שראיתי את הקובץ שצרפת אני חושב שאתה צריך לשנות את ה קוד ל: repeat Key := readkey if key = #..... until Key=#27 אני חושב שמה שזורק אותך מהתוכנה זה ה GOTO... (אולי STACK?)
 

matliv

New member
לאחר שיפוץ לפי ההצעה

המצב לא השתנה. התכנית עובדת היטב אבל אחרי (בערך, להערכתי) משהו כמו 50 הזזות היא יוצאת. מה שכן, השימוש ב-repeat מסדר את התכנית, ומפשט אותה, אבל לא פותר את הבעיה...
 

Ck3

New member
אולי...

תנסה להוציא את השורה
initgraph(a,b,´´);​
מהפרצדורה, זאת שורה שצריכה להתבצע בתחילת התכנית בלבד.. אל תשכח להוסיף בסוף התכנית
closegraph;​
אם אני זוכר נכון ככה כותבים את זה, זה בשביל לחזור למצב טקסט. אם הוצאת שורת אתחול הגרפיקה מהפרוצדורה לא עוזרת, אז אחרי ה readln תדפיס את הערך של n (לא לשכוח להוסיף closegraph), כדי לשלול אפשרות שהמשתנה מקבל #27 בדרך נס.. (הסיכוי לזה הוא אפסי ביותר ואני דיי בטוח שזאת לא הסיבה, אבל תנסה).. בכל אופן אני חושב שלהוציא את ה initgraph יעזור, כי חוץ מזה הכל נראה לי תקין.. בהצלחה..
 

matliv

New member
נראה שבעקרון אתה צודק

כי באמת כשהוצאתי את ה-initgraph מהפרוצדורה והעברתי אותו לתחילת התוכנית, היא לא יצאה יותר, עד שלחצתי על Esc, אבל הבעיה עם זה היא שהקו הישן לא נעלם, מה שאומר שאני רואה את כל הדרך של הקו, מההתחלה עד לאיפה שהוא הגיע. זה כיוון שה-initgraph שימש לי בתור clrscr. הבעיה עם לשים clrscr בפרוצדורה (במקום ה-initgraph) היא שכל המסך נהיה לבן. התכנית עובדת ורואים את הקו, אבל הכל על רקע לבן. אולי יש דרך להשחיר את המסך חזרה, או לגרום רק לקו האחרון להופיע (לגרום לקו שלפניו להימחק)? *לגבי ה-closegraph, לא נראה שיש קשר, כיוון שיש צורך להשתמש בו רק אם רוצים שיופיע טקסט אחרי הגרפיקה, אם יש שימוש בגרפיקה בלבד, אין צורך לחזור למצב טקסט.
 

Ck3

New member
לא נגעתי בפסקל יותר משנה וחצי,

אבל אם אני זוכר נכון, clearview ינקה לך את המסך.. או משהו בסגנון.. clearviewport אולי.. אם אלה לא עובדים, תנסה להחליף צבע לשחור, לעשות clrscr, ולהחזיר ללבן ואז לצייר את הקו.. אופציה נוספת היא לצייר קו שחור על חלק הקו הלבן שאתה רוצה להעלים.. ובקשר ל closegraph, עקרונית אתה צודק, אבל תמיד טוב לצאת בצורה מסודרת.. גם אם אין צורך טכני, אז בשביל התכנות הנכון.. ועוד משהו שאני לא בטוח לגביו, סתם ניחוש.. אם תריץ את התכנית שלך ממצב דוס (לא מתוך הקומפיילר) בלי closegraph, אולי אחרי שהתכנית תסיים את הריצה, אתה תהיה ברזולוציה שונה בתוך שורת הפקודה של DOS.. (הכוונה מתוך דוס אמיתי, לא מצב דוס מחלונות).. אבל אני סתם מנחש, ממש לא בטוח בקשר לזה..
 
למעלה