2012-04-22 131 views
29

Tengo dos clases, una para la definición de los parámetros del algoritmo y otro para implementar el algoritmo:C# error: "Se requiere una referencia de objeto para el campo no estático, el método o propiedad"

Clase 1 (parámetros del algoritmo):

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace VM_Placement 
{ 
    public static class AlgorithmParameters 
    { 
     public static int pop_size = 100; 
     public static double crossover_rate = 0.7; 
     public static double mutation_rate = 0.001; 

     public static int chromo_length = 300; 
     public static int gene_length = 4; 
     public static int max_allowable_generations = 400; 

     static Random rand = new Random(); 
     public static double random_num = rand.NextDouble(); 
    } 
} 

Clase 2 (implementar algoritmo):

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace VM_Placement 
{ 
    public class Program 
    { 
     public struct chromo_typ 
     { 
      public string bits; 
      public float fitness; 

      //public chromo_typ(){ 
      // bits = ""; 
      // fitness = 0.0f; 
      //} 
      chromo_typ(string bts, float ftns) 
      { 
       bits = bts; 
       fitness = ftns; 
      } 
     }; 

     public static int GetRandomSeed() 
     { 
      byte[] bytes = new byte[4]; 
      System.Security.Cryptography.RNGCryptoServiceProvider rng = 
       new System.Security.Cryptography.RNGCryptoServiceProvider(); 
      rng.GetBytes(bytes); 
      return BitConverter.ToInt32(bytes, 0); 
     } 

     public string GetRandomBits() 
     { 
      string bits=""; 

      for (int i = 0; i < VM_Placement.AlgorithmParameters.chromo_length; i++) 
      { 
       if (VM_Placement.AlgorithmParameters.random_num > 0.5f) 
        bits += "1"; 
       else 
        bits += "0"; 
      } 
      return bits; 
     } 

     public static void Main(string[] args) 
     { 
      Random rnd = new Random(GetRandomSeed()); 

      while (true) 
      { 
       chromo_typ[] Population = new chromo_typ[VM_Placement.AlgorithmParameters.pop_size]; 
       double Target; 

       Console.WriteLine("\n Input a target number"); 
       Target = Convert.ToDouble(Console.ReadLine()); 

       for (int i = 0; i < VM_Placement.AlgorithmParameters.pop_size; i++) 
       { 
        Population[i].bits = GetRandomBits(); 
        Population[i].fitness = 0.0f; 
       } 
      } 
     } 
    } 
} 

Recibo un error en Population[i].bits = GetRandomBits(); en Main().

error es:

An object reference is required for the non-static field, method, or property 'VM_Placement.Program.GetRandomBits()'

Me estoy perdiendo algo?

Respuesta

72

El método Main es Estático. No puede invocar un método no estático desde un método estático.

GetRandomBits() 

no es un método estático. Ya sea que usted tiene que crear una instancia de Program

Program p = new Program(); 
p.GetRandomBits(); 

o hacer

GetRandomBits() estática.

7

Parece que usted quiere:

public static string GetRandomBits() 

Sin static, se necesitaría un objeto antes de llamar al método GetRandomBits(). Sin embargo, dado que la implementación de GetRandomBits() no depende del estado de ningún objeto Program, lo mejor es declararlo static.

1

El método Main es estático dentro de la clase Program. No puede llamar a un método de instancia desde un método estático, por lo que está obteniendo el error.

Para solucionarlo solo necesita hacer que su método GetRandomBits() estético también.

Cuestiones relacionadas