2012-04-22 132 views
29

Ho due classi, una per definire i parametri dell'algoritmo e un altro per implementare l'algoritmo:C error #: "È richiesto un riferimento all'oggetto per il campo non statico, metodo o proprietà"

classe 1 (parametri dell'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(); 
    } 
} 

Classe 2 (implementare l'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; 
       } 
      } 
     } 
    } 
} 

Ricevo un errore su Population[i].bits = GetRandomBits(); in Main().

errore è:

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

Mi sto perdendo qualcosa?

risposta

72

Il metodo Main è statico. Non è possibile richiamare un metodo non statico da un metodo statico.

GetRandomBits() 

non è un metodo statico. O si deve creare un'istanza di Program

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

o fare

GetRandomBits() statica.

7

Sembra che si desidera:

public static string GetRandomBits() 

Senza static, si avrebbe bisogno di un oggetto prima di poter chiamare il metodo GetRandomBits(). Tuttavia, poiché l'implementazione di GetRandomBits() non dipende dallo stato di qualsiasi oggetto Program, è consigliabile dichiararlo static.

1

Il metodo Main è statico all'interno della classe Program. Non è possibile chiamare un metodo di istanza all'interno di un metodo statico, motivo per cui si sta verificando l'errore.

Per risolvere il problema è necessario anche impostare il metodo GetRandomBits() statico.

Problemi correlati