2012-04-22 11 views
29

mam dwie klasy, jeden dla definiowania parametrów algorytmu i kolejne wdrożenie algorytmu:# błędu C: „Odwołanie do obiektu jest wymagane dla pola non-static, metody lub właściwości”

klasy 1 (parametry algorytmu):

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(); 
    } 
} 

Klasa 2 (realizować algorytm)

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; 
       } 
      } 
     } 
    } 
} 

Otrzymuję komunikat o błędzie Population[i].bits = GetRandomBits(); w Main().

Błąd jest:

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

Am I brakuje czegoś?

Odpowiedz

72

Metoda Main ma charakter statyczny. Nie można wywołać metody niestatycznej z metody statycznej.

GetRandomBits() 

nie jest metodą statyczną. Albo trzeba stworzyć instancję Program

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

lub dokonać

GetRandomBits() statyczne.

7

To wygląda tak, jak chcesz:

public static string GetRandomBits() 

Bez static, musisz obiekt, zanim będzie można wywołać metodę GetRandomBits(). Jednak, ponieważ implementacja GetRandomBits() nie zależy od stanu żadnego obiektu Program, najlepiej jest zadeklarować go jako static.

1

Metoda Main jest statyczna w klasie Program. Nie można wywołać metody instancji z wnętrza metody statycznej, dlatego pojawia się błąd.

Aby to naprawić, po prostu musisz również ustawić metodę GetRandomBits().