Autore Topic: array android/java  (Letto 702 volte)

Offline mikuzz

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: 0
    • Mostra profilo
array android/java
« il: 30 Aprile 2014, 20:26:28 CEST »
0
come da titolo ho un problema con un metodo, con progetto java tutto funziona perfettamente, quando vado a provarlo come progetto android mi da un indexofboundsexception, provando con log.e ho notato che già nel primo for mi va in exception, android non dovrebbe funzionare come java per quanto riguarda gli indici degli array? Conunque ecco il metodo:
Codice (Java): [Seleziona]
public int clickCasella(int i,int j){
                // primo check: verifica se il click è fattibile e elimina le caselle uguali vicino al click
                Casella[][] tabellaSostitutiva=new Casella[20][20];
                for(int k=0;k<tabella.length;k++)
                        for(int z=0;z<tabella.length;z++)
                                tabellaSostitutiva[k][z]=tabella[k][z];
                int numCaselleUguali=1;
                Casella casella=new Casella(tabellaSostitutiva[i][j].getTipo());
                numCaselleUguali=numCaselleUguali+verificaClickSopra(i-1,j,tabellaSostitutiva,casella,numCaselleUguali);
                numCaselleUguali=numCaselleUguali+verificaClickSotto(i+1,j,tabellaSostitutiva,casella,numCaselleUguali);
                numCaselleUguali=numCaselleUguali+verificaClickSinistra(i,j-1,tabellaSostitutiva,casella,numCaselleUguali);
                numCaselleUguali=numCaselleUguali+verificaClickDestra(i,j+1,tabellaSostitutiva,casella,numCaselleUguali);
                if(numCaselleUguali>=3){
                        tabellaSostitutiva[i][j]=null;
                        //secondo check:abbassiamo le caselle che sono sopra e le spostiamo al posto dei null
                        for(int z=0;z<tabellaSostitutiva.length;z++)
                                for(int k=tabellaSostitutiva[0].length-1;k>0;){
                                        int ultimoIndice=k;
                                        boolean scambioFattibile=false;
                                        while(tabellaSostitutiva[k][z]==null){
                                                scambioFattibile=true;
                                                if(k>0)
                                                        k--;
                                                else break;
                                        }
                                        while(tabellaSostitutiva[k][z]!=null){
                                                if(scambioFattibile){
                                                        tabellaSostitutiva[ultimoIndice][z]=tabellaSostitutiva[k][z];
                                                        tabellaSostitutiva[k][z]=null;
                                                }
                                                ultimoIndice--;
                                                if(k>0)
                                                        k--;
                                                else break;
                                        }
                                }
                        //terzo check: cambiamo i valori null con caselle random
                        for(int z=0;z<tabellaSostitutiva.length;z++)
                                for(int k=tabellaSostitutiva[0].length-1;k>=0;k--)
                                        if(tabellaSostitutiva[k][z]==null){
                                                int random=(int) (Math.random()*100);
                                                if(random<=percentualeAttacco){
                                                        Casella attacco=new Casella("attacco");
                                                        tabellaSostitutiva[k][z]=attacco;
                                                }
                                                else if(random<=percentualeAttacco+percentualeDifesa){
                                                        Casella difesa=new Casella("difesa");
                                                        tabellaSostitutiva[k][z]=difesa;
                                                }
                                                else if(random<=percentualeAttacco+percentualeDifesa+percentualePx){
                                                        Casella px=new Casella("px");
                                                        tabellaSostitutiva[k][z]=px;
                                                }
                                        }
                        //quarto check: verifichiamo che esista almeno una combinazione in caso contrario si resetta la tabella
                        if(verificaCombinazioni(tabellaSostitutiva))
                                tabella=tabellaSostitutiva;
                        else riempiTabella();
                }
                return numCaselleUguali;
        }
