News:

Printed Amstrad Addict magazine announced, check it out here!

Main Menu
avatar_Devilmarkus

Stack Overflow Problem in Java

Started by Devilmarkus, 21:15, 29 October 09

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Devilmarkus

Hallo zusammen,
ich möchte ein altes BASIC Programm in Java verwenden.

Dazu habe ich das Programm so gut, wie ich kann, in Java übersetzt, an meine Bedürfnisse angepasst, und verwende es nun.

Das Programm ansich tut auch das, was es soll: Nämlich Bereiche füllen.

Das Problem hierbei ist nun, dass es mir bei längeren Füllvorgängen einen StackOverFlow error auswirft.

Diesen Fehler konnte ich zwar erfolgreich 'catch'en, aber er ist ja immernoch vorhanden.

Was nun ist an meinem Code noch falsch?
Wer sich mit Java auskennt, bitte: Hilfeeeeeee!!! ;)
(Zum Octoate und zum Nurgle *schiel*)

    protected int[] x = new int[52];
    protected int[] y = new int[52];
    protected int z, xStep;
    protected Color hf, vfl, vfr, fr, fl;
    protected int fillX, fillY;

    public Color test(int x, int y){
        Color result = CPC.getCol(pen);
        if (x <= img.getWidth() && y <= img.getHeight() && x>=0 && y>=0)
            result = new Color(img.getRGB(x, y));
        return result;
    }
    public void Fill(int x, int y, int p){
        fillX = x;
        fillY = y;
        xStep = 1;
        if (mode == 1)
            xStep = 2;
        if (mode == 0)
            xStep = 4;
        putScreen();
        z = 0;
        hf = new Color(img.getRGB(fillX, fillY));
        System.out.println(Util.hex(hf.getRGB()));
        if (hf.getRGB() == CPC.getCol(p).getRGB())
            return;
        getCoords();
    }
    protected void getCoords(){
        if (fillX <0 || fillX >640-xStep || fillY <0 || fillY>399){
            getnewCoords();
        } else
        searchUP();
    }
   
    public void searchUP(){
        try{
        while (test(fillX, fillY).getRGB() == hf.getRGB() && fillY < 398)
            fillY+=2;           

        fillY-=2; fl = new Color (0x44,0x44,0x44); fr = fl;
        fillDown();
        }
        catch (java.lang.StackOverflowError So){System.gc();}
    }
   
    public void fillDown(){
        while (fillY>=0 && test(fillX, fillY).getRGB() == hf.getRGB() && fillX<(640-xStep)){
            // look to left
            vfl = fl; fl = test(fillX-xStep, fillY);
            if (vfl.getRGB() != hf.getRGB() && fl.getRGB() == hf.getRGB()){
                x[z] = fillX-xStep; y[z] = fillY; z++;
            }
            // look to right
            vfr = fr; fr = test(fillX+xStep, fillY);
            if (vfr.getRGB() != hf.getRGB() && fr.getRGB() == hf.getRGB()){
                x[z] = fillX+xStep; y[z] = fillY; z++;
            }
            int cpcY = fillY / 2;
            int cpcX = fillX / xStep;
            // plot point
            CPC.PLOT(cpcX, cpcY, pen, mode);
            Graphics page = getGraphics();
            img.getGraphics().setColor(CPC.getCol(pen));
            page.setColor(CPC.getCol(pen));
            img.getGraphics().fillRect(fillX, fillY, xStep, 2);
            page.fillRect(fillX, fillY, xStep, 2);
            fillY-=2;
        }
        getnewCoords();
    }

    protected void getnewCoords(){
        // get new coordinates
        z--;
        if (z>=0){
            fillX=x[z]; fillY=y[z]; getCoords();
        }
    }


