1

我只是在学习神经网络,我想让神经元的构造函数接收一个指向数组中一个部分的指针,该部分将是染色体。像这样的东西:

public int* ChromosomeSection;

public Neuron(int* chromosomeSection)
{
    ChromosomeSection = chromosomeSection;
}

所以我会用这样的东西创建我的神经元:

int[] Chromosome = new int[neuronsCount * neuronDataSize];

for (int n = 0; n < Chromosome.Length; n += neuronDataSize)
{
    AddNeuron(new Neuron(Chromosome + n));
}

是否可以在 C# 中执行此操作?我知道 C# 支持一些不安全的代码。但我不知道如何告诉编译器该行public Neuron(int* chromosomeSection)不安全。

另外,我能否完成在 C++ 或 C 中会执行的所有操作?在开始这样做之前我应该​​注意什么问题?以前从未在 C# 中使用过不安全的代码。

4

3 回答 3

1

听起来你可以使用ArraySegment<int>你正在尝试做的事情。

ArraySegment 是一个数组的包装器,用于界定该数组中的一系列元素。多个 ArraySegment 实例可以引用同一个原始数组并且可以重叠。

Array 属性返回整个原始数组,而不是数组的副本;因此,对 Array 属性返回的数组所做的更改是对原始数组进行的。

于 2011-04-27T14:41:29.863 回答
1

Eric Lippert有很好的两部分系列:引用和指针,第一部分“托管指针”实现(引用和指针,第二部分)

这是我在将一些复杂的指针操作代码从 C 转换为 C# 时创建的一种方便的类型。它使您可以创建指向数组内部的安全“托管指针”。您可以对非托管指针执行所有操作:您可以取消引用它作为数组的偏移量、进行加法和减法、比较两个指针是否相等或不相等,以及表示一个空指针。但与相应的不安全代码不同的是,这段代码不会弄乱垃圾收集器,并且如果你做了一些愚蠢的事情就会断言,比如尝试比较不同数组内部的两个指针。(*) 享受!

希望能帮助到你。

于 2011-04-27T16:32:59.480 回答
0

是的,这在 C# 中是完全可能的,虽然单独的指针不足以以这种方式使用它,但您还需要一个 Int32 长度参数,因此您知道在不溢出的情况下递增该指针多少次是安全的 -如果您有 C++ 背景,这应该很熟悉。

于 2011-04-27T15:25:19.087 回答