ed ecco il logcat
04-30 14:25:18.300: D/AndroidRuntime(885): Shutting down VM
04-30 14:25:18.380: W/dalvikvm(885): threadid=1: thread exiting with uncaught exception (group=0xb1ae3ba8)
04-30 14:25:18.480: E/AndroidRuntime(885): FATAL EXCEPTION: main
04-30 14:25:18.480: E/AndroidRuntime(885): Process: com.snowindustry.evolution, PID: 885
04-30 14:25:18.480: E/AndroidRuntime(885): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.snowindustry.evolution/com.snowindustry.evolution.Combattimento}: java.lang.ArrayIndexOutOfBoundsException: length=20; index=20
04-30 14:25:18.480: E/AndroidRuntime(885):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
04-30 14:25:18.480: E/AndroidRuntime(885):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
04-30 14:25:18.480: E/AndroidRuntime(885):    at android.app.ActivityThread.access$800(ActivityThread.java:135)
04-30 14:25:18.480: E/AndroidRuntime(885):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
04-30 14:25:18.480: E/AndroidRuntime(885):    at android.os.Handler.dispatchMessage(Handler.java:102)
04-30 14:25:18.480: E/AndroidRuntime(885):    at android.os.Looper.loop(Looper.java:136)
04-30 14:25:18.480: E/AndroidRuntime(885):    at android.app.ActivityThread.main(ActivityThread.java:5017)
04-30 14:25:18.480: E/AndroidRuntime(885):    at java.lang.reflect.Method.invokeNative(Native Method)
04-30 14:25:18.480: E/AndroidRuntime(885):    at java.lang.reflect.Method.invoke(Method.java:515)
04-30 14:25:18.480: E/AndroidRuntime(885):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
04-30 14:25:18.480: E/AndroidRuntime(885):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
04-30 14:25:18.480: E/AndroidRuntime(885):    at dalvik.system.NativeStart.main(Native Method)
04-30 14:25:18.480: E/AndroidRuntime(885): Caused by: java.lang.ArrayIndexOutOfBoundsException: length=20; index=20
04-30 14:25:18.480: E/AndroidRuntime(885):    at com.snowindustry.evolution.Tabella.verificaClickSotto(Tabella.java:204)
04-30 14:25:18.480: E/AndroidRuntime(885):    at com.snowindustry.evolution.Tabella.verificaClickSotto(Tabella.java:205)
04-30 14:25:18.480: E/AndroidRuntime(885):    at com.snowindustry.evolution.Tabella.verificaClickSotto(Tabella.java:205)
04-30 14:25:18.480: E/AndroidRuntime(885):    at com.snowindustry.evolution.Tabella.verificaClickSotto(Tabella.java:205)
04-30 14:25:18.480: E/AndroidRuntime(885):    at com.snowindustry.evolution.Tabella.verificaClickSotto(Tabella.java:205)
04-30 14:25:18.480: E/AndroidRuntime(885):    at com.snowindustry.evolution.Tabella.verificaClickSotto(Tabella.java:205)
04-30 14:25:18.480: E/AndroidRuntime(885):    at com.snowindustry.evolution.Tabella.verificaClickSotto(Tabella.java:205)
04-30 14:25:18.480: E/AndroidRuntime(885):    at com.snowindustry.evolution.Tabella.verificaClickSotto(Tabella.java:205)
04-30 14:25:18.480: E/AndroidRuntime(885):    at com.snowindustry.evolution.Tabella.verificaClickSotto(Tabella.java:205)
04-30 14:25:18.480: E/AndroidRuntime(885):    at com.snowindustry.evolution.Tabella.verificaClickSotto(Tabella.java:205)
04-30 14:25:18.480: E/AndroidRuntime(885):    at com.snowindustry.evolution.Tabella.verificaClickSotto(Tabella.java:205)
04-30 14:25:18.480: E/AndroidRuntime(885):    at com.snowindustry.evolution.Tabella.verificaClickSotto(Tabella.java:205)
04-30 14:25:18.480: E/AndroidRuntime(885):    at com.snowindustry.evolution.Tabella.verificaClickSotto(Tabella.java:205)
04-30 14:25:18.480: E/AndroidRuntime(885):    at com.snowindustry.evolution.Tabella.verificaClickSotto(Tabella.java:205)
04-30 14:25:18.480: E/AndroidRuntime(885):    at com.snowindustry.evolution.Tabella.verificaClickSotto(Tabella.java:205)
04-30 14:25:18.480: E/AndroidRuntime(885):    at com.snowindustry.evolution.Tabella.verificaClickSotto(Tabella.java:205)
04-30 14:25:18.480: E/AndroidRuntime(885):    at com.snowindustry.evolution.Tabella.verificaClickSotto(Tabella.java:205)
04-30 14:25:18.480: E/AndroidRuntime(885):    at com.snowindustry.evolution.Tabella.verificaClickSotto(Tabella.java:205)
04-30 14:25:18.480: E/AndroidRuntime(885):    at com.snowindustry.evolution.Tabella.verificaClickSinistra(Tabella.java:231)
04-30 14:25:18.480: E/AndroidRuntime(885):    at com.snowindustry.evolution.Tabella.verificaClickSinistra(Tabella.java:229)
04-30 14:25:18.480: E/AndroidRuntime(885):    at com.snowindustry.evolution.Tabella.verificaClickSopra(Tabella.java:165)
04-30 14:25:18.480: E/AndroidRuntime(885):    at com.snowindustry.evolution.Tabella.clickCasella(Tabella.java:99)
04-30 14:25:18.480: E/AndroidRuntime(885):    at com.snowindustry.evolution.Combattimento.onCreate(Combattimento.java:12)
04-30 14:25:18.480: E/AndroidRuntime(885):    at android.app.Activity.performCreate(Activity.java:5231)
04-30 14:25:18.480: E/AndroidRuntime(885):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
04-30 14:25:18.480: E/AndroidRuntime(885):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
04-30 14:25:18.480: E/AndroidRuntime(885):    ... 11 more