Hier übrigens das Original BASIC-Listing: (Schneider CPC Basic 1.0)
10 '***********************************
20 '*********** FILL - Basic **********
30 '***********************************
40 MODE 1:DEFINT a-z:DIM x(50),y(50)
50 '*** Testfigur zeichnen
60 MOVE 100,100:DRAW 150,150,2:DRAW 100,200:DRAW 200,200:DRAW 180,180:DRAW 200,140:DRAW 200,100:DRAW 100,100
70 MOVE 120,120:TAG:PRINT"X Y Z";:TAGOFF
80 '*** Startpunkt und Farbe bestimmen
90 x=160:y=160:f=3:GOSUB 1000:END
1000 '******** FILL-Subroutine ********
1010 '*** Hintergrundfarbe ermitteln
1020 z=0:hf=TEST(x,y):IF hf=f THEN RETURN
1030 '*** Koord. auf dem Bildschirm ?
1040 IF x<0 OR x>639 OR y<0 OR y>399 THEN 1190
1050 '*** Oberen Rand suchen
1060 WHILE TEST(x,y)=hf AND y<399:y=y+2:WEND
1070 y=y-2:fl=-1:fr=-1
1080 '*** Linie nach unten zeichnen
1090 WHILE y>=0 AND TEST(x,y)=hf
1100   '*** Schaue nach links
1110   vfl=fl:fl=TEST(x-2,y)
1120   IF vfl<>hf AND fl=hf THEN x(z)=x-2:y(z)=y:z=z+1
1130   '*** Schaue nach rechts
1140   vfr=fr:fr=TEST(x+2,y)
1150   IF vfr<>hf AND fr=hf THEN x(z)=x+2:y(z)=y:z=z+1
1160   '*** Punkt setzen
1170   PLOT x,y,f:y=y-2
1180 WEND
1190 '*** Neue Koordinaten holen
1200 z=z-1
1210 IF z>=0 THEN x=x(z):y=y(z):GOTO 1040
1220 '*** Zurueck,falls keine mehr da
1230 RETURN
When you put your ear on a hot stove, you can smell how stupid you are ...

Amstrad CPC games in your webbrowser

JavaCPC Desktop Full Release

Devilmarkus

Habe es hinbekommen.
    protected int[] xx = new int[52];
    protected int[] yy = new int[52];
    protected int z, xStep;
    protected Color hf, vfl, vfr, fr, fl;
    protected int fillX, fillY;

    public void Fill(int x, int y, int p){
      for (int pf = 0; pf < 52; pf++){
          xx[pf] = 0;
          yy[pf] = 0;
      }
        fillX = x;
        fillY = y;
        xStep = 1;
        if (mode == 1)
            xStep = 2;
        if (mode == 0)
            xStep = 4;
        putScreen();
        z = 0;
        hf = new Color(img.getRGB(fillX, fillY));
        if (hf.getRGB() == CPC.getCol(p).getRGB())
            return;
        getCoords();
    }

    protected void getCoords(){
        while (fillX <0 || fillX >640-xStep || fillY <0 || fillY>399){
        z--;
        if (z>=0)
            fillX=xx[z]; fillY=yy[z];
        }
        searchUP();
    }

    public void searchUP(){
        try{
            //Graphics page = getGraphics();
            //page.setColor(CPC.getCol(pen));
        while (test(fillX, fillY).getRGB() == hf.getRGB() && fillY < 400)
            fillY+=2;
        fillY-=2; fl = new Color (0x44,0x44,0x44); fr = fl;
        while (fillY>=0 && test(fillX, fillY).getRGB() == hf.getRGB()&& fillX >=0 && fillX<=(640-xStep)){
            // look to left
            vfl = fl; fl = test(fillX-xStep, fillY);
            if (vfl.getRGB() != hf.getRGB() && fl.getRGB() == hf.getRGB()){
                if (fillX >= xStep){
                    xx[z] = fillX-xStep; yy[z] = fillY; z++;}
                else{
                    xx[z] = 0; yy[z] = fillY; z++;}
            }
            // look to right
            vfr = fr; fr = test(fillX+xStep, fillY);
            if (vfr.getRGB() != hf.getRGB() && fr.getRGB() == hf.getRGB()){
                xx[z] = fillX+xStep; yy[z] = fillY; z++;
            }
            int cpcY = fillY / 2;
            int cpcX = fillX / xStep;
            // plot point
            CPC.PLOT(cpcX, cpcY, pen, mode);
            img.getGraphics().setColor(CPC.getCol(pen));
            img.getGraphics().drawLine(fillX, fillY, fillX, fillY);
            //page.fillRect(fillX, fillY, xStep, 2);
            fillY-=2;
        }
        z--;
        if (z>=0){
            fillX=xx[z]; fillY=yy[z]; getCoords();
        }
        }
        catch (java.lang.StackOverflowError So){}
    }

    public Color test(int x, int y){
        Color result = CPC.getCol(pen);
        try{
        if (x<0)
            x = 0;
        if (y<0)
            y = 0;
        if (x>=640)
            x = 639;
        if (y>=400)
            y = 399;
            result = new Color(img.getRGB(x, y));}
        catch (java.lang.ArrayIndexOutOfBoundsException ek){
            System.err.println("Error in TEST!  X " + x + " Y " + y);}
        return result;
    }
   


When you put your ear on a hot stove, you can smell how stupid you are ...

Amstrad CPC games in your webbrowser

JavaCPC Desktop Full Release

Powered by SMFPacks Menu Editor Mod