0

我正在尝试创建一个仅取自已创建数组的正值的新数组,当我遍历原始数组时,索引出现错误“表达式必须具有指向对象类型的指针”我尝试对错误进行研究,并且每个人在收到此错误时的情况都不同,所以我自己处理这个问题。这是我的代码:

int foo::createNewArray() const {
    int newarray[50];
    int oldarray = oldarray[values];
    int size = (sizeof(oldarray));

    for (int i = 0; i > size; i++){
        if (oldarray[i] > 0)
            newarray[i] = oldarray[i];
    }

上面的“i”是有错误的。oldarray[values] 在单独的类文件中声明。这是它来自的代码的一小部分。

        class foo{
        int oldarray[1];
        enum unit {values};

        public:
        int createNewArray() const;
};
4

3 回答 3

1

在这里,您oldarray使用局部int变量遮蔽数组:

int oldarray = oldarray[values];

从那时起,直到块结束,都oldarray意味着一个 int,然后其余的代码对此没有多大意义。

于 2013-05-20T19:19:55.963 回答
0

问题是因为 oldArray 需要是一个 int*,而不仅仅是一个 int。您当前将 oldarray 设置为数组中的第一个值,而不是将其指向数组的根。所以像 int* oldArray = newArray 这样的东西会让你使用索引运算符遍历 oldArray。

class Foo
{
    int* oldArray;
    int size;

public:
    int* CreateNewArray() const
    {
        int* newArray = new int[size];

        int current = 0;
        for( int index = 0; index < size; index++)
        {
            if(oldArray[index] > 0)
            {
                newArray[current] = oldArray[index];
                current++;
            }
        }

        return newArray;
    }
};

对于在没有编译的情况下随意发布此内容,我深表歉意。尽管此解决方案可能比建议的更接近金属,但它仍然是您的问题的有效解决方案,假设在调用此方法之前设置了 oldArray 和 size。

于 2013-05-20T19:17:58.297 回答
0

以下是此代码问题的一些注释。

class foo{
    int oldarray[1]; //Do you really want an array of size 1?  Why not just an integer?
    enum unit {values};//An enumeration that only enumerates one thing?  Are you sure you don't really want const int VALUES = 0;  I feel like you don't really even want an enum

    public:
    int createNewArray() const; 
};

int foo::createNewArray() const {
    int newarray[50];  //Magic numbers are bad, what if sizeof(oldarray) > 50?
    int oldarray = oldarray[values];  //Re declaring oldarray as a single integer and assigning it oldarray[values] as its value.
    int size = (sizeof(oldarray));  //is this oldarray an integer or an array of integers???

    for (int i = 0; i > size; i++){  //don't you want i < size??? if size > 0, this loop will never get run.
        if (oldarray[i] > 0) //probably grabbing the correct oldarray(Compilers are smart), but not getting expected values because the array version of oldarray wasn't initialized properly.
            newarray[i] = oldarray[i];
    }

我相信你试图做的是以下几点:

int* foo::createNewArray() const {
    const int SIZE = sizeof(oldarray);
    int *newArray = int[SIZE];
    for(int i = 0; i < SIZE; i++) {
        if(oldarray[i] > 0) {
            newArray[i] = oldarray[i];
        } else {
            newArray[i] = 0;//In most environments this is unnecessary, but it is safer and good style
        }
    }

    return newArray;
}

请注意,即使此代码也仅在 oldarray 在此代码范围内时才有效(不是很好的样式,将其作为参数传递给 createNewArray 会更好,但没关系)并且已正确实例化,因此 sizeof(oldarray) 是数组的大小而不是整数的大小,或者可能是整数指针,我忘记了。

于 2013-05-20T19:25:36.020 回答