3

如果我没有选择描述性或简洁的名称,我很抱歉。很多问题听起来很相似,但我一直找不到我要找的东西。我想要做的是在某处存储一个二维指针数组,并将某个对象中的一个变量分配给该数组以便能够访问它。

这是一些示例代码,它们与我在一个更大的项目中遇到的编译错误相同。

#include <iostream>
using namespace std;
struct X{
    float n, * b[8][8];
    X(){
        n = 1;
        b[1][5] = &n;
        cout << *(b[1][5]) << endl;
    }
    void Set(float * c[8][8]){
        b = c;
        cout << *(b[1][5]) << endl;
    }
};
main(){
    float m, * a[8][8];
    m = 2;
    a[1][5] = &m;
    X obj;
    obj.Set(a);
}

我希望在这段代码中发生的是一个 X 对象从它自己的二维数组开始,b[1][5] 指向的值应该打印为“1”。然后将 main 方法的二维数组 a 传递给对象的 Set() 方法并分配给它的数组变量。然后 b[1][5] 指向的值应打印为“2”。

但是,我不知道 Set() 参数 c 应该是什么类型。我明白了

error: incompatible types in assignment of ‘float* (*)[8]’ to ‘float* [8][8]’

当我尝试编译时。至于我为什么要这样做,我正在尝试使用指向对象的指针数组,而不是浮点数,但这是同样的错误。

4

3 回答 3

1

试试这个:

#include <iostream>
using namespace std;
struct X{
    float n;
    float* (*b)[8];
    X(){
        n = 1;
        b = new float*[8][8];
        b[1][5] = &n;
        cout << *(b[1][5]) << endl;
    }
    void Set(float * c[8][8]){
        delete[] b;
        b = c;
        cout << *(b[1][5]) << endl;
    }
};
main(){
    float m, * a[8][8];
    m = 2;
    a[1][5] = &m;
    X obj;
    obj.Set(a);
}

在这里,X存储一个指向一维数组的指针,我们将其视为指向二维数组第一个元素的指针 - 即只是一个二维数组。

X的构造函数中,X分配它自己的数组new并设置它的指针指向它。调用时Set()X删除自己的数组,并将其指针设置为指向调用者提供的数组。

唯一需要注意的是,如果您Set()再次调用,数组将依次被删除(如果该数组是堆栈数组,则会爆炸,就像在这种情况下一样)。因此,最好将 do 的行分离delete[] b到它自己的成员函数中,并仅在必要时调用它。

于 2012-06-07T05:48:37.793 回答
0

您对 set 的问题是您需要复制数组内容 - 只是做b=c不能做您想做的事。

void Set(float * c[8][8]){
    for(unsigned int i=0; i<8; ++i) {
      for(unsigned int j=0; j<8; ++j) {
        b[i][j] = c[i][j];
      }
    }
    cout << *(b[1][5]) << endl;
}
于 2012-06-07T04:36:35.930 回答
0

我认为有几个错误。首先,在 Set() 函数中,您分配了一个数组名称。但是数组名不应该用作变量。您可以通过将指针 b 的 2D 数组作为指向 1D 指针数组的指针来解决这个问题,例如 float * (*b)[8]...

其次,当您将 2D 指针数组作为 Set() 函数的参数发送时,它会衰减为指向 1D 指针数组的指针,即类似于 float *(*a)[8] 的指针。所以你必须使 Set() 函数的形式参数成为指向一维指针数组的指针,如 void Set(float * (*c)[8])...

最后有一个东西你在 main 中的浮点变量 m 是 main 的局部变量,所以当控制传递给 Set() 函数时,我认为编译器在 m 中找不到值(可能被释放)......所以它输出 undefined或给出运行时错误..您可以通过制作 ma 静态版本来解决这个问题。即通过声明静态浮动m ...

总共使您的代码如下所示:

#include <iostream>
using namespace std;
struct X{
    float n, *(*b)[8];
    X(){
        n = 1;
        b[1][5] = &n;
        cout << *(b[1][5]) << endl;
    }
    void Set(float * (*c)[8]){
        b = c;
        cout << *(b[1][5]) << endl;
    }
};
main(){
    float * a[8][8];
    static float m;
    m = 2;
    a[1][5] = &m;
    X obj;
    obj.Set(a);
}

这将正确输出:)

于 2012-06-07T05:50:25.080 回答