Stack Overflow ???



  • Hallo ich habe folgenden Code :

    public TTT_KI_Node(TTT_KI_Node parent, TTT_PlayingField field, Point nextPoint, TTT_Application.PlayerColor color, int min, int max, int depth, boolean MinMaxNode){
    
    		// set the next point
    		this.nextPoint = nextPoint;
    
    		// set the color
    		this.color = color;
    
    		// create a clone of the field
    		this.playingfield = field.clone();	
    
    		// set the new point
    		if (nextPoint != null){
    			playingfield.setFieldValue(nextPoint, color);
    		}
    
    		// set the depth
    		this.depth = depth;
    
    		// set min max node
    		this.MinMaxNode = MinMaxNode;
    
    		// set min
    		this.min = min;
    
    		// set max
    		this.max = max;
    
    		// the root node
    		if (parent == null){
    			ArrayList<Point> tempList = getFreeFields();
    
    			System.out.println(tempList.size());
    
    			for (int i = 0; i < tempList.size(); i++){
    				TTT_KI_Node tempNode = null;
    
    				System.out.println("Erzeuge Kind für : " + nextPoint + " " + tempList.get(i) + " " + depth);
    
    				if (color == TTT_Application.PlayerColor.Player1){
    					tempNode = new TTT_KI_Node(this, playingfield, tempList.get(i), TTT_Application.PlayerColor.Player2, min, max, depth + 1, !(MinMaxNode));
    				}else{
    					tempNode = new TTT_KI_Node(this, playingfield, tempList.get(i), TTT_Application.PlayerColor.Player1, min, max, depth + 1, !(MinMaxNode));
    				}
    
    				// MAX Player
    				if (MinMaxNode == true){
    					max = Math.max(max, getNodeWeight());					
    
    					if (max >= min){
    						break;
    					}					
    
    				}else{
    					// MIN Player
    
    					min = Math.min(min, getNodeWeight());					
    
    					if (max >= min){
    						break;
    					}						
    				}				
    			}
    		}
    

    wenn ich einen neuen TTT_Ni_Node erzeuge soll er als parent die refernez des Eletern elements verwenden. Allerdings wird immer null weiter gegeben, dass führt natürlich zu einem stacl over flow. wie muss es richtig heißen.

    Danke

    Mir ist gerade eingefallen : Wir das Objekt vielleicht erst angelegt wenn der Konstruktor komplett durchlaufen wurde ? Bei mir wird er ja durch die schleife unterbrochen



  • Soll der Code etwa Java sein?
    Du hast offensichtlich eine Endlosrekursion in deinem Konstruktor, wie es richtig aussehen muss: ohne Endlosrekursion. Mehr kann dir wahrscheinlich niemand hier sagen, der wirre Code dort durchschaut eh niemand (du offenbar selbst nicht) 😕 😕



  • Danke für deine Antwort.

    Ja der Code ist in Java geschrieben. Das mit der Enlos Rekursion habe ich mir auch schon gedacht. Aber ich weiß nicht warum. Ich erzähl mal kurz was passieren soll :

    Es wir ein Parent Knoten erzeugt (parent = null).
    Nun werden alle freien Felder ermittelt (getFreeFields).
    Es wird nun für jedes freie Feld ein neuer Knoten erzeugt.

    Da ja bereits im zweiten Knoten , der Parent knoten übergegebn wird, müsste also der Konstruktor nach max 8 Knoten aufhören, da es sich hier um TicTacToe handlet.



  • so wie das aussieht besteht deine rekursion darin immer wieder eine "neue schleife" zu erstellen die bei 0 anfängt. keine dieser schleifen wird auch nur einmal komplett durchlaufen!

    du erstellst x objekte die im konstrukter hängenbleiben weil im konstrukter der konstruktor des nächsten objekts aufgerufen wird.



  • ähm sorry, durch das parent -> this sollte das passen, eventuell mal im debugger anschauen ob er dir beim objekt erzeugen in der schleife wirklich keine "neue schleife" macht.

    dann kann das problem eigentlich nur noch an den beiden methodenaufrufen zuvor liegen (clone oder setFieldValue). alternativ passt auch was an getNodeWeight nicht


Log in to reply