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

本文关键字:不安全 上下文 缓冲区 指针 | 更新日期: 2023-09-27 18:31:58

我在一个类中有 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

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

您需要在 unsafe 块中使用原始指针将函数括起来。

unsafe 
{
 //your code
}

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

无论函数使用不安全代码,都需要使用"unsafe"关键字进行声明。
例如:

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"不安全代码教程"中有很多很棒的信息:
https://msdn.microsoft.com/en-us/library/aa288474(v=vs.71).aspx

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

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

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

并完全移除unsafe{ ... }块。