Jump to content
yhuj

IndexOutOfRangeException: Array index is out of range.

Recommended Posts

Hola otra vez, quería saber cómo podría solucionar este error:

IndexOutOfRangeException: Array index is out of range.

NewBehaviourScript.Update () (at Assets/01/Scripts/Music/NewBehaviourScript.cs:29)

El objetivo era que al llegar al valor límite del array, comenzara de nuevo en pulsar “+” o, en estar al inicio y pulsar” –“ se dirigiese al final, como un circulo .

string[] txt = new string[4] {"a", "b", "c", "d"};
	int valores = 0;

	void Update () {
		
		if(valores < 0)
		{
			valores = 3;
		}
		if(valores > 3)
		{
			valores = 0;
		}

		if(Input.GetKeyDown(KeyCode.KeypadPlus))
		{
			valores++;
		}
		if(Input.GetKeyDown(KeyCode.KeypadMinus))
		{
			valores--;
		}

		Debug.Log (txt[valores]);

	}

El juego puede ejecutarse, pero este problemita no me gusta que salga. ¿Por qué pone que salgo del array? ¿En los dos primeros ifs, acaso no he los he condicionado para que no salga del array?

Un saludo y gracia

Share this post


Link to post
Share on other sites
7 hours ago, yhuj said:

¿En los dos primeros ifs, acaso no he los he condicionado para que no salga del array?

Si, pero en los dos if's que siguen (keypad) la estas cagando. Si vas a tocar el array antes de hacerlo debes verificar que nada pase, la logica correcta parecida a la que tenes seria:

if(input 1)
	valor++;

if(input 2)
	valor--;

//podrias verificar dentro de los if y evitar que sume o reste, yo prefiero que haga lo que haga y luego acomodo
//si lo que vas a hacer es demandante claro verifica antes que es mas barato

valor = Mathf.Clamp(valor, min , max);

//en este punto esta todo bien por el clamp
de aca en adelante no deberias tener problema de outOfIndex

 

Share this post


Link to post
Share on other sites

Aja, ya veo. No conocía Clamp… pero con este método me crea un tope, es decir, que cuando llego al 3 no puedo pasar al 0 y viceversa. Y además me sigue saliendo el IndexOutOfRangeException: Array index is out of range. He seguido tu consejo, es decir, he substituido los dos primeros condicionales por el Clamp.

Ten en cuenta que como he dicho en anteriores veces, soy un iniciado en programación y la solución puede estar en frente de mis narices sin darme cuenta; así que sigo sin entender porque sigue el mismo error.

Por cierto, no te entiendo a qué te refieres con esto:

Cita

//si lo que vas a hacer es demandante claro verifica antes que es mas barato

 

Share this post


Link to post
Share on other sites

Hola @lightbug ,

el Clamp en este caso no servira para nada, bueno corrijo ... no servira para lo que se quiere conseguir; esa funcion lo unico que hace es asegurarse que un valor numerico siempre este dentro de un rango determinado (que en este caso, para que no haya problemas deberia ser 0 - 3).

Con la funcion Clamp nunca conseguiras que al estar en la posicion 0 y restarle 1 salte a la ultima posicion como si estuvieran conectados los dos extremos: siguiendo con la situacion de restar 1 a la posicion 0, el resultado seria -1 y como la funcion se encargara de establecer un valor entre 0 y 3 (siempre el mas cercano) ... el valor seguira siendo 0.

@yhuj para lo que quieres conseguir, o mejor dicho para saber porque te aparece el error, es tan simple como mirar el codigo y entender un poquito lo que hace ... Como muy bien has hecho en los dos primeros condicionales de la funcion te aseguras que nunca salga de los limites del array :10_wink: El problema es que despues de los condicionales, es cuando lees las teclas pulsadas y modificas el valor de la posicion.

Comprobar resultado -> Leer teclas y modificar valor -> Utilizar resultado (orden erroneo)

Leer teclas y modificar valor -> Comprobar resultado -> Utilizar resultado (orden correcto)

