SoloCodigo

CLR: .Net / Mono / Boo / Otros CLR => C# => Mensaje iniciado por: waty00 en Viernes 25 de Abril de 2008, 12:55

Título: Vector De Structura
Publicado por: waty00 en Viernes 25 de Abril de 2008, 12:55
Hola, buenos dias.

Estoy programando en Visual Studio 2005 con C# y tengo problemas para acceder a un vector de estructuras. Pongo un ejemplo de mi estructura y del vector creado a partir de ella:

unsafe struct AP
    {      
        public string posicion;
        public fixed int valores[10];
        public int tamvalor;
        public float media, varianza, desviacion;
    }

AP[] VectorAP = new AP[10];

Ya he creado un vector de tamaño 10 y cada entrada del vector es una estructura AP. Mi problema es como aceder al campo valores que tambien es un vector.

Lo normal para acceder a este tipo de configuracion es por ejemplo:
VectorAP[1].tamvalor = 1;          <------ Esto funciona
VectorAP[1].valores[3] = 1;        <------ Esto NO FUNCIONA !!!

Al intentar acceder al campo vectores me sale este error:
"Error del compilador CS1666. No puede utilizar los búferes de tamaño fijo contenidos en expresiones de tipo unfixed. Intente usar la instrucción fixed."


Alquien me puede ayudar??

Gracias.
Título: Re: Vector De Structura
Publicado por: ProfesorX en Viernes 25 de Abril de 2008, 18:24
Mira waty00, en tu caso, cuando necesito tener un vector en una estructura, prefiero definirla como una clase, al fin y al cabo, un struct y un class, funcionan muy parecido, y me evito ese y otros errores al utilizar structs (he tenido otras dificultades con struct), solo que, para evitar que pueda "heredar" de la clase, la defino como sealed:

Código: Text
  1.  
  2.     sealed class AP
  3.     {
  4.         public string posicion;
  5.         public int[] valores = new int[10];
  6.         public int tamvalor;
  7.         public float media, varianza, desviacion;
  8.     }
  9.  
  10.  

De esa manera, el codigo que pones, si seria valido.
Código: Text
  1.  
  2.             AP[] VectorAP = new AP[10];
  3.             VectorAP[1].tamvalor = 1;
  4.             VectorAP[1].valores[3] = 1;
  5.  
  6.  

Ojala y eso resuelva tu problema.

Saludos :hola:
Título: Re: Vector De Structura
Publicado por: waty00 en Lunes 28 de Abril de 2008, 22:12
He probado lo que me dijiste pero no funciona. Me sale este error:

"Excepción no controlada del tipo 'System.NullReferenceException' en PFC.exe
Información adicional: Referencia a objeto no establecida como instancia de un objeto."

Con la clase se me crea el vector de [10] pero no se crean los campos de la estructura de cada posicion del vector. Al intentar acceder a un campo que no existe da el error en tiempo de ejecucion pero en la compilacion no lo detecta.

-      VectorAP   {Dimensiones:[10]}   PFC.Form1.AP[]
      
Título: Re: Vector De Structura
Publicado por: ProfesorX en Martes 29 de Abril de 2008, 18:55
Es muy raro, porque a mi si me funciona.

Quizas estas declarando mal algo, postea tu codigo, para saber que pasa.

Saludos :hola:
Título: Re: Vector De Structura
Publicado por: Mostreus en Miércoles 30 de Abril de 2008, 22:28
adf
Título: Re: Vector De Structura
Publicado por: waty00 en Martes 6 de Mayo de 2008, 15:28
Este es mi código:

namespace PFC
{
   
   unsafe public partial class Form1 : Form
   {
      private void button1_Click(object sender, EventArgs e)
      {
          FicheroUnico(ap);
      }
      
      sealed class APP
                          {
         public string posicion;
         public int[] valores = new int[10];
         public int tamvalor;
         public float media, varianza, desviacion;
      }


      unsafe public void FicheroUnico(string ap)
      {
         APP[] VectorAPP = new APP[10];
         VectorAPP[1].desviacion = 3;
      }
   }
}
Título: Re: Vector De Structura
Publicado por: waty00 en Martes 6 de Mayo de 2008, 15:32
Correccion, el codigo anterior si funciona. Me falto poner la linea conflictiva. Quiero aclarar que esto compila bien pero en tiempo de ejecucion cuando le doy al boton del form salta el error que ya comentaba. Aqui dejo el codigo con la nueva linea:
namespace PFC
{
   
   unsafe public partial class Form1 : Form
   {
      private void button1_Click(object sender, EventArgs e)
      {
          FicheroUnico(ap);
      }
      
      sealed class APP
           {
         public string posicion;
         public int[] valores = new int[10];
         public int tamvalor;
         public float media, varianza, desviacion;
      }


      unsafe public void FicheroUnico(string ap)
      {
         APP[] VectorAPP = new APP[10];
         VectorAPP[1].desviacion = 3;
         VectorAPP[1].valores[1] = 4;    ----->linea conflictiva
      }
   }
}
Título: Re: Vector De Structura
Publicado por: waty00 en Martes 6 de Mayo de 2008, 15:36
correccion, ninguna linea funciona. todo compila pero me da error al ejecutar.
creia que me funcionaba, pero me da el mismo error en las dos lineas.
Título: Re: Vector De Structura
Publicado por: ProfesorX en Martes 6 de Mayo de 2008, 20:53
Tienes razon, como te lo puse originalmente no funciona, estuve investigando y resulta que cuando haces APP[] VectorAPP = new APP[10] no crea un array de diez objetos, sino un array con REFERENCIAS a diez objetos, pero los objetos aun no existen y por lo tanto, los marca como null.

La solucion es crear el objeto despues de crear el array, esto lo puedes hacer individualmente o mediante un ciclo, como lo prefieras. a continuacion te pongo la manera correcta, por cierto, recuerda que los array comienzan con cero y no con uno, un array de 10 elementos, va del 0 al 9 y no del 1 al 10.

Código: Text
  1.  
  2.         public void FicheroUnico()
  3.         {
  4.             /// Crea un vector con referencias a 10 objetos
  5.             /// las referencias valen null hasta que no se crea
  6.             /// el objeto.
  7.             APP[] VectorAPP = new APP[10];
  8.            
  9.             /// Creacion del objeto
  10.             VectorAPP[0] = new APP();
  11.             VectorAPP[0].desviacion = 3;
  12.             VectorAPP[0].valores[0] = 4;
  13.         }
  14.  
  15.  
  16.  
  17.  


Código: Text
  1.  
  2.             /// Creacion de los 10 objetos mediante un ciclo
  3.             int i;
  4.             for (i = 0; i &#60; 10; i++)
  5.             {
  6.                 VectorAPP[i] = new APP();
  7.             }
  8.  
  9.  

Saludos :hola:
Título: Re: Vector De Structura
Publicado por: waty00 en Miércoles 7 de Mayo de 2008, 00:19
Ahora si me funciona bien. Es lo que quería aunque tenga mas lineas de código.

Muchicimas Gracias.