gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:37:02 26 4
gpt4 key购买 nike

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

功能一:

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

功能二:
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

最佳答案

也许我错过了它,但您似乎没有做任何实际需要使用 int* 的事情。 .为什么不简单地传递一个 int 数组并将 ParseBits 函数签名更改为:
public int ParseBits(string bits, int[] buffer)
并删除 unsafe{ ... }完全块。

关于c# - 指针和固定大小的缓冲区只能在不安全的上下文中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10269748/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com