2016-05-22 5 views
-1
#include <iostream> 
#include <atlimage.h> 
using namespace std; 
void locate(CImage img, int i, int j) 
{ 
    img.GetPixelAddress(i, j); 
}; 
int main() 
{ 
    CImage img; 
    img.Load(_T("./1.png")); 
    locate(img, 0, 0); 
    //img.GetPixelAddress(0, 0); 
    unsigned char * p = (unsigned char *)(img.GetPixelAddress(0, 0)); 
    cout <<*p << endl;//give me a runtime error 
    return 0; 
} 

Это дает мне ошибку времени выполнения. Я использую vs2015 для окон.Копирование CImage приводит к ошибке времени выполнения

#include <iostream> 
#include <atlimage.h> 
using namespace std; 
void locate(CImage img, int i, int j) 
{ 
    img.GetPixelAddress(i, j); 
}; 
int main() 
{ 
    CImage img; 
    img.Load(_T("./1.png")); 
    //locate(img, 0, 0); 
    img.GetPixelAddress(0, 0); 
    unsigned char * p = (unsigned char *)(img.GetPixelAddress(0, 0)); 
    cout <<*p << endl;//works fine 
    return 0; 
} 

Это скомпилируется, но выглядит в основном так же, как и код выше. Я просто заменяю часть функции локации кодами, которые фактически выполняются. Это ошибка компилятора?

+1

Вы не проверять, если был загружен образ. – drescherjm

+4

В вашем вопросе нет ничего, что подсказывает потенциальную ошибку компилятора. У меня есть подлый взгляд, что «CImage» не нравится копировать по значению. Попробуйте объявить первый параметр 'locate()' как «CImage & img». –

+6

Если бы у меня был доллар за каждый раз, когда noob обвинял проблемы, которые у них возникали в ошибках компилятора, я мог уйти в отставку. – duffymo

ответ

0

Это прототип CImage::GetPixelAddress

void* GetPixelAddress(int x, int y); 

Он возвращает указатель. Если вы передадите его в массив символов, cout попытается напечатать строку. Так просто распечатать его как:

cout << img.GetPixelAddress(0, 0) << endl; 
//or 
void* p = img.GetPixelAddress(0, 0); 
cout << p << endl; 
//or 
printf("%p\n", p); 

или вы можете бросить в INT_PTR:

INT_PTR p = (INT_PTR)img.GetPixelAddress(0, 0); 
cout << std::hex << p << endl; 
Смежные вопросы