C ++ C2466 ошибка - PullRequest
       1

C ++ C2466 ошибка

0 голосов
/ 18 января 2011

Почему мы можем сделать что-то вроде

        for(int i = 0; i < destination->imageSize; i=i+3)
        { 

            buffer[2] = destination->imageData[i];
            buffer[1] = destination->imageData[i+1];
            buffer[0] = destination->imageData[i+2];
            buffer+=3;
        }

, но мы не можем сделать

                               char buffer[destination->imageSize];

А как с такой штукой?в C ++ ...

Кстати: моя цель - создать функцию, которая бы возвращала символ с изображением.Если бы я использовал копию копии, как удалить возвращенное значение?

Ответы [ 5 ]

4 голосов
/ 18 января 2011

Я должен спросить, почему вы думаете, что они вообще связаны?Если бы вы не могли индексировать массив по переменной времени выполнения, было бы бесполезно даже использовать массивы.Объявление переменной размера, определяемой переменной времени выполнения, совершенно иное и требует фундаментальных изменений в том, как компилятор управляет автоматической памятью.

Именно поэтому вы не можете сделать это в C ++.Это может измениться, но сейчас вы не можете.

Если вам действительно нужен массив переменного размера, вам нужно выделить его динамически.Вы можете сделать это сложным, простым способом (char * buff = new char[size]...delete [] buff;), или вы можете сделать это простым, более безопасным способом (std::vector<char> buff(size)).Твой выбор.Вы не можете построить его «в стеке».

2 голосов
/ 18 января 2011

char buffer[destination->imageSize]; объявляет переменную в время компиляции . В то время значение destination->imageSize еще не известно, поэтому оно не работает.

Выражение buffer[2] = destination->imageData[i]; (или, скорее, его буфер [2]) вычисляется во время выполнения.

1 голос
/ 18 января 2011

Используя std :: vector, вы можете достичь желаемого. Ваша функция может быть определена примерно так:

void readImage(std::vector<char>& imageData, std::string& filename)
{
    size_t imageSize = 0;
    //read file and load imageSize
    imageData.resize(imageSize);
    // load image into imageData using such as you in your question
    for(int i = 0; i < destination->imageSize; i=i+3)
    { 

        buffer[2] = destination->imageData[i];
        buffer[1] = destination->imageData[i+1];
        buffer[0] = destination->imageData[i+2];
        buffer+=3;
    }
}

Для дальнейших улучшений вы можете вернуть логическое значение, указывающее на успех или неудачу.

Относительно причины C2466, у меня нет официального ответа, но вы можете объявить массивы char с константными переменными только так:

const int imageSize = 4242; 
char imageData[imageSize]; // No C2466 error
1 голос
/ 18 января 2011

Хм. Вы пытались создать указатель или ссылку на destination-> imageSize и передать его вместо индекса?

1 голос
/ 18 января 2011
  1. Вы не можете вернуть локальный массив. Все, что вы возвращаете, должно быть кем-то бесплатно.локальный массив должен быть постоянным.Всегда.Это потому, что в C ++ нет особой логики для массивов.Вы можете использовать некоторую коллекцию объектов STL.

...