grazie per l'aiuto

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:array android/java
« Risposta #1 il: 30 Aprile 2014, 21:04:19 CEST »
0
Apparentemente l'unica spiegazione è che tabella sia più grande di tabellaSostitutiva. Prova a fare un Log.d() di tabella.length
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline mikuzz

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: 0
    • Mostra profilo
Re:array android/java
« Risposta #2 il: 30 Aprile 2014, 21:13:29 CEST »
0
entrambe hanno length 20... non riesco a capire perchè java non mi dia errore e android si...

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:array android/java
« Risposta #3 il: 01 Maggio 2014, 08:51:18 CEST »
0
entrambe hanno length 20... non riesco a capire perchè java non mi dia errore e android si...

Ti sta dicendo che l'array è lungo 20 e stai usando un indice uguale a 20 (cioè il ventunesimo).

Citazione
04-30 14:25:18.480: E/AndroidRuntime(885): Caused by: java.lang.ArrayIndexOutOfBoundsException: length=20; index=20

Quando hai esaurito le idee, devi iniziare a verificare l'ovvio, è l'unico modo di trovare la causa. Comincia col mettere dentro al ciclo un Log.d("TAG","k:"+k+"   z:"+z+"   tabella.length:"+tabella.length); e vedi cosa esce nel LogCat quando vai a riprodurre l'errore.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline mikuzz

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: 0
    • Mostra profilo
Re:array android/java
« Risposta #4 il: 01 Maggio 2014, 09:55:23 CEST »
0
come non detto ora mi esce dal ciclo for o.o ma non ho cambiato nulla.... grazie per l'aiuto comunque...
« Ultima modifica: 01 Maggio 2014, 10:02:22 CEST da mikuzz »

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:array android/java
« Risposta #5 il: 01 Maggio 2014, 10:08:31 CEST »
+1
Dal LogCat si vede che l'outofbound potrebbe essere legato alle funzioni verificaClickXxxxx, perchè non posti tutto Tabella.java?


NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline mikuzz

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: 0
    • Mostra profilo
Re:array android/java
« Risposta #6 il: 01 Maggio 2014, 10:26:30 CEST »
0
Codice (Java): [Seleziona]
/**
 * tabella per il combattimento, 20x20,
 * @author Michele
 *
 */

public class Tabella {
        private int percentualeAttacco, percentualeDifesa, percentualePx;
        private Casella[][] tabella=new Casella[20][20];
        public Tabella(int percentualeAttacco, int percentualeDifesa, int percentualePx){
                if(percentualeAttacco>100 || percentualeAttacco<0)
                        throw new IllegalStateException("valore percentuale attacco non conforme");
                if(percentualeDifesa>100 || percentualeDifesa<0)
                        throw new IllegalStateException("valore percentuale difesa non conforme");
                if(percentualePx>100 || percentualePx<0)
                        throw new IllegalStateException("valore percentuale px non conforme");
                if(percentualeAttacco+percentualeDifesa+percentualePx>100)
                        throw new IllegalStateException("valore percentuale totale non conforme");
               
                this.percentualeAttacco=percentualeAttacco;
                this.percentualeDifesa=percentualeDifesa;
                this.percentualePx=percentualePx;
                riempiTabella();
        }
        /*
         * ritorna la tabella
         */

