2016-04-27 8 views
2

私がしなければならないのは、.ptmファイルを使って画像を表示することです。glutSwapBuffers "アクセス違反の読み取り場所0x0000000004C0F000"

ファイルを開き、WとHを読み取り、RGBAを各ピクセルに設定します。しかし、表示しようとすると、私はglutSwapBuffers()にアクセス違反エラーが発生します。

ここにコードがあります。私はそれを修正するために多くの異なるものをしようとしているが、私は毎回私は新しい問題を作成することを考え始めていますので、それは混乱のようなものだ:D

Image.h

class Image { 
public: 
    Image() {}; 
    Image(int w, int h); 
    ~Image(); 
    void setPixel(int rgb, int x, int y) { 
     pixels[x + y] = rgb; 
    } 
    int setRgb(int r, int g, int b); 
    int setRgb(int r, int g, int b, int a); 
    int getPixel(int x, int y) { 
     return pixels[x + y*width]; 
    } 
    int * getPixel() { return pixels; } 
    int getWidth() { return width; } 
    int getHeight() { return height; } 
private: 
    int *pixels; 
    int width, height; 
}; 

Image.cpp

#include "Image.h" 
#include <stdlib.h> 


Image::Image(int w, int h) 
{ 
    width = w; height = h; 
    pixels = (int*)malloc(h*w); 
} 


Image::~Image() 
{ 
} 

int Image::setRgb(int r, int g, int b) 
{ 
    int rgb; 
    rgb = (r << 16) | (g << 8) | b; 
    return rgb; 
} 

int Image::setRgb(int r, int g, int b, int a) 
{ 
    int rgba; 
    rgba = (a<< 24) | (r << 16) | (g << 8) | b; 
    return rgba; 
} 

source.cpp

#include <GL\freeglut.h> 
#include <GL\GL.h> 
#include <iostream> 
#include <fstream> 
#include <string> 
#include <Windows.h> 
#include "Image.h" 

using namespace std; 

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 

    Image *img = new Image(800, 500); 
    int w, h, max; //width height MaxValue 
    char *w_ = new char; //in case of the file doesn't have a comment 
    string fileModel, comment; 
    ifstream myfile("dba.ptm"); //open the file 

    if (myfile.is_open()) 
    { 
     myfile >> fileModel; 
     if (fileModel == "P7") 
     { 
      myfile >> w_; 
      if (*w_ == '#') 
       getline(myfile, comment); 
      else 
       w = atoi(w_); 
      myfile >> h; 

      int a, r, g, b, rgba; 
      myfile >> max; 
      for (int i = 0; i < w; i++) 
      { 
       for (int k = 0; k < h; k++) 
       { 
        myfile >> a; 
        myfile >> r; 
        myfile >> g; 
        myfile >> b; 
        rgba = img->setRgb(r, g, b, a); 
        img->setPixel(rgba, i, k); 
       } 
      } 
     } 
    } 
    myfile.close(); 


    glDrawPixels(img->getWidth(), img->getHeight(), GL_BGRA_EXT, GL_UNSIGNED_BYTE, img->getPixel()); 
    glutSwapBuffers(); 
} 

void init(void) 
{ 

    glClearColor(0.0, 0.0, 0.0, 0.0); 
    glShadeModel(GL_FLAT); 
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 


    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0.0, 800.0, 0.0, 500.0, -1.0, 1.0); 
} 

int main(int argc, char** argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); 
    glutInitWindowSize(800, 500); 
    glutInitWindowPosition(100, 100); 
    glutCreateWindow("PTM"); 
    init(); 
    glutDisplayFunc(display); 
    glutMainLoop(); 
    return 0; 
} 
+1

なぜあなたは 'malloc()'をC++プログラムで使っていますか? – drescherjm

答えて

2

malloc(h*w)malloc(h*w*sizeof(int))、他のなければなりませんあなたのイメージの4分の1だけ十分なメモリを割り当てていることを賢明です。

また、イメージ全体が1フレームごとに漏れているように見えます。これにより、使用可能なRAMが急速に使い果たされます。 freedeleteには、それぞれmallocnewが必要です。

ピクセルの一部しか設定されていない問題を避けるため、画像に割り当てるメモリをすぐにクリアすることもできます(残りの部分はランダムな値になります)。これはmallocの後にmemsetまたはstd::fillで行うことができます。

3

申し訳ありませんが、あなたは間違ってLOTSを持っている... :)

  • あなたは(離れてpixelsから)多くの場合決してfreeまたはdelete
  • 代わりnew[]
  • のmalloc関数を使用していますあなたはとにかくヒープ上に物事を作成する必要はありません
  • これは明らかに間違っています
  • ..あなたがしていると思っていること、あるいはあなたがしたいことを絶対にしない。

おそらくもっとあります。 :(

関連する問題