由于指针的原因,我在将以下代码从c ++转换为c#时遇到了一些麻烦。
基本上我有一个
STATE** State;
States = new STATE* [max_states];
for (int i=0; i < max_states; i++) {
States[i] = new STATE(max_symbols);
}
如果这是一个双数组,我会说
STATE[][] States;
States = new STATE[max_states][];
for (int i = 0; i '<' max_states; i++) {
States[i] = new STATE[max_symbols];
}
但问题是c ++代码没有像我预期的那样工作。
States[i] = new STATE(max_symbols);
有一些奇怪的行为,例如允许
States[cur_state]->set_recur_out(k);
到底我没看到什么?这可能是一个初学者的c ++问题。对不起,如果我没有任何意义=)
答案 0 :(得分:3)
它不是2d数组,而是包含指向单个元素的指针的1d数组...
new STATE(max_symbols)
构造一个STATE对象,调用构造函数,该构造函数接受一个参数(在本例中为max_symbols)。
我没有C#的那么多线索,但以下内容应该是C#中C ++代码的正确表示:
STATE[] States;
States = new STATE[max_states];
for (int i = 0; i '<' max_states; i++) {
States[i] = new STATE(max_symbols);
}
答案 1 :(得分:1)
这只是一个指针数组。在C#中,它将是一维数组:
STATE[] States = new STATE[max_states];
for (int i = 0; i < max_states; i++) {
States[i] = new STATE(max_symbols);
}
您在C ++中看到的“奇怪行为”只是访问指向类型的指针成员的C ++方式:
Type* x;
x->y();
// is the same as:
(*x).y();
// and corresponds to:
Type z;
z.y();