        public Casella[][] getTabella(){
                return tabella;
        }
        /*
         * riempe inizialmente la tabella
         */

        private void riempiTabella() {
                Casella[][] tabellaSostitutiva=new Casella[20][20];
                for(int i=0;i<tabella.length;i++)
                        for(int j=0;j<tabella[0].length;j++){
                                int random=(int) (Math.random()*100);
                                if(random<=percentualeAttacco){
                                        Casella attacco=new Casella("attacco");
                                        tabellaSostitutiva[i][j]=attacco;
                                }
                                else if(random<=percentualeAttacco+percentualeDifesa){
                                        Casella difesa=new Casella("difesa");
                                        tabellaSostitutiva[i][j]=difesa;
                                }
                                else if(random<=percentualeAttacco+percentualeDifesa+percentualePx){
                                        Casella px=new Casella("px");
                                        tabellaSostitutiva[i][j]=px;
                                }
                                       
                        }
                if(verificaCombinazioni(tabellaSostitutiva))
                        tabella=tabellaSostitutiva;
                else riempiTabella();
               
        }
        /*
         * verifica le combinazioni di una data tabella, se non sono presenti combinazioni ritorna false
         */

        private boolean verificaCombinazioni(Casella[][] tabellaSostitutiva) {
                boolean combinazioneOK=false;
                        for(int i=0; i<tabellaSostitutiva.length; i++)
                                for(int j=0; j<tabellaSostitutiva[0].length; j++){
                                        if(i+2>6 || j+2>6){
                                        }
                                        else{
                                                //3 caselle uguali in fila
                                                if(tabellaSostitutiva[i+1][j].equals(tabellaSostitutiva[i][j]))
                                                        if(tabellaSostitutiva[i+2][j].equals(tabellaSostitutiva[i][j]))
                                                                combinazioneOK=true;
                                                //3 caselle uguali in colonna
                                                if(tabellaSostitutiva[i][j+1].equals(tabellaSostitutiva[i][j]))
                                                        if(tabellaSostitutiva[i][j+2].equals(tabellaSostitutiva[i][j]))
                                                                combinazioneOK=true;
                                                //almeno 3 caselle uguali ad angolo
                                                if(tabellaSostitutiva[i+1][j].equals(tabellaSostitutiva[i][j]))
                                                        if(tabellaSostitutiva[i][j].equals(tabellaSostitutiva[i][j]))
                                                                combinazioneOK=true;
                                }
                        }
                return combinazioneOK;
        }
        /*
         * al click su una casella elimina le caselle corrispondenti e riempe di nuovo la tabella
         */