Espero que hayas entendido que cambio debes realizar en tu codigo para que funcione sin errores y que ademas consigas que salte de la primera a la ultima posicion y viceversa :10_wink:

Re-Edicion. Por si acaso no has pillado la idea, tu codigo esta correcto ... solo tienes que cambiar el orden de las lineas.

Edited by Arthure

Share this post


Link to post
Share on other sites
8 hours ago, yhuj said:

Aja, ya veo. No conocía Clamp… pero con este método me crea un tope, es decir, que cuando llego al 3 no puedo pasar al 0 y viceversa.

Solo deberia solucionar lo del indexoutofrange. Es cierto la parte del loop ni la pense me base en el titulo.

Lo del calculo "barato" no lo tomes para nada con seriedad jaja, solo una imagen de una situacion irreal que no se da casi nunca que tengo en mi cabeza.

8 hours ago, yhuj said:

He seguido tu consejo, es decir, he substituido los dos primeros condicionales por el Clamp.

fijate otra vez el pseudocodigo que te pasé. en los dos "if's inputs" vos sumas o restas si apretas algo, da el valor que se, por ej max+1 , entonces si no tuvieras el calmp estas pidiendo al arreglo una posicion que no tiene,de ahi el error. Por eso el clamp. basicamente actuas y corregis. tene en cuenta que un arreglo de 4 por ejejmplo, va asi: [0]  [1]  [2]  [3]

Pero si queres el loop olvidate el clamp y verificá si te da 4 ponelo en 0, y si te da -1 ponelo en 4.

8 hours ago, yhuj said:

Ten en cuenta que como he dicho en anteriores veces, soy un iniciado en programación y la solución puede estar en frente de mis narices sin darme cuenta; así que sigo sin entender porque sigue el mismo error.

Es sencillo, googleas el error, tenes muchisima informacion, si todavia no sabes la raiz del problema o por que un arreglo se comporta asi, volve para atras y estudia mas programacion, este error te lo da Unity como una aplicacion de consola de C.

Algo muy util que no hiciste es el imprimir la variable "valores" (en la posicion del codigo que quieras) y fijate cuanto da, esto es muy util en muchas situaciones, si ves que te da 5 y tenes un arreglo de 3 lugares hay un problema y sabes que esta fuera de rango.

Si te sigue el error anda debugueando vos hasta encontrar la logica correcta, si te ponemos el codigo no te sirve de nada.

7 hours ago, Arthure said:

el Clamp en este caso no servira para nada, bueno corrijo ... no servira para lo que se quiere conseguir;

totalmente de acuerdo.

Edited by lightbug

Share this post


Link to post
Share on other sites
Cita

Comprobar resultado -> Leer teclas y modificar valor -> Utilizar resultado (orden erroneo)

Leer teclas y modificar valor -> Comprobar resultado -> Utilizar resultado (orden correcto)

Espero que hayas entendido que cambio debes realizar en tu codigo para que funcione sin errores y que ademas consigas que salte de la primera a la ultima posicion y viceversa 

¡Excelente! Problema resuelto. Así que en este caso el orden de los factores no altera el producto pero sí a la consola...

Cita

Re-Edicion. Por si acaso no has pillado la idea, tu codigo esta correcto ... solo tienes que cambiar el orden de las lineas.

Tranquilo, sí ha quedado claro. Te has explicado muy bien. Muchas gracias por la explicación.:10_wink:

Cita

Si te sigue el error anda debugueando vos hasta encontrar la logica correcta

El problema está solucionado, pero gracias por toda esta explicación realmente es útil e interesante.:96_ok_hand:

Cita

si te ponemos el codigo no te sirve de nada.

Te doy toda la razón, de hecho lo prefiero así, que vayáis dando consejos y caminos para orientarme para así aprender de mis errores.

Cita

no has probado usar else if?

Si te digo la verdad, ni se me había pasado por la cabeza. Pese tener el problema resuelto voy a ver qué tal, gracias por la idea. :5_smiley:

 

 

Share this post


Link to post
Share on other sites

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...