מה פשר השגיעה הזאת?

AKAKAK

New member
מה פשר השגיעה הזאת?

java.lang.StackOverflowError Exception in thread "main"​
 

AKAKAK

New member
מה זה ריקורסיה,אני יודע וכתבתי

כמה תוכניות,כאלא קטנות ב c,אבל במסיבית,אני כבר לא מה המשמעות של המוסג ומה השגיעה אומרת.
 

AKAKAK

New member
מסיבית(תיכנותית),הכוונה את המוסג

הרגיל אני מכיר.
 

selalerer

New member
../images/Emo13.gif מסיבית זה לא תכנותית.

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

AKAKAK

New member
עקרונית היו שגיעות ותיקנתי אותם או

השהאתי אותם,כדי שאוכל לראות רק,אם התפריט,שרציתי יצא. הנה השורה:
MenuFrame f=new MenuFrame(" ");​
השורה נהיית לשגוייה בגלל,שינוי שבוצע בהכרזה עצמה. אז לפני,שתיקנתי אותה,השורה היית כך:
MenuFrame f=new MenuFrame();​
הנה הקוד המלא:
import java.awt.*; import java.io.*; import java.awt.event.*; public class MenuFrame extends Frame implements ActionListener { char [][] board= new char [3][3]; String player1= ""; String player2= ""; int i,j; MenuFrame [] [] buttons = new MenuFrame[3][3]; public MenuFrame(String str) // throws IOException { super("X/0"); MenuBar mb=new MenuBar(); Menu game=new Menu("game"); MenuItem play=new MenuItem("play"); play.addActionListener(this); game.add(play); MenuItem exit=new MenuItem("exit"); exit.addActionListener(this); game.add(exit); mb.add(game); setMenuBar(mb); setSize(200,200); for (i=0;i<3;i++) { for (j=0;j<3;j++) { buttons [j ]= new MenuFrame (" "); } } } /* public static void enteruser1(String str1 ) throws IOException { BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); System.out.print("Enter your name: "); str1=br.readLine(); this.player1=str1; } public static void enteruser2(String str2 ) throws IOException { BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); System.out.print("Enter your name: "); str2=br.readLine(); this.player2=str2; } */public void actionPerformed(ActionEvent ev) { String arg=ev.getActionCommand(); if (arg.equals("exit")) { System.exit(0); } } public String getName1(){return player1;} public String getName2(){return player2;} public static void main(String[] args) { MenuFrame f=new MenuFrame(" "); f.show(); } }

הפונקציות המוקפאות זה בגלל שיש שגיעה בשורה האחרונה של כל אחת מהן. הקוד של הפונקציות:
/* public static void enteruser1(String str1 ) throws IOException { BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); System.out.print("Enter your name: "); str1=br.readLine(); this.player1=str1; } public static void enter​
 
תשובה מלאה:../images/Emo26.gif

1) כתבת constructor שמקבל String. 2) הוא ה-constructor היחיד שיש לך ל-MenuFrame. 3) אז ניסית ליצור אובייקט עם constructor ריק. הקומפיילר צעק עלייך כי אין כזה constructor. 4) שינית את יצירת האובייקט כך שישתמש ב-constructor שמקבל String.
5) זה עזר - והקומפיילר לא צעק עלייך יותר. 6) מה שכן - אתה קורא ל-constructor מתוך ה-constructor...
נסה לעקוב ולראות מה קורה במתודה הזו... בכל פעם שאתה מגיע לשורה הזו:
MenuFrame f=new MenuFrame(" ");​
אתה קורא שוב לשוב למתודה שאתה נמצא בה...
עד שהמחסנית מתמלאת... ושוב אתה חוטף צעקות... הפעם מה-VM...
 

AKAKAK

New member
אז אם הבנתי אותך נכון../images/Emo35.gif

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

voguemaster

New member
תשתמש ב-Button!

למה אתה משתמש באובייקט שיורש מ-Frame בתור כפתור ???
 

AKAKAK

New member
אז אתה אומר לשנות את שורה הזאת:

MenuFrame [] [] buttons = new MenuFrame[3][3];​
ל
MenuBar mb=new MenuBar();​
אלא רק עם:
Button​
וכך זה אמור להראות:
Button [] [] buttons = new Button[3][3];​
אם אני לא טועה בהבנת התגובה שלך כמובן,תקן אותי אם לא הבנתי נכון.
 

ronen10001

New member
יש עוד בעיה ...

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

ronen10001

New member
ועוד משהו קטן...

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

AKAKAK

New member
כן,אצלי חסר את השורה הזאת

buttons = new Button[3];

אני פסחתי על השני.
 

AKAKAK

New member
כן,צודק ושיניתי את הפונקציה עם

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

AKAKAK

New member
ולמה שאני עושה למשתני המחרוזת

player1 ו player2 את הפעולת ה
player1.addActionListener(this);​
או
player2.addActionListener(this);​
שורה אחת,מתחת להגדרת משתנה המחרוזת. זה לא תקין,ניסיתי לעשות זאת,כדי לאוכל לעבוד עם פונקציית קליטה אחת מהמקלדת אך השורה תמיד שגוייה,בשני המשתנים,למה? תודה מראש למי שיעזור.
 

ronen10001

New member
יש לך בעיה יותר בסיסית...

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

AKAKAK

New member
אז ככה:

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

AKAKAK

New member
אז ככה:

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