2016-03-31 15 views
-2

これをすばやく実行します。私は前にコードブロックで動作していたコードを実行しようとしていますが、私は本当にそれを個人的な理由でVisual Studioで動作させたいと思っています。 これはエラーです:graphics.hのwinbgimバージョンを使用してfopenを使用してVS2015のファイルに書き込むときにアクセス違反が発生する

#include "graphics.h" 
//#include <Windows.h> 
#include <math.h> 
#include <stdio.h> 

void drawGridOnX(int xtotal, int ytotal); 
int levelcode[400][45][1]; 
void decodelevelAndDraw(int minx,int maxx); 
void saveCurrentLevel(); 

void main() { 
    initwindow(1600, 900,"Testscreen",0,0,true,true); 
    int x=0,y=0,xmin=0,xmax=23,cellx,celly,cellSize=70, xtotal = 0, ytotal = 0,counter=0; 
    // gridposx = 0, gridposy = 0, diffx = 0, diffy = 0, distanceFromMouse = 40, titlenumberx = 0, titlenumbery = 0, 

    while (1) { 
     setbkcolor(9); 
     cleardevice(); 
     ytotal = 0; 
     /*diffx = mousex() - gridposx; 
     while (gridposx < mousex()&&diffx>=70) { 
      gridposx += 70; 

     } 
     while (gridposx > mousex()&&diffx<=-70 + distanceFromMouse) { 
      gridposx =gridposx-70; 

     } 
     diffy = mousey() - gridposy; 
     while (gridposy < mousey() && diffy >= 70) { 
      gridposy += 70; 

     } 
     while (gridposy > mousey() && diffy <= -70+distanceFromMouse) { 
      gridposy = gridposy - 70; 

     } 
     */ 
     cellx = std::floor(mousex()/cellSize); 
     celly = std::floor(mousey()/cellSize); 
     while (ytotal < 900) { 
      drawGridOnX(xtotal, ytotal); 
      ytotal += 70; 
     } 

     if(GetAsyncKeyState(VK_RETURN)){ 
      saveCurrentLevel(); 

     }else if (ismouseclick(WM_LBUTTONDOWN)) { 
       if (ismouseclick(WM_LBUTTONUP)) { 

        getmouseclick(WM_LBUTTONUP, x, y); 
        getmouseclick(WM_LBUTTONDOWN, x, y); 
       } 
       //cellx = gridposx/70; 
       //celly = gridposy/70; 
       cellx += xmin; 
       levelcode[cellx][celly][0]=1; 
       //printf("CLICK"); 
      }else if (ismouseclick(WM_RBUTTONDOWN)) { 
        if (ismouseclick(WM_RBUTTONUP)) { 

         getmouseclick(WM_RBUTTONUP, x, y); 
         getmouseclick(WM_RBUTTONDOWN, x, y); 
        } 
        //cellx = gridposx/70; 
        //celly = gridposy/70; 
        cellx += xmin; 
        levelcode[cellx][celly][0] = 0; 
        //printf("CLICK"); 
       }else if (GetAsyncKeyState(0x27)) { 
         //printf("RIGHT\n\n\n\n"); 
         Sleep(100); 
         xmin++; 
         xmax++; 
        }else if (GetAsyncKeyState(0x25)&&xmin!=0) { 
         //printf("RIGHT\n\n\n\n"); 
         Sleep(100); 
         xmin--; 
         xmax--; 
       } 
     decodelevelAndDraw(xmin,xmax); 
     readimagefile("question_blueprint.jpg", cellx*70,celly*70, 70+cellx*70, 70+celly*70); 
     //settextstyle(SANS_SERIF_FONT,1); 
     settextstyle(SANS_SERIF_FONT, HORIZ_DIR, 1); 
     outtextxy(0, 0, "Press Enter to save"); 
     //printf("gridposx:%d\tgridposy:%d\ttitlenumberx:%d\ttitlenumbery%d",gridposx,gridposy,gridposx/70,gridposy/70); 
     swapbuffers(); 

    } 
} 


void drawGridOnX(int xtotal, int ytotal) { 
    while (xtotal < 1600) { 
     rectangle(xtotal, ytotal, 70 + xtotal, 70+ytotal); 
     xtotal += 70; 

    } 


} 


void decodelevelAndDraw(int minx,int maxx) { 
    int x = 0, y = 0; 
    while (y != 13) { 
     while (x != maxx) { 
      if (levelcode[x][y][0] == 1) { 
       //x -= minx; 
       readimagefile("question.jpg", x*70-minx*70, y*70, 70 + x*70-minx*70, 70 + y*70); 
       //printf("Block added at %d;%d", x * 70, y * 70); 
      } 
      x++; 
     } 
     x = 0; 
     y++; 
    } 
} 


void saveCurrentLevel() { 
    int x = 0, y = 0, z = 0; 
    FILE *fp; 
    fopen("map.txt","w+"); 
    while (y < 13) { 


     while (x < 400) { 
      fprintf(fp, "%d ", levelcode[x][y][z]); 
      x++; 
     } 
     printf("\n"); 
     x = 0; 

     y++; 
    } 



} 

イム:

Exception thrown at 0x77EB9F83 (ntdll.dll) in bgi.exe: 0xC0000005: Access violation writing location 0x73EC21E0. 

If there is a handler for this exception, the program may be safely continued. 

これは私のコードです。あなたが私に言うと、私が提供する何かが必要な場合は

dibutil.h 
graphics.h 
winbgi.h 
wingim.h 
winbgitypes.h 

を:10. 特別なヘッダを勝ち取る使用 Imが使用してイム。

どうすればこの問題を解決できますか?

ありがとうございます。

+3

'のはfopen( "map.txt"、 "+ W");'それは 'のFP =ののfopen( "map.txt"、 "W +")である必要があります。' – DimChtz

答えて

3

あなたは「再あなたがこれを持っているとき、fpへの書き込みしようとしている:

FILE *fp; 
fopen("map.txt","w+"); 

代わりに、それは次のようになります。

FILE *fp; 
fp = fopen("map.txt","w+"); 

か、単に:

FILE *fp = fopen("map.txt","w+"); 

さらに、あなたはファイルに書き込みを開始する前にファイルが開いているかどうかをチェックする必要があります。たとえば、エラーが表示されない場合はssageとあなたの関数を終了:

if (fp == NULL) { 
    printf ("File is not open\n"); 
    return; 
} 
+0

OHたわごとごめんなさい。私は気付かなかった。私の悪い。それでも私はそんなに単純な間違いのために非常に多くのダウンボントを得ましたか? – MoustacheSpy

+3

@MoustacheSpy、-2は何もありません。 「私の宿題をしてください」という質問はすぐに-20以上になるでしょう。投票は質問の質であり、あなたの質や間違いの質ではありません。あなたの問題は、 'saveCurrentLevel'を迷惑データと重複させた' main'にまで減らすことができました。ソフトウェアを書く上で最も重要な部分の1つは、問題を分離して最小限かつ繰り返し可能なテストケースに減らして簡単に検査できるようにすることです。多くの場合、バグを隔離する行為はそれを明らかにし、あなたに多くの時間を節約します。分割統治。 – user4581301

関連する問題