        public int clickCasella(int i,int j){
                // primo check: verifica se il click è fattibile e elimina le caselle uguali vicino al click
                Casella[][] tabellaSostitutiva=new Casella[20][20];
                for(int k=0;k<tabella.length;k++)
                        for(int z=0;z<tabella.length;z++)
                                tabellaSostitutiva[k][z]=tabella[k][z];
                int numCaselleUguali=1;
                Casella casella=new Casella(tabellaSostitutiva[i][j].getTipo());
                numCaselleUguali=numCaselleUguali+verificaClickSopra(i-1,j,tabellaSostitutiva,casella,numCaselleUguali);
                numCaselleUguali=numCaselleUguali+verificaClickSotto(i+1,j,tabellaSostitutiva,casella,numCaselleUguali);
                numCaselleUguali=numCaselleUguali+verificaClickSinistra(i,j-1,tabellaSostitutiva,casella,numCaselleUguali);
                numCaselleUguali=numCaselleUguali+verificaClickDestra(i,j+1,tabellaSostitutiva,casella,numCaselleUguali);
                if(numCaselleUguali>=3){
                        tabellaSostitutiva[i][j]=null;
                        //secondo check:abbassiamo le caselle che sono sopra e le spostiamo al posto dei null
                        for(int z=0;z<tabellaSostitutiva.length;z++)
                                for(int k=tabellaSostitutiva[0].length-1;k>0;){
                                        int ultimoIndice=k;
                                        boolean scambioFattibile=false;
                                        while(tabellaSostitutiva[k][z]==null){
                                                scambioFattibile=true;
                                                if(k>0)
                                                        k--;
                                                else break;
                                        }
                                        while(tabellaSostitutiva[k][z]!=null){
                                                if(scambioFattibile){
                                                        tabellaSostitutiva[ultimoIndice][z]=tabellaSostitutiva[k][z];
                                                        tabellaSostitutiva[k][z]=null;
                                                }
                                                ultimoIndice--;
                                                if(k>0)
                                                        k--;
                                                else break;
                                        }
                                }
                        //terzo check: cambiamo i valori null con caselle random
                        for(int z=0;z<tabellaSostitutiva.length;z++)
                                for(int k=tabellaSostitutiva[0].length-1;k>=0;k--)
                                        if(tabellaSostitutiva[k][z]==null){
                                                int random=(int) (Math.random()*100);
                                                if(random<=percentualeAttacco){
                                                        Casella attacco=new Casella("attacco");
                                                        tabellaSostitutiva[k][z]=attacco;
                                                }
                                                else if(random<=percentualeAttacco+percentualeDifesa){
                                                        Casella difesa=new Casella("difesa");
                                                        tabellaSostitutiva[k][z]=difesa;
                                                }
                                                else if(random<=percentualeAttacco+percentualeDifesa+percentualePx){
                                                        Casella px=new Casella("px");
                                                        tabellaSostitutiva[k][z]=px;
                                                }
                                        }
                        //quarto check: verifichiamo che esista almeno una combinazione in caso contrario si resetta la tabella
                        if(verificaCombinazioni(tabellaSostitutiva))
                                tabella=tabellaSostitutiva;
                        else riempiTabella();
                }
                return numCaselleUguali;
        }
        //verifica se ci sono caselle da eliminare
        private int verificaClickSopra(int i, int j, Casella[][] tabellaSostitutiva, Casella casella, int numCaselleUguali) {
                int conta=0;
                if(tabellaSostitutiva[i][j]==null || i<=0 || i>20 || j<=0 || j>20 || !tabellaSostitutiva[i][j].equals(casella)){
                        return conta;
                }
                else {
                        conta++;
                }
                tabellaSostitutiva[i][j]=null;
                if(tabellaSostitutiva[i-1][j]!=null && tabellaSostitutiva[i-1][j].equals(casella))
                        conta=conta+verificaClickSopra(i-1,j,tabellaSostitutiva,casella,numCaselleUguali);
                if(tabellaSostitutiva[i][j-1]!=null && tabellaSostitutiva[i][j-1].equals(casella))
                        conta=conta+verificaClickSinistra(i,j-1,tabellaSostitutiva,casella,numCaselleUguali);
                if(tabellaSostitutiva[i][j+1]!=null && tabellaSostitutiva[i][j+1].equals(casella))
                        conta=conta+verificaClickDestra(i,j+1,tabellaSostitutiva,casella,numCaselleUguali);
                return conta;
        }
        //verifica se ci sono caselle da eliminare
        private int verificaClickDestra(int i, int j,
                        Casella[][] tabellaSostitutiva, Casella casella,
                        int numCaselleUguali) {
                int conta=0;
                if(tabellaSostitutiva[i][j]==null || i<1 || i>20 || j<1 || j>20 || !tabellaSostitutiva[i][j].equals(casella)){
                        return conta;
                }
                else {
                        conta++;
                }
                tabellaSostitutiva[i][j]=null;
                if(tabellaSostitutiva[i-1][j]!=null && tabellaSostitutiva[i-1][j].equals(casella))
                        conta=conta+verificaClickSopra(i-1,j,tabellaSostitutiva,casella,numCaselleUguali);
                if(tabellaSostitutiva[i+1][j]!=null && tabellaSostitutiva[i+1][j].equals(casella))
                        conta=conta+verificaClickSotto(i+1,j,tabellaSostitutiva,casella,numCaselleUguali);
                if(tabellaSostitutiva[i][j+1]!=null && tabellaSostitutiva[i][j+1].equals(casella))
                        conta=conta+verificaClickDestra(i,j+1,tabellaSostitutiva,casella,numCaselleUguali);
               
                return conta;
               
        }
        //verifica se ci sono caselle da eliminare
        private int verificaClickSotto(int i, int j,
                        Casella[][] tabellaSostitutiva, Casella casella,
                        int numCaselleUguali) {
                int conta=0;
                if(tabellaSostitutiva[i][j]==null || i<1 || i>20 || j<1 || j>20 || !tabellaSostitutiva[i][j].equals(casella)){
                        return conta;
                }
                else {
                        conta++;
                }
                tabellaSostitutiva[i][j]=null;
                if(tabellaSostitutiva[i+1][j]!=null && tabellaSostitutiva[i+1][j].equals(casella))
                        conta=conta+verificaClickSotto(i+1,j,tabellaSostitutiva,casella,numCaselleUguali);
                if(tabellaSostitutiva[i][j-1]!=null && tabellaSostitutiva[i][j-1].equals(casella))
                        conta=conta+verificaClickSinistra(i,j-1,tabellaSostitutiva,casella,numCaselleUguali);
                if(tabellaSostitutiva[i][j+1]!=null && tabellaSostitutiva[i][j+1].equals(casella))
                        conta=conta+verificaClickDestra(i,j+1,tabellaSostitutiva,casella,numCaselleUguali);
               
                return conta;
               
        }
        //verifica se ci sono caselle da eliminare
        private int verificaClickSinistra(int i, int j,
                        Casella[][] tabellaSostitutiva, Casella casella,
                        int numCaselleUguali) {
                int conta=0;
                if(tabellaSostitutiva[i][j]==null || i<1 || i>20 || j<1 || j>20 || !tabellaSostitutiva[i][j].equals(casella)){
                        return conta;
                }
                else {
                        conta++;
                }
                tabellaSostitutiva[i][j]=null;
                if(tabellaSostitutiva[i-1][j]!=null && tabellaSostitutiva[i-1][j].equals(casella))
                        conta=conta+verificaClickSopra(i-1,j,tabellaSostitutiva,casella,numCaselleUguali);
                if( tabellaSostitutiva[i][j-1]!=null && tabellaSostitutiva[i][j-1].equals(casella))
                        conta=conta+verificaClickSinistra(i,j-1,tabellaSostitutiva,casella,numCaselleUguali);
                if(tabellaSostitutiva[i+1][j]!=null && tabellaSostitutiva[i+1][j].equals(casella))
                        conta=conta+verificaClickSotto(i+1,j,tabellaSostitutiva,casella,numCaselleUguali);
               
                return conta;
               
        }
}
all'inizio non avevo messo il log.e subito dopo il ciclo ma dopo
numCaselleUguali=numCaselleUguali+verificaClickDestra(i,j+1,tabellaSostitutiva,casella,numCaselleUguali);
quindi mi sa che hai ragione ed è nei sottometodi uhm vedendola mi sa che è quel >20 che dovrebbe essere >18 e il <=0 che dovrebbe essere <1 anche se su java funziona........

