VS2015

2016-03-31 24 views
-2

'daki bir dosyaya yazmak için fopen kullanıldığında Acess ihlali bunu çok çabuk yapacağım. Daha önce kod bloklarında çalışan bir kod çalıştırmaya çalışıyorum ama görsel stüdyonda kişisel nedenlerle çalışmak istiyorum. Bu hatadır:VS2015

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. 

Bu benim kodudur: graphics.h ait winbgim sürümünü kullanarak

#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++; 
    } 



} 

Im. Im 10. özel Başlıkları kullanarak kazanmak im kullanarak:

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

söyler ve ben sağlayacaktır başka bir şey gerekiyorsa.

Bunu nasıl düzeltebilirim?

Şimdiden teşekkürler. Sen varken, fp yazmaya çalışıyorsun

+3

'Fopen;' olması gerektiği 'FP = Fopen ("map.txt", "w +");' – DimChtz

cevap

3

bu:

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

olması gerektiği: sadece

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

ya:

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

Ayrıca, Yazmaya başlamadan önce dosyanın açık olup olmadığını kontrol etmeli, mesela bir hata yazdırabilirsiniz ssage ve çıkış için fonksiyon: ("+" w "map.txt")

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

OH bok afedersiniz. Bunu fark etmedim. Benim hatam. Yine de neden bu kadar basit bir hata için çok fazla downvot aldım? – MoustacheSpy

+3

@MoustacheSpy, -2 bir şeydir. Bir "Benim için ödevimi yap" sorusu, -20 ya da daha fazla hızlı bir şekilde rafa çıkacak. Ayrıca oylar, kalitenin ya da hatanın kalitesinin değil, sorunun kalitesi içindir. Sorununuz, önemsiz verilerle "saveCurrentLevel" kopyalanan bir "ana" ye indirgenmiş olabilir. Yazma yazılımının en önemli parçalarından biri, bir problemi izole etme ve minimal ve tekrarlanabilir bir test durumuna indirgeme yeteneğidir, böylece kolayca incelenebilir. Çoğu kez, böcekleri ayırma eylemi, onu açığa çıkaracak ve size çok zaman kazandıracaktır. Bölmek ve fethetmek. – user4581301

İlgili konular