C ++ передача по ссылке, возвращающей мусор или неверную переменную

Я извлекаю данные пикселей из изображения с помощью библиотеки CImg и помещаю их в массив в структуре:

int JpgHandle::loadJpg(const char* Name, SImageData & data){

CImg<unsigned long> src(Name);
int width = src.width();
int height = src.height();
unsigned long * pixels = new unsigned long [width*height];
for (int r = 0; r < height; r++){
for (int c = 0; c < width; c++){
unsigned long pixel = (src(c,r,0,2) ) |
(src(c,r,0,1) <<  8) |
(src(c,r,0,0) << 16);
*(pixels++) = pixel;
}
}

data.pData = pixels;
data.lWidth = (long) width;
data.lHeight = (long) height;
data.lStride = (long) width;

return 1;
}

SImageData определяется таким образом:

struct SImageData {
unsigned long *pData;
long lWidth;
long lHeight;
long lStride;

SImageData() : pData(NULL), lWidth(0), lHeight(0), lStride(0) {}
};

Когда я вызываю loadJpg из main следующим образом:

JpgHandle handler;
SImageData data1;

handler.loadJpg(argv[1], data1);

cout << "data1: ";
for(int i = 0; i < 10; i++){
cout << hex << data1.pData[i] << ", ";
}
cout << "\n";

Возвращает мусор:

data1: 0, 1eff1, 7f226014e798, 7f226014e798, 0, 0, 0, 0, 0, 0,

Однако, если я сделаю это в основном:

JpgHandle handler;
SImageData data1;
SImageData data2;

handler.loadJpg(argv[1], data1);
handler.loadJpg(argv[2], data2);

cout << "data1: ";
for(int i = 0; i < 10; i++){
cout << hex << data1.pData[i] << ", ";
}
cout << "\n";

cout << "data2: ";
for(int i = 0; i < 10; i++){
cout << hex << data2.pData[i] << ", ";
}
cout << "\n";

В результате data1 содержит данные из argv [2], а data2 содержит мусор:

data1: 0, 2011, a0a0a, a0a0a, a0a0a, 90909, 90909, a0a0a, b0b0b, b0b0b,
data2: 0, 7f0d7d712798, 0, 0, 0, 0, 0, 0, 0, 0,

Что дает?

0

Решение

Вы должны сохранить указатель на выделенную память в data.pData до Вы входите во вложенные циклы. Шаг приращения pixels поэтому он больше не указывает на начало блока памяти.

Вы когда-нибудь звоните delete[] на data.pData? Это должно было вызвать ошибку, потому что это был не тот адрес, который был возвращен new[],

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector