指针和固定大小的缓冲区只能在不安全的环境中使用

时间:2012-04-22 16:25:49

标签: c# pointers

我在一个类中有2个函数,并且在调用ParseBits()函数时出现错误,即“int num_elements = ParseBits(bits, buffer);”,因为我传递的“缓冲区”争论“public int ParseBits(string bits, int* buffer)”:

功能1:

public float AssignFitness(string bits, int target_value)
        {

   //holds decimal values of gene sequence
   int[] buffer = new int[(VM_Placement.AlgorithmParameters.chromo_length / VM_Placement.AlgorithmParameters.gene_length)];

   int num_elements = ParseBits(bits, buffer);

   // ok, we have a buffer filled with valid values of: operator - number - operator - number..
   // now we calculate what this represents.
   float result = 0.0f;

   for (int i=0; i < num_elements-1; i+=2)
   {
      switch (buffer[i])
      {
         case 10:

            result += buffer[i+1];
            break;

         case 11:

            result -= buffer[i+1];
            break;

         case 12:

            result *= buffer[i+1];
            break;

         case 13:

            result /= buffer[i+1];
            break;

      }//end switch

   }

   // Now we calculate the fitness. First check to see if a solution has been found
   // and assign an arbitarily high fitness score if this is so.

   if (result == (float)target_value)

      return 999.0f;

   else

      return 1/(float)fabs((double)(target_value - result));
   //   return result;
}

功能2:

public int ParseBits(string bits, int* buffer)
        {

            //counter for buffer position
            int cBuff = 0;

            // step through bits a gene at a time until end and store decimal values
            // of valid operators and numbers. Don't forget we are looking for operator - 
            // number - operator - number and so on... We ignore the unused genes 1111
            // and 1110

            //flag to determine if we are looking for an operator or a number
            bool bOperator = true;

            //storage for decimal value of currently tested gene
            int this_gene = 0;

            for (int i = 0; i < VM_Placement.AlgorithmParameters.chromo_length; i += VM_Placement.AlgorithmParameters.gene_length)
            {
                //convert the current gene to decimal
                this_gene = BinToDec(bits.Substring(i, VM_Placement.AlgorithmParameters.gene_length));

                //find a gene which represents an operator
                if (bOperator)
                {
                    if ((this_gene < 10) || (this_gene > 13))

                        continue;

                    else
                    {
                        bOperator = false;
                        buffer[cBuff++] = this_gene;
                        continue;
                    }
                }

                //find a gene which represents a number
                else
                {
                    if (this_gene > 9)

                        continue;

                    else
                    {
                        bOperator = true;
                        buffer[cBuff++] = this_gene;
                        continue;
                    }
                }

            }//next gene

            //   now we have to run through buffer to see if a possible divide by zero
            //   is included and delete it. (ie a '/' followed by a '0'). We take an easy
            //   way out here and just change the '/' to a '+'. This will not effect the 
            //   evolution of the solution
            for (int i = 0; i < cBuff; i++)
            {
                if ((buffer[i] == 13) && (buffer[i + 1] == 0))

                    buffer[i] = 10;
            }

            return cBuff;
        }

我在突出显示的行上输入了2个错误:

Error 1: The best overloaded method match for 'VM_Placement.Program.ParseBits(string, int*)' has some invalid arguments

Error 2: Pointers and fixed size buffers may only be used in an unsafe context

3 个答案:

答案 0 :(得分:20)

您需要使用unsafe块中的原始指针来封闭您的函数。

unsafe 
{
 //your code
}

答案 1 :(得分:6)

也许我错过了它,但你似乎没有做任何实际需要使用int*的事情。为什么不简单地将它传递给一个int数组并将ParseBits函数签名更改为:

public int ParseBits(string bits, int[] buffer)

并完全删除unsafe{ ... }个区块。

答案 2 :(得分:3)

我遇到了同样的问题,但是这里的任何其他答案都没有解决。我一直有不同的错误。

无论什么功能使用不安全的代码,只需要使用&#34; unsafe&#34;关键字。
例如:

static unsafe void myFunction(int* myInt, float* myFloat)  
{
    // Function definition
}

就个人而言,我在制作包装类时试图这样做 对于那些感兴趣的人,它最终看起来像这样:

using System.Runtime.InteropServices;

namespace myNamespace
{
    public class myClass
    {
        [DllImport("myLib.so", EntryPoint = "myFunction")]
        public static extern unsafe void myFunction(float* var1, float* var2);
    }
}

在MSDN&#34;不安全代码教程&#34;:中有很多很棒的信息 https://msdn.microsoft.com/en-us/library/aa288474(v=vs.71).aspx

它可能值得一读,我发现它非常有用。