בעיות עם ה-buffer (נראה לי)

MegaGuy

New member
בעיות עם ה-buffer (נראה לי)

כתבתי תוכנית שבחלקה קולטת תמונה מהמסך (עם הגדרת מצביע void, עשיתי לו malloc מתאים ואז getimage) לא הרבה אחרי זה, יש עוד מצביע שקולט תמונה מאותו חלק של המסך, בו השתמשתי באותן פקודות בדיוק (בעצם המצביע הראשון קולט ציור של חלון על המסך.. אח"כ התוכנה רצה.. המצביע השני קולט את התמונה הנוכחית על המסך ומהמצביע הראשון נלקחת התמונה שבתוכו כדי לפתוח את החלון.. ואח"כ התוכנה חוזרת למצבה הקודם ע"י לקיחת התמונה מהמצביע השני.. מקווה שזה מובן =\ ) בכל מקרה, במצביע הראשון זה פועל והכל טוב אך המצביע השני יוצר שגיאה שסוגר לי את הקומפיילר. בדקתי וכאשר אני עושה flush לבאפר אחרי הגדרת המצביע השני, או עושה free למצביע הראשון... ורק אז קולט את התמונה למצביע השני, זה כן פועל, אך לא כמו שצריך - כי המצביע הראשון בעצם מצביע על אותו מקום כמו המצביע השני השאלה שלי, בעצם, איך אפשר לסדר את זה? להרחיב את הבאפר.. או לנקות אותו מבלי לאבד את הערך במצביע הראשון?
 

MegaGuy

New member
אממ..

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

giladznaor

New member
הםםםםםם.....

קודם כל, בגלל שמדובר בגרפיקה, שאיננה חלק מC סטנדרטי, חשוה מאוד לומר באיזה קומפיילר אתה משתמש. ע"פ הקוד אני רואה שאתה משתמש בTurbo C ובBGI (דרך אגב, אתה לא חייב להשתמש בbgi בשביל גרפיקה, היא ספריה די איטית). כמו כן אני מניח שהשגיאה שתיארתה היא לא שגיאת קימפול אלא שגיאה ש"תוקעת" את המערכת (ואז הקוד שדחפו לך לתוך התוכנית סוגר אותה, וכותב את הערך של כל מיני אוגרים וכו' על המסך). קודם כל כבר שנים אני לא משתמש בTurbo/Borland C (למרות שמאוד אהבתי אותם), כך שאני לא יכול לקמפל את הקוד שלך. ממבט חטוף עולות לי כמה נקודות (אני לא בטוח שזה יענה לך על השאלה): 1. אתה בטוח שהשגיאה בשורה שסימנת? היא נראת לי בסדר גמור אבל השורה שאחריה נראת לי לא נכונה בוודאות. אתה לא יכול לעשות putimage עם conv_bar כי שיחררת אותו לפני כן, וזה ב99.99999% יפיל את המערכת. 2. הפונקציה, גם אם היתה פועלת, לא הייתה עושה את מה (שהבנתי) שאתה מנסה לעשות. זה צריך להיות ככה:
void open_convers(void *conv_bar) { void *last_state; // ****** NOTE: ****** erased the freeing of conv_bar last_state=malloc(imagesize(87,277,553,480)); getimage(87,277,553,480,last_state); putimage(87,277,conv_bar,COPY_PUT); setcolor(0); outtextxy(95,285,"Input text here"); outtextxy(95,285+TEXT_LINE_SPACE,"Input text here - Line 2"); getch(); // ****** NOTE ****** changed to last_state putimage(87,277,last_state,COPY_PUT); // ****** NOTE ****** free last_state free(last_state); getch(); }​
3. יהיה הרבה יותר ברור אם במקום כל מיני מספרים תכתוב באמצעות קבועים. זה אולי לוקח עוד 10 שניות לכתוב אבל זה הרבה יותר קריא, ומונע טעויות שנובעות מההעתקה (כמו בטעות להקצות פחות מידי זיכרון למערך). לדוגמא,
setfillstyle(1,15); bar(87,277,553,480); setfillstyle(1,8); bar(88,278,552,478);​
תכתוב
setfillstyle(1,15); bar(window_x1,window_y1, window_x2,window_y2); setfillstyle(1,8); bar(window_x1+1,window_y1+1, window_x2-1,window_y2-2);
4. למיטב זכרוני, להגדיר משתנים באמצע פונקציה ולא בהתחלה זה כבר ++C. מצד שני, ג "//" להערות זה ++C, אז זה לא ממש משנה. מקווה שזה יסתדר! גלעד​
 

MegaGuy

New member
אממ

בקשר למה שאמרת, על ה-free(conv_bar) זה רק משהו שניסיתי.. לא שמתי לב שזה נשאר שם, עדיין יש שגיאה גם כשזה לא נמצא. אותו דבר בקשר לזה שעשיתי putimage ל-conv_bar שוב בסוף.. רק ניסיונות ששכחתי למחוק \= בכל מקרה, הבעייה היא שהגודל של התמונה גדול מדי (כנראה) ולסי אין מקום להקצות גודל כזה לעוד משתנה.. ככה הבנתי, לפחות ובקשר לקבועים, בד"כ אני משתמש בקבועים.. פשוט הקובץ פה הוא משהו יותר ראשוני...
 

giladznaor

New member
בעיות זיכרון

עד כמה שזכור לי, TC עובד רק בreal-mode. כדי להיפטר מכל בעיות הזיכרון שנובעות ממגבל ה640K העתיקה, אני ממליץ לך לעבור לקומפיילר שעובד בprotected-mode, שם אין את המגבלות האלא. הוספתי קישור לקומפיילר כזה שבא בחינם. לגבי הבעיה הספציפית, קיימים בTC כמב מצבי קימפול (אתה יכול לשנות אותם איפשהו בתפריטים) - SMALL, MEDIUM, LARGE, HUGE, ... אני כבר לא ממש זוכר את המגבלות של כל אחד. תנסה לשנות את ההגדרות לLARGE ולנסות שוב. אני די בטוח שאתב לא צריך יותר מ64KB לכל משתנה כזה, ואם אני זוכר נכון אז רק בSMALL זה היה עושה בעיה (כי שם --כל-- הנתונים צריכים להכנס ל64KB).
 

MegaGuy

New member
אני מעדיף

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

giladznaor

New member
מצטער

הייתי שמח לעזור לך, ופעם עבדתי רק עם טורבו C, וגם כתבתי בעיקר תוכניות גרפיקה, אבל פשוט אין לי אותו היום. ניסיתי אפילו להוריד את TC לייט אבל אין שם את ספריית הגרפיקה. אם אתה מתכוון לעבוד עם גרפיקה, אז אני בכל זאת ממליץ לך להוריד את DJGPP. הוספתי קישור ישירות לאתר ההורדה. אם אתה רגיל לעבוד עם TC, אז זה דווקא קומפיילר מצויין לעבור אליו! באתר שקישרתי אליו, יש לך כל מיני אפשרויות של מה להוריד. תוודא שrhide מסומן (בררירת המחדל היא שהוא מסומן). זהו סביבת עבודה כמעט בדיוק כמו TC. פשוט במקום לכתוב TC תכתוב RHIDE וכל השאר בערך אותו הדבר. למטה תראה בחירות של TOOLKIT. יש שם כל מיני ספריות גרפיקה. אני אישית ממליץ על ALLEGRO, אבל יש שם גם ספריה בשם GRX, שניתן להשתמש בה כמו בBGI של TC (או לפחות לתרגם את אוטומטית). אם עדיין יש לך בעיות, אתה מוזמן לשאול!
 

MegaGuy

New member
טוב,

התקנתי DJGPP, הכל טוב ויפה אבל..אממ... אין לי מושג איך מפעילים את הגרפיקה. הורדתי גם את ה-allegro וגם את ה-grx ופשוט אין לי מושג מה עושים משם, ובעזרה לא בדיוק רשום משהו על גרפיקה
 

giladznaor

New member
תשובה

DJGPP: כדי להתקין אותו, צריך לעשות שני דברים אחרי שפותחים את כל הZIPים בספריה המתאימה. 1. תוסיף את ספריית BIN לPATH. לדוגמא: C:\DJGPP\BIN 2. תוסיף הגדרה לENVIORMENT: SET DJGPP=C:/DJGPP/DJGPP.ENV מוינדווז, תחת START/התחל, בחר בRUN/הפעל, תכתוב edit c:\autoexec.bat תוסיף את (1) לאיפה שכתוב PATH, ותוסיף שורה נוספת עם (2) ALLEGRO: הוספתי קישור לאתר שמסביר הכל, כולל מאיך להתקין ואיך להשתמש בזה. שים לב שלוקח כ10 דק' (תלוי במחשב) לקמפל את הספרייה. הספרריה מספקת לא רק גרפיקה, אלא גם קול, עכבר, ג'וייסטיק, משחקי רשת, תלת-מימד, חלונות, ועוד הרבה. GFX: אין לי מושג, אף פעם לא השתמשתי בזה. היתרון היחיד של הספרייה הזאת מבחינך היא שהיא יכולה לתרגם תוכניות שכתובות לBGI. חוץ מזה אני ממליץ על ALLEGRO
 

MegaGuy

New member
אוקיי

קראתי חלק והבנתי והכל פועל וכו' רק יש לי שאלה אחת (אחרונה, אני מקווה) איך אני יודע מה הגודל של תמונה? כאילו - מה הפונקציה המתאימה ל-imagesize מ-graphics.h? (בשביל להקצות למצביע שבו נשמרת התמונה מספיק זיכרון...)
 
למעלה