Post unito: 01 Maggio 2014, 10:51:24 CEST
Ok ora non mi da più indexofboundsexception (anche se non capisco perchè su java funzionava ???) ma uno stackoverflowerror ...  :'( l'adv non ce la fa mentre il mio pc si  :'(
« Ultima modifica: 01 Maggio 2014, 10:51:24 CEST da mikuzz, Reason: Merged DoublePost »

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:array android/java
« Risposta #7 il: 01 Maggio 2014, 18:32:02 CEST »
0
L'errore di stackoverflow avviene per esempio quando c'è una ricorsione infinita o molto lunga (lunga per i limiti dello stack della VM). Il tuo codice si presta a questo genere di errore, perchè ad esempio da verificaClickSotto() puoi richiamare nuovamente verificaClickSotto() e così via anche per le altre, facendo crescere lo stack.

Puoi provare a snellire la crescita dello stack riducendo i parametri che passi alle funzioni e semplificando le funzioni stesse, ma non ho idea di quanto possa migliorare.

Oppure, visto che il tuo codice è molto simile all'algoritmo ricorsivo del Flood Fill, puoi provare la soluzione alternativa all'implementazione ricorsiva (vedi qua Flood fill - Wikipedia, the free encyclopedia). In pratica tu hai una coda di caselle da controllare e all'inizio metti nella coda la casella di partenza. Fai quindi un ciclo che termina solo quando la coda è vuota, nel ciclo estrai una casella dalla coda, controlla le adiacenti, se soddisfano la condizioni di uguaglianza, le metti nella coda e procedi al ciclo dopo, dove estrarrai la successiva. Sono sicuro che è anche di gran lunga più performante della versione ricorsiva.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store