2016-05-22 27 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; 
} 

これは私にランタイムエラーをもたらします。私はWindowsで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; 
} 

これはコンパイルされますが、上記のコードと基本的に同じです。 locate関数の部分を、実際に実行されるコードに置き換えます。これはコンパイラのバグですか?

+1

。 – drescherjm

+4

潜在的なコンパイラのバグを示唆するものは何もありません。私は、「CImage」が価値によってコピーされるのが好きではないという卑劣な気持ちを持っています。最初のパラメータを 'locate()'に 'CImage&img 'として宣言しようとしています。 –

+6

ノブが問題を責めたたびにドルを払えば、私は引退できるコンパイラのバグに遭っていました。 – 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; 
関連する問題