2016-03-31 1 views
-2

Donc, je vais faire ça très rapidement. Im essayant d'exécuter un code qui a fonctionné dans des blocs de code avant mais je veux vraiment le faire fonctionner dans le studio visuel pour des raisons personnelles. Ceci est l'erreur:Violation d'accès lors de l'utilisation de fopen pour écrire dans un fichier dans 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. 

Voici mon code:

#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 en utilisant la version winbgim de graphics.h. Im en utilisant gagner 10. têtes spéciales im en utilisant:

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

Si vous besoin d'autre chose me dire et je fournirai.

Comment puis-je résoudre ce problème?

Merci d'avance.

+3

'fopen ("map.txt", "w +");' 'il devrait être fp = fopen ("map.txt", "w +");' – DimChtz

Répondre

3

Vous essayez d'écrire à fp, lorsque vous avez ceci:

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

Il devrait plutôt être:

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

ou tout simplement:

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

De plus, vous devrait vérifier si le fichier est ouvert avant de commencer à écrire, si par exemple vous pouvez imprimer une erreur moi ssage et quitter votre fonction:

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

chier OH Pardon. Je n'ai pas remarqué ça. Ma faute. Pourquoi ai-je reçu autant de downvotes pour une erreur aussi simple? – MoustacheSpy

+3

@MoustacheSpy, -2 n'est rien. Une question «Fais mon devoir pour moi» va rapidement atteindre -20 ou plus. Notez également que les votes sont pour la qualité de la question, pas votre qualité ou la qualité de l'erreur. Votre problème aurait pu être réduit à un 'principal' qui aurait dupliqué' saveCurrentLevel' avec des données indésirables. L'une des parties les plus importantes du logiciel d'écriture est la capacité d'isoler un problème et de le réduire à un cas de test minimal et reproductible afin qu'il puisse être facilement examiné. Plus souvent qu'autrement, l'acte d'isoler le bug le révélera et vous fera gagner beaucoup de temps. Diviser et conquérir. – user4581301