C sharp - ¿Dónde está el error? Stackoverflow sin bucle infinito (¿?)

 
Vista:
sin imagen de perfil
Val: 50
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

¿Dónde está el error? Stackoverflow sin bucle infinito (¿?)

Publicado por Zausen (22 intervenciones) el 29/09/2019 02:22:19
Buenos días,

Llevo todo el día por un error que me tiene en vilo... ¿Por qué sucede?

StackOverflowException: The requested operation caused a stack overflow.
System.Collections.Generic.List`1[T].InsertRange (System.Int32 index, System.Collections.Generic.IEnumerable`1[T] collection) (at <e1a80661d61443feb3dbdaac88eeb776>:0)
System.Collections.Generic.List`1[T].AddRange (System.Collections.Generic.IEnumerable`1[T] collection) (at <e1a80661d61443feb3dbdaac88eeb776>:0)


Hay algo que estoy haciendo mal o se me está escapando...

El programa es una búsqueda de caminos pero... M''' No sé qué estoy perdiéndome ya que no sucede todas las veces... Pensé que sería un tema de iteraciones pero no lo parece... (osea, no detecto un punto de bucle infinito o llamada iterativa sin final....)

He realizado algunos test (100 lanzamientos automáticos). Si lo dejo como entiendo que es lo más «correcto»... Salta ese error... Así que he hecho una constante con int con 100 y luego he hecho un for en el que si n == al iterador o si n == al total de elementos de mi lista... sale del for... He logrado llegar a los cien lanzamientos sin errores al hacerlo pero... No le veo sentido ¿Por qué con el iterador sí y sin el iterador no?...


Un saludo y gracias de antemano.

P.D: No tengo problema en compartir código...
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

¿Dónde está el error? Stackoverflow sin bucle infinito (¿?)

Publicado por Nacho (115 intervenciones) el 29/09/2019 11:34:29
No tiene por qué ser una iteración. Windows funciona a base de eventos. Si tú procesas uno y lo que haces genera el mismo evento que procesas se produce un bucle infinito.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 50
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

¿Dónde está el error? Stackoverflow sin bucle infinito (¿?)

Publicado por Zausen (22 intervenciones) el 29/09/2019 14:39:58
Claro, eso pensé yo... Pero no tengo un bucle infinito (ni una llamada de un método a sí mismo sin controlar), aunque si hago lo siguiente:

1--> Hago el calculo más largo con un límite de 1 minuto de cálculo. (Esto lo hago asíncronamente). Si llega al minuto y no ha terminado, deja de expandirse.

2-->Ahora hago unos cálculos rápidos que duran entre 0'0300 y 0'0001 segundos, así que los hago síncronos. Es aquí donde me da el error.

Ahora estoy probando a esperar el mismo tiempo que tarda el método asincrono antes de lanzar el sincrono, a ver qué tal... Pero no tengo esperanzas.

En principio no detecto métodos que se llamen de forma infinita (Excepto las operaciones que son en burbuja pero... Tienen un fin, eso creo que lo tengo pillado. (Lo estoy revisando porsiaca, nunca se sabe cuándo te has dejado algo pillado, pero justo ese no falla así que...)...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

¿Dónde está el error? Stackoverflow sin bucle infinito (¿?)

Publicado por Nacho (115 intervenciones) el 29/09/2019 14:55:15
Sin ver el código....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 50
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

¿Dónde está el error? Stackoverflow sin bucle infinito (¿?)

Publicado por Zausen (22 intervenciones) el 29/09/2019 16:05:33
Claro, el error me da en el siguiente código lo he cambiado ahora por donde he sospechado pero lo dejo como al principio:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Posicion : IEquatable<Posicion>
{
    public int X { get; set; }
    public int Y { get; set; }
 
    public Posicion() : this(0, 0)
    {
 
    }
    public Posicion(int x, int y)
    {
        this.X = x;
        this.Y = y;
    }
    public Posicion Clonar()
    {
        return new Posicion(X, Y); //Aquí me ha saltado también el error mencionado.
    }
 
    public bool Equals(Posicion other)
    {
        return other.X == this.X && other.Y == this.Y;
    }
 
    public override bool Equals(object obj)
    {
        if (obj != null && obj is Posicion) return this.Equals((Posicion)obj);
        return false;
    }
    public override int GetHashCode()
    {
        return base.GetHashCode();
    }
 
    public override string ToString()
    {
        return "(" + X + "," + Y + ")";
    }
 
    public static bool operator ==(Posicion a, Posicion b)
    {
        return a.Equals(b);
    }
    public static bool operator !=(Posicion a, Posicion b)
    {
        return !(a == b);
    }
 
    public static Posicion operator +(Posicion a, Posicion b)
    {
        if ((object)a == null && (object)b == null) return null;
       if((object)a == null || (object)b == null) return a ?? b;
        int xn = a.X + b.X;
        int yn = a.Y + b.Y;
       return new Posicion(xn, yn);
    }
 
    public static Posicion operator -(Posicion a, Posicion b)
    {
        if ((object)a == null && (object)b == null) return null;
        if ((object)a == null || (object)b == null) return a ?? b;
        int xn = a.X - b.X;
        int yn = a.Y - b.Y;
        return new Posicion(xn, yn);
    }
 
    public static float DistanciaEntre(Posicion a, Posicion b)
    {
         Posicion resta = b - a;
        int x = resta.X * resta.X;
        int y = resta.Y * resta.Y;
        int suma = x + y;
        double respuesta = Math.Sqrt(suma);
        return  float.MaxValue > respuesta ? (float)respuesta : float.MaxValue;
 
    }
 
    public static int CuadrantesEntre(Posicion a, Posicion b)
    {
        Posicion resta = b - a;
        return Math.Abs(resta.X) * Math.Abs(resta.Y);
    }
}


Y por otro lado tengo,:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
using System.Linq;
using System.Collections.Generic;
using UnityEngine;
 
public class Camino : List<Posicion>, IEquatable<Camino>
{
 
    public virtual Camino ClonarYAgregar(Posicion p)
    {
        Camino previo = Clonar();
        previo.Add(p);
        return previo;
    }
 
    public virtual Camino Clonar()
    {
            Camino copia = new Camino();
            copia.AddRange(from n in this select n.Clonar()); //Aquí me ha dado el error mencionado.
            return copia;
    }
 
    public bool Equals(Camino other) => other.Count == this.Count;
 
    public override bool Equals(object obj) => obj != null && obj is Camino ? this.Equals((Camino)obj) : false;
 
    public override int GetHashCode() => base.GetHashCode();
 
    public override string ToString() => this.Count + "";
 
 
 
}

//Quito algunos métodos de la siguiente que creo son irrelevantes (Para no inflar esto mucho). En la versión actual el método de clonar lo aplico directamente con un for... Pero... No me convence mucho.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
using System;
using System.Linq;
using System.Collections.Generic;
using UnityEngine;
 
public class CaminoV : Camino, IEquatable<CaminoV>, IComparable<CaminoV>
{
 
 
 
    protected float _Valor;
    public float Valor
    {
        get
        {
            return _Valor;
        }
    }
 
    public new CaminoV Clonar()
    {
        CaminoV copia = new CaminoV();
        Camino basec = base.Clonar();
         copia.AddRange(basec); //Aquí me dice que da el error mencionado.
         return copia;
 
    }
    public new CaminoV ClonarYAgregar(Posicion p)
    {
        CaminoV previo = this.ClonarV();
        previo.Add(p);
        return previo;
    }
 
    public bool Equals(CaminoV other)
    {
        if (other.Count != this.Count) return false;
        if (this.Count == 0) return true;
        return this[this.Count -1].Equals(other[other.Count -1]);
    }
 
    public override bool Equals(object obj) => obj != null && obj is CaminoV ? this.Equals((CaminoV)obj) : false;
 
    public override int GetHashCode() => base.GetHashCode();
 
    public int CompareTo(CaminoV other)
    {
        if (this.Valor < other.Valor) return -1;
        if (this.Valor > other.Valor) return 1;
        return 0;
    }
}

En el código principal clono los CaminoV (hago 4 clones por ahora) hasta que llego a mi destino.

Un saludo.

P.D: PUedo poner más código.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar